我正在学习OpenCl并且我偶然发现了这两个代码片段,现在我想知道为什么使用私有内存要比使用全局内存快得多。
kernel void mmul(
const int N,
global float* A,
global float* B,
global float* C)
{
int k, j;
int i = get_global_id(0);
float tmp;
if (i < N) {
for (j = 0; j < N; j++) {
tmp = 0.0f;
for (k = 0; k < N; k++)
tmp += A[i*N+k] * B[k*N+j];
C[i*N+j] = tmp;
}
}
}
之间
kernel void mmul(
const int N,
global float* A,
global float* B,
global float* C)
{
int k, j;
int i = get_global_id(0);
float Awrk[2048];
float tmp;
if (i < N) {
for (k = 0; k < N; k++)
Awrk[k] = A[i*N+k];
for (j = 0; j < N; j++) {
tmp = 0.0;
for (k = 0; k < N; k++)
tmp += Awrk[k] * B[k*N+j];
C[i*N+j] = tmp;
}
}
}
在底部代码片段中,代码分配一个内存,Awrk [2048],并从全局浮动A中复制数据,我认为这是浪费操作。但是,底部代码比顶部代码(大约14秒)快得多(4.27秒)。那是为什么?
谢谢。