如何在多核处理器上编程线程分配?


13

我想试验多核处理器上的线程,例如创建一个程序,该程序使用由两个不同处理器内核执行的两个不同线程。

但是,我不清楚线程在哪个级别分配给不同的内核。我可以想象以下情形(取决于操作系统和编程语言的实现):

  1. 线程分配由操作系统管理。线程是使用OS系统调用创建的,如果进程恰巧在多核处理器上运行,则OS会自动尝试在不同的内核上分配/调度不同的线程。
  2. 线程分配由编程语言实现管理。将线程分配给不同的内核需要特殊的系统调用,但是当我使用该语言的标准线程实现时,编程语言标准线程库会自动处理该问题。
  3. 线程分配必须明确编程。在我的程序中,我必须编写明确的代码来检测有多少个内核可用,并使用例如库函数将不同的线程分配给不同的内核。

为了使问题更具体,假设我已经在Windows或Linux上用Java或C ++编写了多线程应用程序。在多核处理器上运行时,我的应用程序会神奇地看到并使用多个内核吗(因为所有内容都由操作系统或标准线程库管理),还是我必须修改代码以了解多个内核?

Answers:


11

在多核处理器上运行时,我的应用程序会神奇地看到并使用多个内核吗(因为所有内容都由操作系统或标准线程库管理),还是我必须修改代码以了解多个内核?

简单的答案:是的,它通常由操作系统或线程库管理。

操作系统中的线程子系统将优先级将线程分配给处理器(您的选项1)。换句话说,当线程完成执行其时间分配或阻塞时,调度程序将查找下一个优先级最高的线程,并将其分配给CPU。细节因操作系统而异。

也就是说,存在选项2(由编程语言管理)和选项3(明确地)。例如,.Net的最新版本中的Tasks库和async / await为开发人员提供了一种更容易的方式来编写可并行化(即可以与自身并发运行)的代码。函数式编程语言具有与生俱来的可并行性,如果可能,某些运行时将并行运行程序的不同部分。

对于选项3(显式),Windows允许您设置线程关联(指定线程可以在哪些处理器上运行)。但是,除了最快的,响应时间至关重要的系统之外,在所有其他系统中通常都不需要这样做。有效的线程到处理器分配高度依赖于硬件,并且对同时运行的其他应用程序非常敏感。

如果要进行实验,请创建一个长期运行且占用大量CPU的任务,例如生成素数列表或创建Mandelbrot集。现在,在您喜欢的库中创建两个线程,并在多处理器计算机上运行这两个线程(换句话说,几乎是最近几年发布的任何东西)。这两个任务应大致同时完成,因为它们是并行运行的。


感谢您的解释(+1)。我的测试程序是一个合并排序实现。在拆分阶段,只要有可用的内核,我想创建不同的线程。例如,具有两个内核,则阵列的每个一半将按不同的线程/内核进行排序。在合并期间,多余的线程将随后被加入/终止。
Giorgio

如果数据是随机分布的,则排序很难以这种方式并行化。是的,您可以将其分解,然后在不同的线程中对每个部分进行排序,但是无论如何,您最终都必须将所有部分合并在一起。如果线程共享数据结构,则可能还会出现争用或锁定问题。我并不是说排序不能从线程中受益,但这不会带来线性的性能改进。
akton 2013年

数组的两半可以独立排序,因为没有数据共享。只有第一个拆分和最后一个合并将必须由一个线程操作包含数据的整个数组或列表来执行。这意味着不能并行执行一次完整的数据扫描。其余所有扫描都可以。
乔治(Giorgio)

当然,我也认为您的榜样是不错的选择。目前,我对合并排序更为熟悉(并且我已经实现了它的非并行版本),这(可能)使合并排序更适合我。
Giorgio

2
我要补充一下这个答案,那就是好的操作系统足够聪明,可以平衡在不同CPU或内核上为任务分配时间片的成本与短期饥饿之间的成本。在重要的体系结构上,结果往往类似于自动魔术亲和力。该操作系统是围绕使所有作业尽快运行而构建的,您可能通过将线程绑定到核心并限制其做出这些决定的能力而陷入困境。
Blrfl 2013年

-1

我曾经有一个巨大的SGI IRIX环境。只是为了简单起见,我编写了一个小的多线程Java程序(除了消耗CPU周期外什么也不做),并在其中创建了12个线程。这项工作跨越了NUMA架构中的12个CPU。可能是我会查找程序并在Dell R910s上运行它并检查..


3
这个答案实际上并没有为现有答案增加太多。也许如果您详细说明了SGI系统上的JVM为什么将线程分配给核心...
Jay Elston,2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.