是否可以控制用于在 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 的方法可以将特定任务分配给特定工作线程执行。
是否可以控制用于执行特定任务的 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 的方法可以将特定任务分配给特定工作线程执行。