OpenMP的omp_set_num_threads()
函数如何影响两个同时执行的OpenMP操作?线程数量是累积的还是硬限制的?
例如,假设有两个工作线程完全同时命中以下代码块
omp_set_num_threads(4);
#pragma omp parallel for shared(n)
for (int i=0; i<n; i++)
{
// ... some complicated, parallelizable math here...
}
每个操作将获得自己的4个线程(总共8个线程),还是将总共4个线程分配给两个同时进行的操作?
(我假设如果使用OMP_NUM_THREADS环境变量或num_threads
子句,行为将是相同的。如果我有此错误,请告诉我...)
我问,因为我有一个客户端在具有完整Lotta核心的机器上使用我的SDK。他需要多次调用通过OpenMP实现的我的SDK函数之一。 (我没有写它。我继承了它)。他想尝试并行化对此函数的调用,以寻求更快的整体吞吐量。而且他已经可以控制我的代码用于omp_set_num_threads()
的参数。
我已经意识到我不具备足够的知识来建议他使用什么线程号值,或者即使并行化(在OpenMP实现之上)也值得探讨。因此,至少在开始自己的测试之前,我至少想了解OpenMP在这种情况下应该做什么。
如果有问题,我使用的是Visual Studio 2017的Open MP,那么我猜只是2.0的实现