OpenCL中最大内存分配大小只有可用主内存的四分之一 - 为什么?

时间:2013-12-05 19:09:02

标签: opencl

对于设备信息参数CL_DEVICE_MAX_MEM_ALLOC_SIZE,OpenCL标准(2.0,与早期版本类似)有这样的说法:

  

内存对象分配的最大大小   字节。最小值是max   (分钟(1024 * 1024 * 1024,1 / 4)   CL_DEVICE_GLOBAL_MEM_SIZE)   128 * 1024 * 1024)适用于不属于的设备   键入CL_DEVICE_TYPE_CUSTOM。

事实证明,AMD和英特尔CPU OpenCL实现仅提供可用内存的四分之一(在我的机器上大约2 GiB,其中8 GiB,并且在其他机器上类似)一次分配。我没有看到这方面的良好技术理由。我知道AMD GPU有类似的限制,由GPU_MAX_ALLOC_PERCENT环境变量控制,但即使在那里,我也不太清楚只需提供所有内存进行分配就有困难。

总结:限制一次分配的内存量的技术原因是什么?毕竟,我可以{I}大量地在CPU上malloc()我所有的记忆。是否有一些我不理解的性能问题?

1 个答案:

答案 0 :(得分:1)

AMD GPU在硬件中使用分段内存模型,每个分段的大小受到用于访问内存的硬件寄存器大小的限制。但是,OpenCL要求OpenCL实现提供非分段的全局内存模型。因此,要在所有情况下都通过一致性,AMD必须将全局内存限制在同一硬件内存段中,即提供减少的CL_DEVICE_MAX_MEM_ALLOC_SIZE。

如果增加CL运行时可用的GPU内存量,AMD编译器将尝试将内存缓冲区拆分为不同的硬件内存段以使其工作正常,例如:总共512Mb,您可以正确使用两个256Mb缓冲区,但不能使用一个512Mb缓冲区。

我相信更新近的硬件细分市场规模会增加。

在CPU端:您运行32位程序还是64位?基于你对malloc()的最后评论,我假设64位,所以它不是通常的32位东西。但是,AMD和英特尔可能在内部使用32位变量作为内存,无法或不愿意将其代码迁移到完全64位。不过,那是纯粹的猜测。