2

假设我有以下 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 上的“结束”之前?谢谢。

4

1 回答 1

3

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

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

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

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

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

于 2013-02-06T08:23:01.557 回答