我有一个处理图像/视频的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%并且它通过了,所以我假设我的大图像在边缘上通过。
设备VRAM的某些部分可用于像素缓冲区,常量内存或其他用途。对于AMD卡,您可以将环境变量GPU_MAX_HEAP_SIZE
和GPU_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