我无法确定此OpenmP任务示例出了什么问题。就上下文而言,y是一个大型共享数组,并且rowIndex对于每个任务都不是唯一的。可能有多个任务试图增加值y [rowIndex]。
我的问题是,y是否需要由归约子句保护,还是原子更新就足够了?我目前正遇到一个更大的程序崩溃,并且想知道我是否正在对此进行基本设置。
在我看到的示例中,由于每个线程的数组复制,大多数数组减少都是针对非常小的数组,而大多数原子更新未在数组元素上使用。似乎没有太多内容可以一次在一个竞争条件下更新一个元素的共享数组(而且基于任务的并行性的情况很少见。)
#pragma omp parallel shared(y) // ??? reduction(+:y) ???
#pragma omp single
for(i = 0; i < n; i++)
{
sum = DoSmallWork_SingleThread();
rowIndex = getRowIndex_SingleThread();
#pragma omp task firstprivate(sum,rowIndex)
{
sum += DoLotsofWork_TaskThread();
// ??? #pragma omp atomic update ???
y[ rowIndex ] += sum;
}
}