单核处理器的多线程代码和多核处理器的单线程代码

Multi-thread code with single-core processor and single-thread code with multi-core processor

我是多线程编程的新手。我一直在阅读一些文章,但我对两个要点不太确定。

  1. 如果我有一个单线程代码(顺序),我 运行 它在多核处理器上。 OS 会尝试 将线程 分成多个线程(同时处理依赖关系)以利用多核处理器吗?
  2. 如果我有一个多线程代码,我 运行 它在单核处理器上。 OS 是否会在不同线程之间实现 分时 (与多进程的方式相同)?
  1. 不,操作系统没有足够的信息来执行此操作。在并行化中,您需要考虑操作之间的依赖关系。一些编译器试图这样做,他们有更多关于代码意图的信息。但即使是他们也常常无法有效地做到这一点。

  2. 是的,例如 Linux 调度程序 does not even distinguish between threads and processes

1) 否

如果某个应用程序使用了英特尔数学库,并且已使用正确的开关进行编译,则 FFT 等例程将在运行时拆分为与机器中内核数量相匹配的单独线程。您的源代码仍然是 'single threaded',但该库正在您背后创建和销毁线程。

类似地,一些编译器(e.h。Intel 的 icc,Sun 的 C 编译器)可能会将一些循环变成单独的线程,每个循环处理一部分迭代。同样,源代码看起来是单线程的,但编译器会为您生成线程代码。这有点像自动将一些 OpenMP 应用到您的源代码。

操作系统无法猜测应用程序将要做什么,因此他们无法像这样进行干预。图书馆和编译器知道将要发生什么,所以他们可以。

已经开发了这样的库和编译器技巧,以便程序员可以轻松地从 'single' 线程代码中提取更高的性能。大约在他们开始转向多核 CPU 的同时,英特尔开始将类似的功能添加到他们的数学库中。这个想法是为了(从程序员的角度)创造更好的 'single' 线程性能的印象,而速度实际上是由多核提供的。 Sun 开始做多处理器计算机时也是如此。

随着大家或多或少地放弃对单核性能的重大改进,这是唯一的出路。

2) 是的。否则它会怎么做?