与OpenACC一起使用共享内存

时间:2012-10-17 04:46:56

标签: cuda openacc

我正在尝试使用共享内存来缓存OpenACC。

基本上我正在研究的是矩阵乘法,我所拥有的是:

typedef float ff; 

// Multiplies two square row-major matrices a and b, puts the result in c. 
void mmul(const restrict ff* a, 
          const restrict ff* b, 
          restrict ff* c, 
          const int n) { 
#pragma acc data copyin(a[0:n*n], b[0:n*n]) copy(c[0:n*n]) 
{ 

#pragma acc region 
{ 

#pragma acc loop independent vector(16) 
  for (int i = 0; i < n; ++i) { 
#pragma acc loop independent vector(16) 
    for (int j = 0; j < n; ++j) { 
      ff sum = 0; 
      for (int k = 0; k < n; ++k) { 
        sum += a[i + n * k] * b[k + n * j]; 
      } 
      c[i + n * j] = sum; 
    } 
  } 

} 
}
}

我想要做的是使用共享内存来缓存矩阵'a'和'b'的切片,用于计算'c',类似于CUDA mmul算法确实如此。

基本上在CUDA上我会知道我的块的确切大小,并且能够:

  • 声明一个具有块大小的共享内存
  • 将数据的“相关”部分复制到块
  • 使用此数据

我明白我可以使用

#pragma acc cached

指令,我可以使用 vector gang 选项指定块大小,但是我在理解如何将其映射到CUDA架构时遇到一些麻烦。

有没有办法实现与OpenACC类似的东西?是否有关于使用缓存指令的良好教程/资源,或者如何将共享内存的一些功能从CUDA映射到OpenACC?

1 个答案:

答案 0 :(得分:4)

如果您正在使用PGI加速器编译器,则可以转储生成的PTX文件,并查看执行基础中发生了什么:

pgcc -acc -fast -Minfo -ta=nvidia,cc13,keepptx matrixMult.c -o matrixMult

生成的PTX将存储在当前目录中。

编辑:您可能更喜欢看到高级代码(CUDA for C或Fortran)。因此请使用以下-ta=nvidia,cc13,keepptx,keepgpu