OpenCL Pipeline无法使用cl_mem_object_allocation_failure分配缓冲区

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

我有一个处理图像/视频的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 - (本地内存+私有),或类似的东西?

根据我自己的内存分析器,我在崩溃时分配了92%的CL_DEVICE_GLOBAL_MEM_SIZE。通过调整大小,管道说我在调整大小的图像上使用了89%并且它通过了,所以我假设我的大图像在边缘上通过。

c++ opencl
1个回答
0
投票

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

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