【问题标题】:clCreateBuffer() never failsclCreateBuffer() 永远不会失败
【发布时间】:2017-06-21 18:00:59
【问题描述】:

打算将所有可用的 GPU 内存用于我的算法,因此检索它的数量:

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

这是536543232字节,然后在GPU上分配:

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

想知道为什么它会起作用,如果尝试分配更多内存会不会失败?尝试了 100 场演出,它仍然有效!

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

所以问题是为什么它可以在指定的任何内存量下工作?

【问题讨论】:

  • 当你检查errcode_ret的值时你得到了什么?通常,像这样的函数会因为在该变量中设置一个值而失败,而不是因为程序崩溃或抛出异常。
  • @Xirema errcode_ret 在所有这些调用之后为 0,即 CL_SUCCESS
  • 你能编辑一个完整的程序来重现这个问题吗?我电脑上的一个示例程序产生了错误代码-61,对应于CL_INVALID_BUFFER_SIZE
  • CL_DEVICE_MAX_MEM_ALLOC_SIZE 是单个缓冲区的限制,需要为 128Mb 或 CL_DEVICE_GLOBAL_MEM_SIZE / 4 中的较大者。因此,在大多数实际场景中,您应该假设您分配的缓冲区不能占设备总内存的 25% 以上。 See the Specification on how CL_DEVICE_MAX_MEM_ALLOC_SIZE is defined。我不知道你在哪里观察到有人分配了更多的内存,除非总内存小于 512Mb。
  • 我要强调的是,它必须至少是我指定的数字;如果硬件可以适当地支持它,则允许实现将限制设置得更高。我见过很少的硬件集支持在单个缓冲区中使用超过 33% 的内存,但它可能已经发生了。

标签: c++ c memory opencl gpgpu


【解决方案1】:

如果 OpenCL 平台有惰性内存分配(几乎每个平台都这样做),我可能会发生这种情况。我猜一些 OpenCL 平台只是检查您请求的内容是否可以在 clCreateBuffer 上分配,而您的可能不能。您可能会在实际使用缓冲区的第一个 OpenCL 函数上遇到错误,例如 clEnqueueWriteBuffer() 等。您的 OpenCL 平台是什么?

【讨论】:

  • 我的 OpenCL 版本是 1.1,NVIDIA 340 驱动,Ubuntu 16.04。
  • 尝试写入该 100GB 缓冲区。它应该失败。 IIRC,在其他情况下,NVIDIA OpenCL 平台有时倾向于在实际失败的函数中设置错误,但稍后,例如,如果clEnqueueNDRangeKernel 调用失败,则可以在下一个clFinishclWaitForEvents 调用中返回错误(即与惰性内存分配无关)。
  • clEnqueueNDRangeKernel() 实际上失败并出现 CL_MEM_OBJECT_ALLOCATION_FAILURE 错误,是的,谢谢。正如我所料,即使我尝试分配 CL_DEVICE_GLOBAL_MEM_SIZE 内存,它也确实失败了,因为每次分配都有一些限制。必须通过多次调用 clCreateBuffer() 以某种方式分配整个全局内存,叹息 ...
猜你喜欢
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 2020-06-03
  • 2014-01-24
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
相关资源
最近更新 更多