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?
PGI加速器编译器可能已经在使用共享内存。您是否使用-Minfo开关检查了输出?这[教程](http://developer.nvidia.com/cuda/openacc-example-part-1)可能是有趣的。 –
是的,但Minfo开关只告诉我我的实现正在使用多少共享内存。尽管这很有用,但我更感兴趣的是知道是否有明确的方式**操纵这些内存。能够看到高水平的cuda生成是非常有用的,但。 – leo
@leo你找到了你的问题的答案?你能否在OpenACC中明确定义共享内存? – Millad