我用C++包装,并用下面的代码创建缓冲区:为什么clCreateBuffer使用主机内存?
cl_int err(0);
unsigned int size;
void *data = GetData(/*out*/ size);
cl::Buffer buf(m_ctx, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR,
size, data, &err);
free(data);
之后工作由size
字节设定的我的应用程序的增加。而且,由于我有32位应用程序,因此总共不能分配更多的1.5 Gb,但GPU有3 Gb。
是否可以分配更多缓冲区?
PS。 size
小于128 Mb。
更新:我只使用1个设备,它是GPU。 (GeForce GTX 780 GPU NVIDIA Corporation 337.88)
我必须问:难道你有多个平台和/或设备,并且意外地选择了** CPU **作为工作设备(而不是** GPU **)? – Marco13
'CL_MEM_COPY_HOST_PTR'可能会触发某些固定的行为。禁用它支持正常的'clEnqueueWriteBuffer()'可能会解决这个问题。如果不是这样,那么司机是如何在较低级别工作的,并且可能无法改变行为。 – DarkZeros
@DarkZeros通常,'CL_MEM_COPY_HOST_PTR'不应该导致锁定(与CL_MEM_USE_HOST_PTR'相反),但是您可能比我更了解细节,并且有疑问的是,这种行为取决于OpenCL的实现。 (至少,规范中可能没有任何内容阻止实现锁定内存......) – Marco13