我正在编写更多具有以下示意图的计算代码:
#pragma omp parallel
{
#pragma omp for nowait
// Compute elements of some array A[i] in parallel
#pragma omp single
for (i = 0; i < N; ++i) {
// Do some operation with A[i].
// This time it is important that operations are sequential. e.g.:
result = compute_new_result(result, A[i]);
}
}
既计算A[i]
又compute_new_result
相当昂贵。所以我的想法是并行计算数组元素,如果任何线程空闲,它就会开始执行顺序操作。很有可能已经计算了起始数组元素,而其他元素将由仍在执行第一个循环的其他线程提供。
但是,要使这个概念发挥作用,我必须实现两件事:
为了使 OpenMP 以另一种方式拆分循环,即用于两个线程:线程 1 计算A[0]
,A[2]
和A[4]
线程 2:A[1]
,A[3]
,A[5]
等。提供一些信号系统。我正在考虑一组标志,表明
A[i]
已经计算过。然后在继续之前compute_new_result
应该等待各自的标志被释放。A[i]
我会很高兴任何提示如何实现这两个目标。我需要能够在 Linux、Windows 和 Mac 上移植的解决方案。我正在用 C++11 编写整个代码。
编辑:
我已经找到了第一个问题的答案。看起来在指令中添加schedule(static,1)
子句就足够了。#pragma omp for
但是,我仍在考虑第二个问题的优雅解决方案......