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

8
对于设备信息参数CL_DEVICE_MAX_MEM_ALLOC_SIZE,OpenCL标准(2.0版,早期版本类似)如下所述:
内存对象分配的最大大小(以字节为单位)。最小值为不是CL_DEVICE_TYPE_CUSTOM类型的设备的max(min(1024*1024*1024,CL_DEVICE_GLOBAL_MEM_SIZE的1/4),128*1024*1024)。
事实证明,AMD和英特尔CPU的OpenCL实现只提供可用内存的四分之一(在我的8GiB机器上约为2GiB,在其他机器上也是如此)来一次性分配。我看不到很好的技术理由。我知道AMD GPU也有类似的限制,由GPU_MAX_ALLOC_PERCENT环境变量控制,但即使在那里,我也不太明白为什么不能将所有内存都提供给分配。
总之,限制一次性分配内存的数量有什么技术原因?毕竟,我可以在CPU上一次性地使用malloc()分配所有内存。难道还有一些我不理解的性能问题吗?

也许该区域被分成了几个部分,如“碎片化变量区域”、“连续分配区域”和“Intel HD Graphics/AMD Overdrive驱动程序工作区域”,因此只有一部分可用于完全使用。也许。 - huseyin tugrul buyukisik
1
我从未见过有关 GPU 的技术原因。这只是一种区分游戏和专业 GPU 的方式。CUDA 也对 Nvidia GeForce GPU 设置了类似的限制,但在 Tesla 卡上取消了该限制。至于 CPU,我不知道。 - chippies
NVIDIA对此的回应是:“这个值是有意为之的。这个限制是基于我们对规范的理解,包括参与OpenCL论坛标准委员会和我们在合规性测试结果方面的经验。除此之外的详细说明可能不会提供。” - reirab
1个回答

3

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

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

我相信在更近期的硬件上,段的大小会增加。

对于CPU方面:您正在运行32位程序还是64位程序?根据您最后有关malloc()的评论,我假设是64位程序,因此不是通常的32位程序。然而,AMD和英特尔可能在内部使用32位变量进行内存管理,并且可能无法或不愿意将其代码完全迁移到64位。这只是猜测。


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