首页 > 解决方案 > openmp中的关键指令是否可以命名变量?

问题描述

我想运行以下循环来并行计算元素。由于count[j]仅由(X[i] / exp) % 10评估为的迭代更新,因此j我想为每个定义不同的关键部分。我首先想到在每个数组元素上使用归约子句,但这给出了编译错误。我知道这段代码是错误的,但我应该如何实现这种事情?

#pragma omp parallel for
    for (i = 0; i < n; i++)
        #pragma omp critical((X[i] / exp) % 10)
        count[(X[i] / exp) % 10]++;

标签: openmpcritical-section

解决方案


对于像这样只有一次更新的事情,正常的解决方案是使用原子。

#pragma omp atomic
count[(X[i] / exp) % 10]++;

或者,您可以在整个阵列上使用 OpenMP 归约,请参阅OpenMP 4.5 示例的第 238 页上的示例归约.7.c


推荐阅读