OpenCL管道无法使用cl_mem_object_allocation_failure分配缓冲区

时间:2019-03-27 17:14:41

标签: c++ opencl

我有一个处理图像/视频的OpenCL管道,有时它可能会贪图内存。像这样在cl :: Buffer()分配时崩溃了:

cl_int err = CL_SUCCESS;
cl::Buffer tmp = cl::Buffer(m_context, CL_MEM_READ_WRITE, sizeData, NULL, &err);

错误-4 - cl_mem_object_allocation_failure

这是通过使用非常大的图像在管道的固定点发生的。如果我只是稍微缩小图像的大小,它就会在非常占用内存的部分通过管道。

我可以访问带有4go的Nvidia卡,该卡在某个时候会崩溃,并且还尝试了带有2go的AMD GPU,后者较早崩溃了。

根据此thread,由于与VRAM交换而不必知道当前分配,但是看来我的管道破坏了设备的内存。

这是我的问题:

1)我的计算机或管道上是否有任何设置需要设置以允许更多的VRAM?

2)可以使用CL_DEVICE_GLOBAL_MEM_SIZE作为要分配的最大大小的参考,还是我需要做CL_DEVICE_GLOBAL_MEM_SIZE-(本地内存+私有),或者类似的事情?

根据我自己的内存分析器,我在崩溃时分配了CL_DEVICE_GLOBAL_MEM_SIZE的92%。通过调整大小,管道说我在调整大小的图像上使用了89%并通过了,因此我认为我的大图像处于要通过的边缘。

1 个答案:

答案 0 :(得分:0)

设备的VRAM的某些部分可能用于像素缓冲区,常量存储器或其他用途。对于AMD卡,您可以将环境变量GPU_MAX_HEAP_SIZEGPU_MAX_ALLOC_PERCENT设置为使用VRAM的较大部分,尽管这可能会产生意想不到的副作用。两者均表示为卡上物理可用内存的百分比。此外,每个内存分配的大小都有限制。您可以通过查询CL_DEVICE_MAX_MEM_ALLOC_SIZE获得单个内存分配的最大大小,该大小可能小于CL_DEVICE_GLOBAL_MEM_SIZE。对于AMD卡,可以使用GPU_SINGLE_ALLOC_PERCENT控制此大小。这不需要更改代码,只需在调用可执行文件之前设置变量即可:

GPU_MAX_ALLOC_PERCENT="100"
GPU_MAX_HEAP_SIZE="100"
GPU_SINGLE_ALLOC_PERCENT="100"
./your_program