如何在pyopencl中创建可变大小的__local内存?
在我的C语言OpenCL代码中,我使用了clSetKernelArg
来创建“可变大小”的__local
内存,以便在我的内核中使用,而这在OpenCL本身并不支持。下面是我的例子:
clSetKernelArg(clKernel, ArgCounter++, sizeof(cl_mem), (void *)&d_B);
...
clSetKernelArg(clKernel, ArgCounter++, sizeof(float)*block_size*block_size, NULL);
...
kernel="
matrixMul(__global float* C,
...
__local float* A_temp,
...
)"
{...
我现在的问题是,如何在pyopencl中做到同样的事情?
我查看了pyopencl自带的示例,但我找到的唯一方法是使用模板,这对我来说似乎有点复杂。请看这个例子。
kernel = """
__kernel void matrixMul(__global float* C,...){
...
__local float A_temp[ %(mem_size) ];
...
}
你有什么建议吗?
2 个回答
3
我对Python和它的OpenCL实现不太熟悉,但在内核中可以创建一个固定大小的本地内存(和你做的类似):
__kernel void matrixMul(...) {
__local float A_templ[1024];
}
你可以用一个定义好的预处理符号代替1024,这个符号在编译时可以设置,从而改变内存的大小:
#define SIZE 1024
__kernel void matrixMul(...) {
__local float A_templ[SIZE];
}
SIZE可以在同一个源文件中定义,也可以作为cLBuildProgram的编译参数,或者作为clCreateProgramWithSource的额外源代码。