我可以以编程方式选择我的线程应运行的多核CPU的哪个核心?

时间:2009-12-06 08:03:35

标签: linux

还是由操作系统控制?我听说谷歌的新Go语言有一个内置的功能,让程序员可以细化,或者我理解错了?

3 个答案:

答案 0 :(得分:3)

由操作系统决定。

您可以使用pthread_attr_setaffinity_np()为其设置提示。

但是操作系统可以覆盖你。上面的调用仅是您的程序对操作系统的建议。

至于Go,我还没有使用过它,甚至没有深入研究它,但我对Go的理解是很多并行性是相当隐含的。你有共同的惯例(他们说“go-routines”,非常麻烦)和他们之间的沟通。似乎CPU亲和力和线程本身的概念是独立的。也就是说,语言运行时甚至可以决定在1个CPU上完成所有操作,如果它决定最好......但是我再次提醒我,我没有太深入地看待它,所以我可能错了。 : - )

答案 1 :(得分:2)

对于linux操作系统, sched_setaffinity 是您的答案。它得到了linux kernel 2.5.8的支持。

名称

sched_setaffinity,sched_getaffinity - 设置并获取进程的CPU关联掩码

#define _GNU_SOURCE
#include <sched.h>

int sched_setaffinity(  pid_t pid,
    size_t cpusetsize,
    cpu_set_t *mask);

int sched_getaffinity(  pid_t pid,
    size_t cpusetsize,
    cpu_set_t *mask);
  

亲和力掩码实际上是一个   可以是每线程属性   为每个人独立调整   线程组中的线程。价值   从gettid(2)的电话回来可以   在参数pid中传递。   将pid指定为0将设置   调用线程的属性,和   传递呼叫返回的值   to getpid(2)将设置属性   对于线程的主线程   组。 (如果您使用的是POSIX   线程API,然后使用   pthread_setaffinity_np(3)而不是   了sched_setaffinity()。)

答案 2 :(得分:2)

答案是肯定的,您可以通过编程方式选择运行进程的核心。正如arsane所提到的,答案在于sched_set_affinity(),然后是pthread_setaffinity_np()用于pthreads。

以下是关于如何使用流程执行此操作的nifty tutorial(来自对this问题的回答。)

基本上,这是使用位掩码完成的。这意味着有一个整数(比如32位),如果第一位== 1,则允许该进程在处理器1上运行。如果第二位== 1,则允许该进程运行处理器2.等。

因此,默认情况下,affinity bitmask = 1 ... 111(32次。)这意味着“进程可以在处理器1,2,3,...,32上运行”。当然,如果你只有2个核心,那么额外的30位将不适用。

但是,如果将该位掩码设置为:0 ... 010,则只允许“处理器2”执行该过程。

这也解释了为什么linux支持的maximum number处理器为32(开箱即用,没有调整,x86,在很多常见的硬件上,没有集群等等)。