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

And*_*ner 5 opencl

对于设备信息参数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实现只能提供四分之一的可用内存(我的机器上大约2 GiB,其中8 GiB,同样在其他机器上)可以同时分配.我没有看到这方面的良好技术理由.我知道AMD GPU有类似的限制,由GPU_MAX_ALLOC_PERCENT环境变量控制,但即使在那里,我也不太清楚只需提供所有内存进行分配就有困难.

总结一下:限制一次分配的内存量的技术原因是什么?毕竟,我可以把malloc()所有的内存都集中在CPU上.是否有一些我不理解的性能问题?

use*_*401 3

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

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

我相信在更新的硬件中,段大小会增加。

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