OpenMP尝试尽可能均匀地在核心之间分散线程,但这是如何工作的?
最终,操作系统决定如何传播它们。 OpenMP是否仅建议操作系统执行此操作(类似于在C中使用likely
宏或register
关键字。)
如果我们在具有num_threads
核心的计算机上运行num_cores
个线程的作业,其中没有一个当前正在使用,假设线程将被展开是公平的平均地跨所有核心(假设num_threads <= num_cores
,你有纯粹的并行性),因为操作系统应该以我们的最佳利益工作并且很好地分散负载。
我看到强缩放的图形,其中x轴是#core。那么我们是否假设他们用于运行作业的最大线程数是&lt; =核心数以及核心相对空闲?
或者所有这一切都是有争议的。
答案 0 :(得分:1)
在机器的核心和/或硬件线程上调度OpenMP线程主要是操作系统的责任。它将根据自己的启发式方法决定何时何地开始/停止/迁移它们......
但是,OpenMP为您提供了一些工具来指导/限制操作系统做出决策时的选择范围。例如,您可以访问:
OMP_NUM_THREADS
环境变量,num_threads
子句,omp_set_num_threads()
函数OMP_PLACES
环境变量。OMP_PROC_BIND
环境变量,proc_bind
子句。通过这种方式,您可以通过某种程度的控制来控制操作系统的决策,但最终,它仍然可以控制实际的调度。它所采取的决策并不总是您所想的(特别是当您不使用放置或绑定时),因为它应用的机器工作负载和全局调度策略可能会干扰您认为对您的代码最佳的内容。例如,在NUMA(非统一内存访问)机器上,诸如各个节点上使用的内存以及哪个内存段属于哪个进程的考虑因素可能会阻止线程看似均匀地扩散到芯片上,从而导致CPU本地争用...