Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 当存在多个套接字时,Linux操作系统如何调度线程_C_Linux_Gcc_Numa - Fatal编程技术网

C 当存在多个套接字时,Linux操作系统如何调度线程

C 当存在多个套接字时,Linux操作系统如何调度线程,c,linux,gcc,numa,C,Linux,Gcc,Numa,例如,在具有两个四核处理器的双套接字系统中,线程调度程序是否尝试将来自同一处理器中相同进程的线程保持在同一处理器中?因为在一个进程中的线程具有大量共享内存访问的情况下,在不同处理器中交错不同进程的线程会降低性能。这取决于此 在当前的英特尔平台上,BIOS默认设置似乎是系统中的内存在套接字之间逐页交错。分配1字节,一半在一个套接字上,一半在另一个套接字上。这意味着无论线程在哪里,它们都可以平等地访问数据 这使得操作系统变得非常简单——任何地方都可以 这可能对你不利。呈现给操作系统的SMP硬件环境是

例如,在具有两个四核处理器的双套接字系统中,线程调度程序是否尝试将来自同一处理器中相同进程的线程保持在同一处理器中?因为在一个进程中的线程具有大量共享内存访问的情况下,在不同处理器中交错不同进程的线程会降低性能。

这取决于此

在当前的英特尔平台上,BIOS默认设置似乎是系统中的内存在套接字之间逐页交错。分配1字节,一半在一个套接字上,一半在另一个套接字上。这意味着无论线程在哪里,它们都可以平等地访问数据

这使得操作系统变得非常简单——任何地方都可以

这可能对你不利。呈现给操作系统的SMP硬件环境是由CPU通过QPI协作合成的。如果有很多线程都在访问相同的数据,那么这些链接就会变得非常繁忙。如果他们太忙,则会限制性能,并且您将受到I/O限制。那就是我现在所在的地方;采用英特尔内存子系统设计的Z80内核将与我实际拥有的nahelem内核一样快(好吧,我可能有点夸张…)

归根结底,真正的问题是记忆速度不够快。英特尔和AMD最近在内存方面都做了一些令人印象深刻的事情,但我们仍然受到其速度缓慢的阻碍。理想情况下,内存应该足够快,以便所有内核都有时钟速率的访问时间。Cell处理器就是这样做的——每个SPE都有一点SRAM,而不是缓存,一旦你了解了它们,你就可以让它们真正歌唱起来

==编辑===

还有更多。正如Basile Starynkevitch暗示的那样,另一种方法是拥抱NUMA

NUMA是现代CPU的实际体现,内存访问是非统一的,因为其他CPU插槽上的内存无法通过寻址总线直接访问。相反,CPU通过QPI链路(或AMD的超级传输)请求数据,要求另一个CPU从其内存中取出数据并发送回。因为CPU在硬件上为您完成了所有这些,所以它看起来就像是传统的SMP环境。QPI/超级传输速度非常快,因此大多数情况下都足够快

如果您编写代码是为了反映硬件的体系结构,那么理论上您可以进行改进。因此,这可能涉及(例如)在系统中有两个数据副本,每个套接字上有一个。Linux中有内存关联例程专门以这种方式分配内存,而不是在所有套接字之间交错分配内存。还有一些CPU关联例程,允许您控制线程运行在哪个CPU内核上,其思想是您在靠近它将要处理的数据缓冲区的内核上运行它

好的,这可能意味着要在源代码上进行大量投资,以使其适合您(特别是如果数据复制与程序流程不匹配),但如果QPI已经成为一个有问题的瓶颈,那么这是您唯一可以做的事情

在某种程度上,我对这件事做了手脚。从某种程度上说,这是一个正确的faff。Intel和AMD(以及操作系统和库)的整体理念是为您提供一个SMP环境,在大多数情况下,这是非常好的。不过,它们让您可以通过调用大量库函数来使用NUMA,以获得所需的线程和内存的部署

然而,对于需要一点点额外速度的边缘情况,如果架构和操作系统严格使用NUMA,而根本不使用SMP,那么就更容易了。就像细胞处理器一样。更容易,不是因为它写起来简单(事实上会更难),而是如果你让它运行起来,你就会确信它是硬件可能达到的最快速度。我们现在用的是假的SMP,你可以用NUMA做实验,但是你大部分时间都在想它是否尽可能快。这不像库告诉你你正在访问另一个套接字上的内存,它们只是让你这样做,而不暗示有改进的余地。

这取决于你

在当前的英特尔平台上,BIOS默认设置似乎是系统中的内存在套接字之间逐页交错。分配1字节,一半在一个套接字上,一半在另一个套接字上。这意味着无论线程在哪里,它们都可以平等地访问数据

这使得操作系统变得非常简单——任何地方都可以

这可能对你不利。呈现给操作系统的SMP硬件环境是由CPU通过QPI协作合成的。如果有很多线程都在访问相同的数据,那么这些链接就会变得非常繁忙。如果他们太忙,则会限制性能,并且您将受到I/O限制。那就是我现在所在的地方;采用英特尔内存子系统设计的Z80内核将与我实际拥有的nahelem内核一样快(好吧,我可能有点夸张…)

归根结底,真正的问题是记忆速度不够快。英特尔和AMD最近在内存方面都做了一些令人印象深刻的事情,但我们仍然受到其速度缓慢的阻碍。理想情况下,内存应该足够快,以便所有内核都有时钟速率的访问时间。Cell处理器就是这样做的——每个SPE都有一点SRAM,而不是缓存,一旦你了解了它们,你就可以让它们真正歌唱起来

==编辑===

还有更多。正如Basile Starynkevitch暗示的那样,另一种方法是拥抱NUMA

NUMA是现代CPU的实际体现,内存访问是非统一的,因为其他CPU插槽上的内存无法通过寻址总线直接访问。相反,CPU通过QPI链路(或AMD的超级传输)请求数据,要求另一个CPU从其内存中取出数据并发送回。因为CPU在h中为你做所有这些