OpenCL本地内存是否有限制?

11
今天我在内核中添加了四个更多的__local变量,以便倾倒中间结果。但是,只将这四个变量添加到内核签名中,并添加相应的内核参数,会使内核的所有输出都变为“0”。没有任何cl函数返回错误代码。
我进一步尝试仅添加两个较小变量中的一个。如果我只添加其中一个,它可以正常工作,但如果我添加两个,它会崩溃。
那么,OpenCL的这种行为是否意味着我分配了太多的__local内存?如何找出我可以使用多少__local内存?
3个回答

23

要查询设备上每个计算单元提供的本地内存量,可以使用 clGetDeviceInfo 函数和 CL_DEVICE_LOCAL_MEM_SIZE 标志:

cl_ulong size;
clGetDeviceInfo(deviceID, CL_DEVICE_LOCAL_MEM_SIZE, sizeof(cl_ulong), &size, 0);

返回的大小单位为字节。每个工作组只能为自己分配该大小的内存。但要注意,如果它分配了最大值,这可能会阻止同一计算单元上并发调度其他工作组。


1
@einpoklum https://dev59.com/uozda4cB1Zd3GeqPo54j - Ciro Santilli OurBigBook.com
1
@CiroSantilli更新了这个答案,感谢。请考虑现在删除评论。 - einpoklum
这在 clinfo 中被报告为“本地内存大小”。 - user2580621

6
当然有,因为本地内存是物理内存而不是虚拟内存。
我们通常使用CPU上的虚拟地址空间,理论上可以拥有任意多的内存 - 可能会在非常大的大小下失败,因为页面文件/交换分区用完了,或者甚至可能根本没有,直到我们实际尝试使用太多内存以至于无法映射到物理RAM和磁盘。
对于像计算机的操作系统内核(或其较低级部分)需要访问实际RAM中特定区域的情况,情况并非如此。
对于GPU全局和本地内存也是如此。没有内存分页(将感知线程地址重新映射到物理内存地址)和交换。特别是关于本地内存,每个计算单元(= GPU上的每个对称多处理器)都有一堆用作本地内存的RAM;这里是绿色的板条箱:

enter image description here

每个这样的板块的大小是通过使用clGetDeviceInfo( · , CL_DEVICE_LOCAL_MEM_SIZE, · , ·)获得的。
举个例子,在nVIDIA Kepler GPU上,本地内存大小为16 KBytes或48 KBytes(补充到64 KBytes用于缓存对全局内存的访问)。因此,截至今天,相对于全局设备内存,GPU本地内存非常小

1 - 在起始于Pascal架构的nVIDIA GPU上,支持分页;但这不是使用设备内存的常见方式。


4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接