我正在使用轻型线程运行并行算法,我想知道当系统提供多个内核和多个芯片时,如何将这些分配给不同的内核。在芯片上的所有内核都耗尽之前,是否将线程分配给单个芯片?是否将线程分配给不同芯片上的内核,以便更好地在芯片之间分配工作?
答案 0 :(得分:3)
您没有说明您使用的操作系统,但在Linux中,根据该核心的负载将线程分配给核心。准备运行的线程将被分配给负载最低的核心,除非您通过设置线程关联性另行指定。您可以使用sched_setaffinity()
执行此操作。有关更多详细信息,请参见手册页。一般来说,正如meyes1979所说,这是由你正在使用的操作系统中实现的调度程序决定的。
根据您使用的Linux版本,有两篇文章可能会有所帮助:this article describes early 2.6 kernels, up through 2.6.22和this article describes kernels newer than 2.6.23。
答案 1 :(得分:0)
不同的线程库以不同方式执行线程操作。 Linux中的“标准”现在是NPTL,它将线程安排在与进程相同的级别。这很好,因为Linux上的进程创建很快,并且总是保持快速。
Linux内核试图通过执行进程和线程来提供非常强大的CPU亲和力,以提高缓存命中率与缓存未命中率 - 如果任务总是在同一核心上执行,则更有可能预先填充缓存线。
这通常是一件好事,但我注意到内核可能并不总是将任务从忙碌核心迁移到空闲核心。这种行为可能会因版本而异,但我发现多个CPU绑定任务都在一个核心上运行,而另外三个核心处于空闲状态。 (我发现它注意到一个核心比其他三个核心温度高6到7摄氏度。)
总的来说,正确的事情应该发生;但是当内核没有自动将任务迁移到其他处理器时,您可以使用taskset(1)
命令限制程序允许的处理器,或者您可以修改程序以使用pthread_setaffinity_np(3)
函数来请求单个线程要迁移。 (这可能是内部应用程序的最佳选择 - 您的一个用户可能不希望您的程序使用所有可用内核。如果您确实选择在程序中包含对此功能的调用,请确保它可以通过配置文件进行配置,以提供类似于taskset(1)
程序的功能。)