声明本地内存之间的区别如下:
__kernel void mmul(const int Ndim, const int Mdim, const int Pdim,
const __global int* A,
const __global int* B,
__global char* C,
__local int* restrict block_a,
__local int* restrict block_b)
并在内核中声明本地内存
#define a_size 1024
#define b_size 1024 * 1024
__kernel void mmul(const int Ndim, const int Mdim, const int Pdim,
const __global int* A,
const __global int* B,
__global char* C) {
__local int block_a[a_size]
__local int block_b[b_size]
...
}
在这两种情况下,所有线程都将更新共享A和B阵列中的单个单元
我知道在内核中不可能有“变量”长度数组(因此第二个内核顶部的#define),但还有其他区别吗?关于释放内存的时间有什么不同吗?
答案 0 :(得分:2)
在这两种情况下,本地内存都存在于工作组的生命周期中。正如您所指出的,唯一的区别是将本地内存指针作为参数传递允许动态指定缓冲区的大小,而不是编译时常量。不同的工作组将始终使用不同的本地内存分配。
答案 1 :(得分:1)
如果要将代码移植到CUDA,第二种方法会更好,因为CUDA中的__shared__
内存(相当于OpenCL中的__local
)不支持像第一种情况一样声明。< / p>