我有一个处理图像/视频的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%并通过了,因此我认为我的大图像处于要通过的边缘。
答案 0 :(得分:0)
设备的VRAM的某些部分可能用于像素缓冲区,常量存储器或其他用途。对于AMD卡,您可以将环境变量GPU_MAX_HEAP_SIZE
和GPU_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