【问题标题】:Maximum memory allocation size in OpenCL only a quarter of available main memory--why?OpenCL 中的最大内存分配大小只有可用主内存的四分之一——为什么?
【发布时间】:2013-12-05 19:09:02
【问题描述】:

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

内存对象分配的最大大小 字节。最小值为最大值 (分钟(1024*1024*1024, 1/4 CL_DEVICE_GLOBAL_MEM_SIZE), 128*1024*1024) 用于不属于 输入 CL_DEVICE_TYPE_CUSTOM。

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

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

【问题讨论】:

  • 也许该区域被分成“碎片变量区域”、“连续分配区域”和“intel hd graphics/amd overdrive 驱动程序工作区域”等部分,因此只有一部分可供完全使用。也许吧。
  • 我从未见过 GPU 的技术原因。这只是区分游戏和专业 GPU 的一种方式。 CUDA 对 Nvidia GeForce GPU 有类似的限制,但在 Tesla 卡上取消了限制。至于 CPU,我不知道。
  • NVIDIA's response to this 是“该值是故意的。限制是基于我们对规范的理解,包括参与 OpenCL 论坛标准委员会以及我们对合规性测试结果的经验。除此之外的详细理由可能不会出现。”

标签: opencl


【解决方案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 和 Intel 可能在内部使用 32 位变量作为内存,并且无法或不愿意将其代码迁移到完全 64 位。不过,这纯粹是猜测。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    • 2023-03-03
    • 2018-11-15
    • 2023-03-20
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多