OpenAcc if-condition 不工作?
OpenAcc if-condition not working?
我有以下代码:
#pragma acc kernels
for (i = 0; i<shape1Count; i++){
for (j = 0; j<shape2Count; j++){
if (kkk==1){
intersectionsCount++;
} else {
intersectionsCount++;
}
}
}
kkk被赋值为1。
我发现if-condition连运行都没有,也就是说不管是true还是false,intersectionCount都不自增。
我的假设是 GPU/accelerator 无法处理 if-condition。是真的吗?
如果是真的,我该如何处理?
p.s。我是 GPU 编程的新手。
非常感谢
编译器通常可以自动检测缩减,但在这种情况下不能。因此,您需要自己添加一个减少条款。这是使用 pgcc 版本 16.4 时的输出:
% cat test.c
#include <stdlib.h>
#include <stdio.h>
int main() {
int i, j, kkk, intersectionsCount;
int shape1Count,shape2Count;
shape1Count=32;
shape2Count=32;
intersectionsCount=0;
kkk=1;
#pragma acc kernels loop reduction(+:intersectionsCount)
for (i = 0; i<shape1Count; i++){
for (j = 0; j<shape2Count; j++){
if (kkk==1){
intersectionsCount++;
} else {
intersectionsCount++;
}
}
}
printf("%d\n",intersectionsCount);
exit(0);
}
% pgcc test.c -Minfo=accel -acc; a.out
main:
15, Loop is parallelizable
16, Loop is parallelizable
Accelerator kernel generated
Generating Tesla code
15, #pragma acc loop gang, vector(4) /* blockIdx.y threadIdx.y */
16, #pragma acc loop gang, vector(32) /* blockIdx.x threadIdx.x */
Generating reduction(+:intersectionsCount)
1024
我有以下代码:
#pragma acc kernels
for (i = 0; i<shape1Count; i++){
for (j = 0; j<shape2Count; j++){
if (kkk==1){
intersectionsCount++;
} else {
intersectionsCount++;
}
}
}
kkk被赋值为1。
我发现if-condition连运行都没有,也就是说不管是true还是false,intersectionCount都不自增。
我的假设是 GPU/accelerator 无法处理 if-condition。是真的吗?
如果是真的,我该如何处理?
p.s。我是 GPU 编程的新手。
非常感谢
编译器通常可以自动检测缩减,但在这种情况下不能。因此,您需要自己添加一个减少条款。这是使用 pgcc 版本 16.4 时的输出:
% cat test.c
#include <stdlib.h>
#include <stdio.h>
int main() {
int i, j, kkk, intersectionsCount;
int shape1Count,shape2Count;
shape1Count=32;
shape2Count=32;
intersectionsCount=0;
kkk=1;
#pragma acc kernels loop reduction(+:intersectionsCount)
for (i = 0; i<shape1Count; i++){
for (j = 0; j<shape2Count; j++){
if (kkk==1){
intersectionsCount++;
} else {
intersectionsCount++;
}
}
}
printf("%d\n",intersectionsCount);
exit(0);
}
% pgcc test.c -Minfo=accel -acc; a.out
main:
15, Loop is parallelizable
16, Loop is parallelizable
Accelerator kernel generated
Generating Tesla code
15, #pragma acc loop gang, vector(4) /* blockIdx.y threadIdx.y */
16, #pragma acc loop gang, vector(32) /* blockIdx.x threadIdx.x */
Generating reduction(+:intersectionsCount)
1024