c-用于区域线程亲和性的OpenMP并行



假设我有以下OpenMP区域:

omp_set_num_threads(3);
#pragma omp parallel for
{
 //start
 ...
 //somewhere in the middle
 ...
 //end
}

假设我有8核系统。例如,在"启动"之后,假设线程0在核心4上运行,线程1在核心5上运行,而线程2在核心6上运行。在"结束"之前,线程是否可能从它们在"开始"之后分配的各自核心迁移到"中间的某个地方"?也就是说,线程0-2是否可能在"开始"后被分配给核心4-5,而"中间的某个地方"线程则分别迁移到核心5-7?线程是否有可能就在核心0-2的"结束"之前驻留?谢谢

据我所知,OpenMP 3.1规范没有提供任何重新绑定线程的方法。

事实上,控制线程绑定的唯一方法是通过OMP_PROC_BIND环境变量:

OMP_PROC_BIND环境变量设置全局绑定变量ICV的值。此环境变量的值必须为truefalse。如果环境变量设置为true,则执行环境不应在处理器之间移动OpenMP线程。如果环境变量设置为false,则执行环境可能会在处理器之间移动OpenMP线程。如果OMP_PROC_BIND的值既不是true也不是false,则程序的行为由实现定义。

OpenMP 4.0草案扩展了OMP_PROC_BIND的可能值,并添加了OMP_PLACES环境变量,该变量允许选择线程如何绑定到资源。尽管如此,仍然没有重新绑定线程的标准方法。

如果这种行为对您来说是绝对必要的,您可以考虑使用hwloc库,特别是CPU绑定部分。

最新更新