OpenACC的'#pragma omp atomic'的无效表达式类型

时间:2018-08-05 21:13:34

标签: c++ multithreading openacc

我一直在与OpenACC玩耍,以替代编写低级CUDA代码的方法。我有一个在C ++中看起来像这样的OpenMP实现:

int main() {
...
Eigen::ArrayXXf grid = Eigen::ArrayXXf::Zero(num_elements);
...
#pragma omp parallel for firstprivate(...) shared(grid)
for(int i = 0; i < N; i++) {
... // parallelized part of loop goes here
#pragma omp critical
grid += f(...);
}

必须将网格作为单线程操作添加,因此必须添加#pragma omp critical。使用gcc-7.2.0可以正常编译。作为OpenACC的首次通过,天真的实现,我尝试了

int main() {
...
Eigen::ArrayXXf grid = Eigen::ArrayXXf::Zero(num_elements);
...
#pragma acc parallel loop
for(int i = 0; i < N; i++) {
... // parallelized part of loop goes here
#pragma acc atomic
grid += f(...);
}

在使用gcc-7.2.0pgc++进行编译时,出现了一个错误invalid expression type for '#pragma omp atomic',我认为使用OpenACC时抛出OpenMP错误很奇怪。使用#pragma acc parallel loop reduction(+:grid)也会在编译时抛出错误,说user defined reduction not found for 'grid'

为什么会引发此错误,并且如何确保grid没有争用条件?有没有办法在OpenACC线程中手动获取锁定?

0 个答案:

没有答案