如何在pyopencl中创建可变大小的__local内存?

4 投票
2 回答
2343 浏览
提问于 2025-04-16 17:07

在我的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的额外源代码。

编辑:我在谷歌上找到了一些东西;-):http://www.google.com/url?sa=t&source=web&cd=4&ved=0CC8QFjAD&url=http%3A%2F%2Flinksceem.eu%2Fjoomla%2Ffiles%2FPRACE_Winter_School%2FLinkSCEMM_pyOpenCL.pdf&rct=j&q=Pyopencl%20__local%20memory&ei=BTbETbWhOsvBswadp62ODw&usg=AFQjCNG6rXEEkDpE1304pmQDu3GFdRA0BQ&sig2=vHOGOqwA1HHUl10c6HO8WQ&cad=rja

撰写回答