我有一个 2D 矩阵 SIZE x SIZE,我正在尝试将其复制到 GPU。
我这样分配矩阵:
#define SIZE 1024
float (*a)(SIZE) = (float(*)[SIZE]) malloc(SIZE * SIZE * sizeof(float));
我的 ACC 地区有这个:
void mmul_acc(restrict float a[][SIZE],
restrict float b[][SIZE],
restrict float c[][SIZE]) {
#pragma acc data copyin(a[0:SIZE][0:SIZE], b[0:SIZE][0:SIZE]) \
copyout c[0:SIZE][0:SIZE])
{
... code here...
}
当使用 PGI 编译器进行编译时,使用 -Minfo=acc,编译器会告诉我:
Generating copyin(a[0:1024][0:])
a[0:1024][0:] 是什么意思?为什么不是 [0:1024][0:1024] ???
如果我不声明矩阵,而是声明大小为 SIZE*SIZE 的数组,则执行
#pragma acc copyin(a[0:SIZE*SIZE])
生成以下编译器消息
Generating copyin(a[0:16777216])
代码实际上以相同的方式工作,相同的性能,相同的结果。
显然,编译器以两种方式生成相同的代码,应该是这样,但消息并不简单。
我在 Linux64 机器上使用 PGI 加速器 12.8。我正在使用 -Minfo=acc 进行编译
注意:这个问题已经过编辑,现在它并没有多大意义,但它可能对更多人有用。