【发布时间】:2017-08-03 21:58:33
【问题描述】:
我有一种情况,我需要多次重复循环的特定迭代。所以,在那个特定的迭代中,我将索引减少了一步,这样循环索引的下一个增量就没有区别了。
这种方法是我必须实施的方法,适用于多线程 OpenMP 代码。但是,它不适用于 OpenACC(对于 multicore 和 tesla 目标)。我收到以下错误:
Floating point exception (core dumped)
以下是这两种情况的代码:
#include <stdio.h>
#include <omp.h>
#include <unistd.h>
int main() {
int x = 52;
int count = 5;
int i;
omp_set_num_threads(6);
#pragma omp parallel for
for(i=0;i<100;i++) {
if(i == x) {
printf("%d\n", i);
i--;
count--;
if(count == 0)
x = 10000;
}
}
int gpu_count = 0;
count = 5;
x = 52;
#pragma acc parallel loop independent
for(i=0;i<1000000;i++) {
if(i == x) {
#pragma acc atomic
gpu_count++;
i--;
count--;
if(count == 0)
x = 2000000;
}
}
printf("gpu_count: %d\n", gpu_count);
return 0;
}
对于 OpenMP,我得到了正确的输出:
52
52
52
52
52
但是,对于 OpenACC,我得到了上述错误。
如果我注释第 35 行 (i--;), 代码将正确执行并输出重复迭代次数(即 1)。
注意:我将 PGI 16.5 与 Geforce GTX 970 和 CUDA 7.5 一起使用。
我用 PGI 编译器编译如下:
pgcc -mp -acc -ta=multicore -g f1.c
所以,我的问题是:为什么我会看到这样的行为?我不能在 OpenACC 中更改循环索引变量吗?
【问题讨论】:
-
如果允许的话,我确实会感到非常惊讶。通常,您不应该在并行循环中执行此类操作,不仅在 OpenACC 中(我不太了解,无法回答)。
-
如果您需要在一次迭代中重复某些内容,请以其他方式进行。例如,里面有一个while循环。
-
@VladimirF:感谢您的编辑。我有意将 OpenACC 放在开头,以使其对所有用户更友好。关于您提出的 while 方法,实际上,我对上述方法的意图是省略内部 while 循环。这就是为什么我想像上面那样做。
-
不要把标签那样放在开头。标签列表就是为此。 meta.stackexchange.com/questions/19190/…