是否可以控制用于在 C++ 中执行 openmp 任务的 Openmp 线程?

Is it possible to control the Openmp thread that is used to execute an openmp task in C++?

是否可以控制用于执行特定任务的 openmp 线程? 换句话说,我们有以下三个任务:

#pragma omp parallel
#pragma omp single 
{
#pragma omp task
    block1();
#pragma omp task
    block2();
#pragma omp task
    block3();
}

是否可以控制 openmp 调度程序选择执行这三个任务中的每一个任务的 openmp 线程集?我的想法是,如果我使用 openmp 的线程关联机制将 openmp 线程绑定到特定的 numa 节点,我想确保每个任务都由适当的 numa 节点核心执行。这在 Openmp 4.5 中可能吗?在 openmp 5.0 中可以吗?

在某种意义上,这可以使用随 OpenMP API 5.0 版引入的 affinity 子句来实现。你可以做的是:

float * a = ...
float * b = ...
float * c = ...

#pragma omp parallel
#pragma omp single 
{
#pragma omp task affinity(a)
    block1();
#pragma omp task affinity(b)
    block2();
#pragma omp task affinity(c)
    block3();
}

然后,OpenMP 实现将确定 a、b 和 c 的数据分配到何处(因此,在系统的哪个 NUMA 域中)并安排相应的任务在该 NUMA 域中的线程上执行。请注意,这只是对 OpenMP 实现的提示,它可以忽略 affinity 子句并仍然在不靠近数据的不同线程上执行。

当然,您必须使用已经支持 affinity 子句的 OpenMP 实现,并且不仅仅是简单地忽略它。

除上述方法外,没有任何符合 OpenMP 的方法可以将特定任务分配给特定工作线程执行。