有没有办法在OpenCl中加载大小等于GPU全局内存大小的向量?

问题描述 投票:0回答:1

我的 GPU 有 12 GB 全局内存 (CL_DEVICE_GLOBAL_MEM_SIZE),但只能分配 3 GB 内存 (CL_DEVICE_MAX_MEM_ALLOC_SIZE)。当我尝试加载大小超过 3 GB 的向量时,程序崩溃。问题是,如果可以将更大的向量加载到GPU内存中以充分利用它,该怎么做?

opencl boost-compute
1个回答
2
投票

默认情况下,

CL_DEVICE_MAX_MEM_ALLOC_SIZE
报告
CL_DEVICE_GLOBAL_MEM_SIZE
的1/4,这意味着只允许在12GB GPU上分配四个3GB缓冲区。

但是,Nvidia GPU 允许在单个缓冲区中分配其全部内存容量,即使它们也报告有 1/4 限制。

某些 AMD GPU 的限制设置得更高,例如 Radeon VII 允许您将 14/16GB 用于单个缓冲区。

我见过的唯一真正执行 1/4 限制的设备是 Intel HD 4600 和 5500,即较旧的 Intel 集成 GPU。如果缓冲区大小超过 1/4,

cl::Buffer
构造函数会抛出错误
-61

如果您的设备受到 1/4 内存限制,请将大型 12GB 缓冲区分割为 4 个较小的 3GB 缓冲区(例如,每个矢量的 x、y、z、w 分量各有一个矢量)。如果您使用 Windows,请注意,您可能总共只能使用 ~11.5GB,因为一些 VRAM 是为操作系统保留的。


我认为你的问题可能不是

CL_DEVICE_MAX_MEM_ALLOC_SIZE
,而是数组大小超过 4GB 时的 32 位整数溢出。请使用
uint64_t
数据类型来设置数组大小。


您可能还对这个用于 C++ 的轻量级 OpenCL-Wrapper 感兴趣。在那里,向量的长度始终为 64 位整数,并且它会自动跟踪每个设备上总共使用了多少内存,告诉您是否分配了太多内存。它还捕获 Intel iGPU 上的

-61
错误,并告诉您允许的最大缓冲区大小。

© www.soinside.com 2019 - 2024. All rights reserved.