OpenACC - 嵌套循环奇怪的行为
OpenACC - Nested loop strange behaviour
我正在使用OpenACC研究块对角矩阵的LU分解。
当我按顺序运行代码时,我得到了正确的分解,而在 OpecACC 指令下执行代码时,我在进行分解时得到了错误的结果。
LU 分解涉及该类型的嵌套循环(请参阅此处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 %dn", 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++ 中实现嵌套循环的更短方法吗?
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 毕达哥拉斯三重嵌套循环误解
- T(n) 表示嵌套循环
- 2 个嵌套循环的时间复杂度
- 嵌套循环背后的逻辑
- 使用 %s C++嵌套循环
- 嵌套循环和重复迭代器
- 如何在 c++ 下使用嵌套循环和正则表达式降低时间复杂度?
- C++在乘法图中放置随机值(嵌套循环)
- 如何使用 OpenMP 减少嵌套循环?
- 为什么使用 2 个嵌套循环 O(n^2) 复杂度来解决二和问题,当只改变循环计数器逻辑时运行得更快?
- 学习嵌套循环C++与示例混淆
- 如何在CUDA中嵌套循环
- std::vector上的嵌套循环
- OpenACC - 嵌套循环奇怪的行为
- OpenACC 嵌套循环依赖关系错误