是的,您可以 - 缩减条款适用于整个并行区域以及单个for
工作共享结构。这允许例如减少在不同并行部分中完成的计算(重组代码的首选方式):
#pragma omp parallel sections private(val) reduction(+:sum)
{
#pragma omp section
{
bla bla code
sum += val;
}
#pragma omp section
{
bla bla code
sum += val;
}
}
您还可以使用 OpenMPfor
工作共享构造在团队中的线程之间自动分配循环迭代,而不是使用部分重新实现它:
#pragma omp parallel for private(val) reduction(+:sum)
for (row = 0; row < Rows; row++)
{
bla bla code
sum += val;
}
请注意,归约变量是私有的,它们的中间值(即它们在parallel
区域末端归约之前所持有的值)只是部分的,不是很有用。例如,下面的串行循环不能(很容易?)通过归约操作转换为并行循环:
for (row = 0; row < Rows; row++)
{
bla bla code
sum += val;
if (sum > threshold)
yada yada code
}
一旦 的累加值超过 的值,yada yada code
应该在每次迭代中执行。当循环并行运行时, 的私有值可能永远不会达到,即使它们的总和达到了。sum
threshold
sum
threshold