小编tav*_*avr的帖子

Nvidia上opencl共享内存中的动态分配

我正在按照此处的示例创建一个可变长度的本地内存数组。内核签名是这样的:

__kernel void foo(__global float4* ex_buffer,
                 int ex_int,
                 __local void *local_var) 
Run Code Online (Sandbox Code Playgroud)

然后我调用clSetKernelArg本地内存内核参数如下:

clSetKernelArg(*kern, 2, sizeof(char) * MaxSharedMem, NULL)
Run Code Online (Sandbox Code Playgroud)

MaxSharedMem从查询设置CL_DEVICE_LOCAL_MEM_SIZE。然后在内核内部,我将分配的本地内存拆分为多个数组和其他数据结构,并按照我认为合适的方式使用它们。所有这些都适用于 AMD(gpu 和 cpu)和 Intel 设备。但是,在 Nvidia 上,CL_INVALID_COMMAND_QUEUE当我将这个内核clFinish加入队列然后在队列上运行时,我会收到错误消息。

这是一个生成上述错误的简单内核(本地工作大小为 32):

__kernel 
void s_Kernel(const unsigned int N, __local void *shared_mem_block ) 
{
    const ushort thread_id = get_local_id(0);   
    __local double *foo = shared_mem_block;
    __local ushort *bar = (__local ushort *) &(foo[1000]);


    foo[thread_id] = 0.;
    bar[thread_id] = 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我在本地内存中静态分配相同的数组和数据结构,内核运行良好。有人可以为这种行为和/或解决方法提供解释吗?

nvidia shared-memory opencl

2
推荐指数
1
解决办法
734
查看次数

标签 统计

nvidia ×1

opencl ×1

shared-memory ×1