如何在共享内存中创建数组,而无需使用official examples中所示的模板修改内核。或者正式使用模板?
在PyOpenCL中,我可以通过设置内核参数
在本地内存中创建一个数组kernel.set_arg(1,numpy.uint32(a_width))
...
KERNEL_CODE = """
__kernel void matrixMul(__local float* A_temp,...)
{ ...} """
答案 0 :(得分:3)
CUDA在内核运行时支持动态共享内存分配,但该机制与OpenCL略有不同。在CUDA运行时API中,使用动态分配/大小的共享内存的内核以及用于调整内存大小的启动使用以下语法:
__global__ void kernel(...)
{
extern __shared__ typename buffer[];
....
}
....
kernel <<< griddim, blockdim, sharedmem, streamID >>> (...)
其中sharedmem
是将分配给缓冲区的每个块的总字节数。
在PyCUDA中,相同的机制就是这样的:
mod = SourceModule("""
__global__ void kernel(...)
{
extern __shared__ typename buffer[];
....
}
""")
func = mod.get_function("kernel")
func.prepare(..., shared=sharedmem)
func.prepared_call(griddim,blockdim,...)
将共享内存分配大小传递给prepare
方法。
答案 1 :(得分:0)
我完全不明白这个问题。我不使用Python,但很了解OpenCL。
在OpenCL中,您有两种创建共享/本地内存缓冲区的可能性:
1)您可以在问题中添加内核参数。 2)在内核本身内部静态定义一个缓冲区,如:
__local buffer[1024];
使用OpenCL没有其他机会这样做。如何创建内核代码字符串以将其传递给OpenCL是另一个与Python相关的问题。我不是这方面的专家。