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

时间:2016-03-06 06:25:24

标签: multithreading parallel-processing operating-system cpu multicore

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

  1. 如果我有单线程代码(顺序),我在多核处理器上运行它。操作系统是否会尝试将线程划分为多个线程(同时处理依赖关系)以利用多核处理器?
  2. 如果我有一个多线程代码,我在单核处理器上运行它。操作系统是否会在不同线程之间进行分时(与多个进程相同)?

2 个答案:

答案 0 :(得分:3)

1)否

如果某个应用程序使用了例如英特尔数学库并且已使用正确的开关进行编译,则FFT之类的例程将在运行时分割成与机器中核心数相匹配的单独线程。您的源代码仍然是“单线程”,但是库正在创建并销毁背后的线程。

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

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

开发了这样的库和编译器技巧,以便程序员可以轻松地从单个'中提取更高的性能。线程代码。英特尔开始向他们的数学库添加这样的功能,大约在他们开始转向多核CPU的同时。我们的想法是(从程序员的角度来看)创造出更好的单一'线程性能,而速度实际上是由多个核心提供的。与Sun一样,当他们开始做多处理器计算机时。

随着每个人或多或少地放弃对单个核心的性能进行重大改进,这是未来的唯一方法。

2)是的。怎么会这样呢?

答案 1 :(得分:1)

  1. 不,操作系统没有足够的信息来做到这一点。在并行化中,您需要考虑操作之间的依赖关系。有些编译器试图这样做,他们有更多关于代码意图的信息。但即使他们经常无法有效地做到这一点。

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