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

OpenCL中的最大内存分配大小只有可用主内存的四分之一——为什么?,opencl,Opencl,对于设备信息参数CL\u device\u MAX\u MEM\u ALLOC\u SIZE,OpenCL标准(2.0,与早期版本类似)有如下说明: 中内存对象分配的最大大小 字节。最小值为最大值 (最小值(1024*1024*1024,1/4 CL_设备_全局_成员_尺寸), 128*1024*1024)用于不属于 类型CL\ U设备类型\自定义 事实证明,AMD和Intel CPU OpenCL实现一次只能提供四分之一的可用内存(在我的机器上约为2 GiB,在其他机器上为8 GiB,与此类似

对于设备信息参数
CL\u device\u MAX\u MEM\u ALLOC\u SIZE
,OpenCL标准(2.0,与早期版本类似)有如下说明:

中内存对象分配的最大大小 字节。最小值为最大值 (最小值(1024*1024*1024,1/4 CL_设备_全局_成员_尺寸), 128*1024*1024)用于不属于 类型CL\ U设备类型\自定义

事实证明,AMD和Intel CPU OpenCL实现一次只能提供四分之一的可用内存(在我的机器上约为2 GiB,在其他机器上为8 GiB,与此类似)。我看不出有什么好的技术理由。我知道AMD GPU也有类似的限制,由
GPU\u MAX\u ALLOC\u PERCENT
环境变量控制,但即使如此,我也不太明白仅仅提供所有内存进行分配的困难在哪里


总而言之:限制一次分配的内存量的技术原因是什么?毕竟,我可以一大口吞下CPU上的所有内存。是否存在一些我不了解的性能问题?

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

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

我相信在最近的硬件市场中,细分市场的规模会增加


在CPU方面:您运行的是32位程序还是64位程序?根据您上次对malloc()的评论,我假设为64位,因此它不是通常的32位。但是,AMD和Intel可能会在内部使用32位变量作为内存,并且无法或不愿意将其代码迁移到完全64位。不过,这纯粹是猜测。

可能该区域被划分为“碎片变量区域”、“连续分配区域”和“英特尔hd graphics/amd overdrive驱动程序工作区域”等部分,因此只有一小部分可供完整使用。也许吧。我从来没有见过GPU的技术原因。这只是区分游戏和专业GPU的一种方式。CUDA对Nvidia GeForce GPU也有类似的限制,但特斯拉卡取消了该限制。至于CPU,我不知道。was“该值是有意设定的。该限制基于我们对规范的理解,包括参与OpenCL论坛标准委员会以及我们在合规性测试结果方面的经验。除此之外,可能不会提供详细的理由。”