Fra*_*ter 10 gpgpu opencl gpu-shared-memory
今天我__local向我的内核添加了四个变量以转储中间结果.但是只需将四个以上的变量添加到内核的签名中并添加相应的内核参数,就会将内核的所有输出都呈现为"0".没有cl函数返回错误代码.
我进一步尝试只添加两个较小的变量之一.如果我只添加其中一个,它可以工作,但如果我添加它们,它就会崩溃.
那么OpenCL的这种行为是否意味着我分配给了大量__local内存?我怎么知道,我可以__local使用多少内存?
Kyl*_*utz 20
通过使用CL_DEVICE_LOCAL_MEM_SIZE带有以下clGetDeviceInfo功能的标志,可以查询设备在其每个计算单元上提供的本地内存量:
cl_ulong size;
clGetDeviceInfo(deviceID, CL_DEVICE_LOCAL_MEM_SIZE, sizeof(cl_ulong), &size, 0);
Run Code Online (Sandbox Code Playgroud)
返回的大小以字节为单位.每个工作组都可以严格分配这么多内存.但请注意,如果它确实分配了最大值,则可能会阻止在同一计算单元上同时调度其他工作批处理.
当然有,因为本地记忆是物理的而不是虚拟的.
从使用CPU上的虚拟地址空间到理论上我们使用的内存与我们想要的内存一样多 - 由于分页文件/交换分区耗尽而可能在非常大的大小上失败,或者甚至可能没有,直到我们实际尝试使用太多内存,使其无法映射到物理RAM和磁盘.
对于需要访问实际RAM中特定区域的计算机的OS内核(或其低级部分),情况并非如此.
GPU全局和本地内存也不是这样.没有*内存分页(将感知到的线程地址重新映射到物理内存地址); 并且没有交换.特别是关于本地存储器,每个计算单元(= GPU上的每个对称多处理器)都有一堆用作本地存储器的RAM; 这里的绿板:

每个这样的板坯的大小是你得到的
clGetDeviceInfo( · , CL_DEVICE_LOCAL_MEM_SIZE, · , ·).
为了说明,在nVIDIA Kepler GPU上,本地内存大小为16 KB或48 KB(64 KB的补充用于缓存对全局内存的访问).因此,截至今天,GPU本地内存相对于全局设备内存非常小.
1 - 在以Pascal架构开始的nVIDIA GPU上,支持分页; 但这不是使用设备内存的常用方法.