gpt4 book ai didi

c++ - OpenACC - 嵌套循环奇怪的行为

转载 作者:行者123 更新时间:2023-11-28 01:48:00 25 4
gpt4 key购买 nike

我正在研究 LU decompositionblock diagonal matrices使用 OpenACC。
当我按顺序运行我的代码时,我得到了正确的分解,而当我在 OpecACC 指令下执行它时,我在进行分解时得到了错误的结果。

LU 分解涉及该类型的嵌套循环(参见 here LUPSolve 函数):

for (unsigned int i = 0; i < N; i++)
for (unsigned int k = 0; k < i; k++)

似乎当这种嵌套循环用于 routine seq 时并行区域内的指令,设备总是设法进入嵌套循环即使 i=0 (由于 k<i 条件,这是不可能的)。

我做了一个简单的代码来检查它:

#pragma acc routine seq
void test ( int* x, int const n ) {
for (unsigned int i = 0; i < n; i++) {
x[i] = -1;
for (unsigned int k = 0; k < i; k++)
x[i] = k < i;
}
}

int main ( ) {
unsigned const n(4);
unsigned const nb(3);
int x[nb*n];
#pragma acc parallel loop copyout(x[:nb*n])
for (unsigned int b = 0; b < nb; b++)
test(x+b*n,n);
// display x
}

我得到的结果是这个:

x = 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1,

但正确的(当我在没有 OpenACC 的情况下运行代码时得到的)应该是:

x = -1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1,

我一定是做错了什么,因为它不应该在 i=0 时进入嵌套循环。 ...
另外,当我将循环直接放在并行区域(不使用函数调用)时,它确实工作正常。

最佳答案

看起来像是编译器代码生成器问题,即使 k 和 i 均为零,它也始终执行内部循环。我已经提交了一份问题报告 (TPR#24317) 并将其发送给我们的编译器工程师进行进一步评估。作为变通方法,在内循环中添加“if”检查。

% cat test.cpp
#include <stdio.h>
#include <stdlib.h>

#pragma acc routine seq
void test ( int* x, int const n ) {
for (unsigned int i = 0; i < n; i++) {
x[i] = -1;
for (unsigned int k = 0; k < i; k++) {
if (k < i)
x[i] = (k<i);
}
}
}

int main ( ) {
unsigned const n(4);
unsigned const nb(3);
int x[nb*n];
#pragma acc parallel loop copyout(x[:nb*n])
for (unsigned int b = 0; b < nb; b++)
test(x+b*n,n);

for (int i=0; i <nb; ++i) {
for (int j=0; j <n; ++j) {
printf("%d:%d %d\n", i,j, x[i*n+j]);
} }
exit(0);
}
% pgc++ -acc -Minfo=acc -ta=tesla:cc60 test.cpp; a.out
test(int *, int):
5, Generating acc routine seq
Generating Tesla code
main:
18, Generating copyout(x[:])
Accelerator kernel generated
Generating Tesla code
20, #pragma acc loop gang, vector(3) /* blockIdx.x threadIdx.x */
0:0 -1
0:1 1
0:2 1
0:3 1
1:0 -1
1:1 1
1:2 1
1:3 1
2:0 -1
2:1 1
2:2 1
2:3 1

关于c++ - OpenACC - 嵌套循环奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44109786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com