在PyOpenCL中创建没有模板的共享内存中的数组

时间:2011-06-24 13:00:09

标签: cuda pycuda

如何在共享内存中创建数组,而无需使用official examples中所示的模板修改内核。或者正式使用模板?

在PyOpenCL中,我可以通过设置内核参数

在本地内存中创建一个数组
kernel.set_arg(1,numpy.uint32(a_width))

... 
KERNEL_CODE = """
__kernel void matrixMul(__local float* A_temp,...)
    { ...} """

2 个答案:

答案 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相关的问题。我不是这方面的专家。

相关问题