在我的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) ];
...
}
你推荐什么?
答案 0 :(得分:6)
它与C类似。您将固定大小的数组作为本地传递给它。以下是Enja的基数排序示例。请注意,最后一个参数是本地内存数组。
def naive_scan(self, num):
nhist = num/2/self.cta_size*16
global_size = (nhist,)
local_size = (nhist,)
extra_space = nhist / 16 #NUM_BANKS defined as 16 in RadixSort.cpp
shared_mem_size = self.uintsz * (nhist + extra_space)
scan_args = ( self.mCountersSum,
self.mCounters,
np.uint32(nhist),
cl.LocalMemory(2*shared_mem_size)
)
self.radix_prg.scanNaive(self.queue, global_size, local_size, *(scan_args)).wait()
答案 1 :(得分: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的附加源。