2012-10-17 51 views
3

我试图使用共享内存来缓存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; 
    } 
    } 

} 
} 
} 

我想这样做的是使用共享内存对矩阵的高速缓存片“一个'和'b'用于计算'c',这与CUDA mmul算法的作用类似。

基本上在CUDA我也知道我的块的确切大小,将能够:

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

我明白我可以使用

#pragma acc cached 

指令,我可以指定块大小矢量帮派选项,但我有一些麻烦理解如何将映射到CUDA体系结构。

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

+1

PGI加速器编译器可能已经在使用共享内存。您是否使用-Minfo开关检查了输出?这[教程](http://developer.nvidia.com/cuda/openacc-example-part-1)可能是有趣的。 –

+1

是的,但Minfo开关只告诉我我的实现正在使用多少共享内存。尽管这很有用,但我更感兴趣的是知道是否有明确的方式**操纵这些内存。能够看到高水平的cuda生成是非常有用的,但。 – leo

+0

@leo你找到了你的问题的答案?你能否在OpenACC中明确定义共享内存? – Millad

回答

4

如果您正在使用PGI加速器编译器,你可以转储在所产生的PTX文件,看到什么是在执行的下属怎么回事:

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

生成的PTX将被保存在当前目录。

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