4

在我的 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) ];
                     ...
        }

你有什么建议吗?

4

2 回答 2

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()
于 2011-05-06T22:11:44.813 回答
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

于 2011-05-06T17:51:04.817 回答