任何程序都可以在多核上运行吗?CPU 会决定吗?还是只有某些程序可以在多核上运行?

任何程序都可以在多核上运行吗?CPU 会决定吗?还是只有某些程序可以在多核上运行?

因此,我对多核 CPU 有点困惑 - 我最初的印象和我以前听到的印象是,有些程序无法跨多个核心运行 - 例如,另一个循环的输入取决于先前的输出

另一方面,我看到其他人声称似乎任何程序都可以在多个核心上运行(这是否必须由程序员指定(例如,通过分配线程),或者 CPU 是否能够在核心之间分配密集型程序?)

但与此同时,我也听别人说过,一个进程只能在一个核心上运行

我希望有人能澄清这一点,或者为我应该去哪里寻找提供一些建议。我觉得我读到的内容——如果不是错误的——可能至少已经过时了,或者可能因处理器型号等而异

不过,提前感谢你的帮助

答案1

这在很大程度上取决于程序。

我熟悉的一些常见编程语言(例如 C、C++)默认为单线程,需要明确的步骤才能使程序能够在多个内核/CPU 上运行。

我相信其他编程语言的编写方式使得它们默认易于并行化(可以在多个内核/CPU 上运行)。

您可以在多核系统上同时运行单线程程序的多个迭代,每个迭代在不同的核心上运行,但这并不意味着它是多线程的。它不会加快任何速度,例如同时多次加密单个文件。您最终只会得到相同数据的多个副本。

如果您想对多个不同的输入执行相同的操作,那么这样做可能很有意义,这肯定是利用多个 CPU/核心来提高性能。各个迭代仍然是单线程的,但由于它们完全独立,因此您可以一次运行任意数量的迭代。

您对并行性的某些限制的看法是正确的。对于依赖于前一步输出的每个步骤,您必须按顺序运行这两个步骤。您可能可以创建一个使用多个线程的程序来实现这一点,但这不会带来任何性能提升,因此通常没有必要付出额外的努力。

另一件值得注意的事情是,单核通常一次只能运行一个进程/线程(超线程是这条规则的一个巧妙延伸)。这是因为单线程需要核心维护上下文,当线程开始执行时,上下文会被交换进来,而当执行切换到新线程时,上下文会被交换出去。这与您上面所说的相反的情况不同。

相关内容