【发布时间】: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 howCL_DEVICE_MAX_MEM_ALLOC_SIZEis defined。我不知道你在哪里观察到有人分配了更多的内存,除非总内存小于 512Mb。 -
我要强调的是,它必须至少是我指定的数字;如果硬件可以适当地支持它,则允许实现将限制设置得更高。我见过很少的硬件集支持在单个缓冲区中使用超过 33% 的内存,但它可能已经发生了。