Algorithm 非均匀内存访问时间下的线程调度

Algorithm 非均匀内存访问时间下的线程调度,algorithm,operating-system,cpu-architecture,Algorithm,Operating System,Cpu Architecture,这些细节显然取决于操作系统,但我正在寻找用于为物理内核分配线程的算法(即,访问不同的地址需要不同的时间。例如,这可能是因为缓存被划分为物理分布的片,每个片放置在不同的位置,因此每个片的访问时间根据与核心的距离而不同) 显然,调度程序还考虑了许多其他变量,如已分配给处理器的线程数,但我特别寻找的调度算法主要是尽量减少NUMA体系结构中的内存访问时间。我不能说我是这方面的专家-我不是-但到目前为止不是另外一个似乎急于回答,所以我会尽我最大的努力 假设在NUMA系统上,尽可能长时间地在同一个内核上运行

这些细节显然取决于操作系统,但我正在寻找用于为物理内核分配线程的算法(即,访问不同的地址需要不同的时间。例如,这可能是因为缓存被划分为物理分布的片,每个片放置在不同的位置,因此每个片的访问时间根据与核心的距离而不同)


显然,调度程序还考虑了许多其他变量,如已分配给处理器的线程数,但我特别寻找的调度算法主要是尽量减少NUMA体系结构中的内存访问时间。

我不能说我是这方面的专家-我不是-但到目前为止不是另外一个似乎急于回答,所以我会尽我最大的努力

假设在NUMA系统上,尽可能长时间地在同一个内核上运行线程是有益的,这将是有意义的。这本质上意味着一种弱形式的,调度程序决定线程应该在哪个内核上运行,并可能动态地更改它

具有处理器亲缘关系的基本调度非常容易实现:您只需采用现有的调度算法,并对其进行修改,使每个核心都有自己的线程队列(或多个队列).在NUMA系统上,剩下的问题是确定何时将线程迁移到另一个核心上是有益的;我认为不可能给出一个普遍适用的算法,因为好处和成本在很大程度上取决于所讨论系统的具体情况


请注意,调度器需要的处理器关联性是弱的和自动的:线程被固定到哪个核心完全取决于调度器,并且在调度器认为有益的时候可能会改变。这与Linux调度器中的处理器关联性形成了鲜明对比,例如,在Linux调度器中,处理器关联性很难实现(线程不能在没有关联的核心上运行)并由用户手动管理(请参阅和)

OP询问调度算法,这些算法不需要用处理器关联调用手动将线程连接到内核。也就是说,考虑进程的工作集中哪一个套接字的DRAM已经存在,并基于此创建弱的亲和力。BTW,Linux的调度器,我认为严格遵循亲和力。让其他内核保持未使用状态,即使这意味着为同一个内核设置了多个具有亲和力的任务都在竞争它,并花费大量时间睡眠。请使用
time taskset-c 1 awk'BEGIN{for(i=0;i@PeterCordes我的意思是,让一个线程尽可能长时间地运行在同一个内核上可能是最佳的,而且这种特性已经存在于主流调度器中。OP所要求的调度器基本上是一种调度器,它在内部用一种略为复杂的算法来管理处理器相关性通常;我认为不可能给出比这更普遍适用的答案,因为其他答案高度依赖于系统。不过,我想我可以澄清我的答案,以便更好地区分手动和“自动”CPU的亲和力。你的答案类型暗示Linux调度器的亲和力支持是你想要的:偏向于不迁移。这不是事实。Linux亲和力意味着一个核心永远不会考虑运行一个进程,它的亲和屏蔽不包括那个核心的比特。所以它只是一个硬的过滤器,而不是偏见。您可能希望使用NUMA感知的调度程序,在某个地方运行通常比长时间等待原始核心要好。@PeterCordes很公平。我将重新制定我的答案。此外,请随意以任何您认为合适的方式编辑它-您显然比我对该主题更了解。顺便说一句,NUMA缓存就像您提到的一样(例如,类似于Ryzen core集群,每个集群都有自己的L3)与NUMA DRAM(多插槽系统的相同插槽与不同插槽)有些不同如果迁移任务并使其在另一个内核上长时间运行,则缓存将自行进行排序。除非操作系统将物理页复制到连接到另一个套接字的DRAM并更新该进程的页表,否则DRAM不会进行排序。也就是说,将内存迁移到进程需要软件干预。(IDK,如果任何主流操作系统确实尝试为一个进程整合页面。)