今天我向我的内核添加了四个__local
变量来转储中间结果。但是只需将四个以上的变量添加到内核的签名并添加相应的内核参数,就会将内核的所有输出都设置为“0”秒。没有cl函数返回错误代码。
我进一步尝试只添加两个较小变量中的一个。如果我只添加其中一个,它会起作用,但如果我添加它们,它就会崩溃。
OpenCL的这种行为是否意味着,我分配给了很多__local
内存?我怎么知道,我可以使用多少__local
个记忆?
答案 0 :(得分:19)
使用带有CL_DEVICE_LOCAL_MEM_SIZE
函数的clGetDeviceInfo
标志,可以查询设备在其每个计算单元上提供的本地内存量:
cl_ulong size;
clGetDeviceInfo(deviceID, CL_DEVICE_LOCAL_MEM_SIZE, sizeof(cl_ulong), &size, 0);
返回的大小以字节为单位。每个工作组都可以严格分配这么多内存。但请注意,如果确实分配了最大值,则可能会阻止在同一计算单元上同时调度其他工作批。
答案 1 :(得分:6)
当然有,因为本地记忆是物理而不是虚拟。
我们习惯使用CPU上的虚拟地址空间到理论上拥有我们想要的大量内存 - 由于分页文件/交换分区耗尽,可能会因非常大的大小而失败,或者甚至可能不会,直到我们实际上尝试使用太多内存,以便它无法映射到物理RAM和磁盘。
对于需要访问实际RAM中特定区域的计算机操作系统内核(或其低级部分),情况并非如此。
GPU全局和本地内存也不是这样。没有 * 内存分页(将感知到的线程地址重新映射到物理内存地址);并且没有交换。特别是关于本地存储器,每个计算单元(= GPU上的每个对称多处理器)都有一堆用作本地存储器的RAM;这里的绿板:
每个这样的板块的大小是你得到的
clGetDeviceInfo( · , CL_DEVICE_LOCAL_MEM_SIZE, · , ·)
。
为了说明,在nVIDIA Kepler GPU上,本地内存大小为16 KB或48 KB(64 KB的补充用于缓存对全局内存的访问)。因此,截至今天, GPU本地内存相对于全局设备内存非常小。
1 - 在以Pascal架构开头的nVIDIA GPU上,支持分页;但这不是使用设备内存的常用方法。
答案 2 :(得分:4)