我正在尝试使用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
我知道在CUDA中可以使用向量(vector)和块(gang)选项来指定块大小,但我有些困惑它们将如何映射到CUDA架构。
有没有一种类似的方法可以在OpenACC中实现?是否有关于缓存指令的使用或如何将CUDA的共享内存的某些功能映射到OpenACC的好教程/资源?