clCreateBuffer()永远不会失败

clCreateBuffer()永远不会失败

问题描述:

打算使用所有可用的GPU的内存为我的算法,使检索它与用量:clCreateBuffer()永远不会失败

clGetDeviceInfo(..., CL_DEVICE_GLOBAL_MEM_SIZE, ...); 

这是字节,然后分配给它的GPU有:

clCreateBuffer(gpuContext, CL_MEM_READ_WRITE, 536543232, NULL, & errcode_ret); 

想知道为什么它的工作原理,如果尝试分配更多的内存会失败?尝试了100场演出,它仍然工作!

clCreateBuffer(gpuContext, CL_MEM_READ_WRITE, 100000000000, NULL, & errcode_ret); 

所以问题是为什么它可以与指定的任意数量的内存一起工作?

+0

当你检查'errcode_ret'的值时,你会得到什么?通常情况下,像这样的函数将通过在该变量中设置一个值而失败,而不是通过崩溃程序或抛出异常。 – Xirema

+0

@Xirema errcode_ret在CL_SUCCESS – Slav

+0

的所有这些调用之后都为0您是否可以在完整的程序中编辑该问题,以便重现此问题?我的电脑上的一个示例程序产生了错误代码“-61”,它对应于'CL_INVALID_BUFFER_SIZE'。 – Xirema

如果OpenCL的平台有懒惰的内存分配(几乎每个平台确实是)我可能会发生。我猜想一些OpenCL平台只是检查你的请求是否可以在clCreateBuffer上分配,也许你的没有。您可能会在实际使用缓冲区的第一个OpenCL函数中出现错误,如clEnqueueWriteBuffer()等。您的OpenCL平台是什么?

+0

我的OpenCL版本为1.1,NVIDIA 340驱动程序, Ubuntu 16.04。 – Slav

+0

尝试写入该100GB缓冲区。它应该失败。 IIRC,还有在其他情况下,NVIDIA的OpenCL平台有时往往在实际的失败函数不设置错误,但后来,例如,如果'clEnqueueNDRangeKernel'调用失败,可以在未来的'clFinish'或'clWaitForEvents'调用(返回错误的与懒惰的内存分配无关)。 – haahh

+0

** clEnqueueNDRangeKernel()**实际上因为** CL_MEM_OBJECT_ALLOCATION_FAILURE **错误而失败,是的,谢谢。正如我所期待的那样,即使我尝试分配** CL_DEVICE_GLOBAL_MEM_SIZE **内存,由于每次分配的限制,它确实会失败。必须通过多次调用** clCreateBuffer()**来分配整个全局内存,叹息...... – Slav