由于OpenMP嵌套并行处理经常会出现性能问题,我想知道是否有一种方法可以实现 partial 障碍,该障碍只能同步所有线程的一个子集。 这是示例代码结构:
#pragma omp parallel
{
int nth = omp_get_num_threads();
int tid = omp_get_thread_num();
if (tid < nth/2) {
// do some work
...
// I need some synchronization here, but only for nth/2 threads
#pragma omp partial_barrier(nth/2)
// do some more work
...
} else {
// do some other independent work
...
}
}
我在openmp标准中没有找到类似的东西,但是也许有一种方法可以用锁或类似的东西有效地编程类似的行为?
编辑: 因此,我的实际问题是我有一个计算内核(Legendre转换-部分 A ),该内核可以根据问题大小使用具有4至12个线程的OpenMP有效地并行化。 此计算后进行快速傅立叶变换( B 部分)。 我有几个独立的数据集(通常大约6到10个),必须先由A处理,然后再由B处理。 我想在更多线程(48到128,取决于机器)上使用更多的并行性。 由于A不能有效地并行处理多于4到12个线程,因此我们的想法是将线程分成几组,每组工作在一个独立的数据集上。由于数据集是独立的,因此我不需要在执行B之前就同步所有线程(使用多个线程时,这非常昂贵),而无需同步给定数据集上的子集。
具有依赖关系的OpenMP任务可以满足我的需要,但是我的经验是,在某些平台(至强服务器)上,性能明显低于使用简单线程可以达到的性能。
有没有一种方法可以有效地同步线程的子集?