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

2024-05-14

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

你有什么建议吗?


它与 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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐