假设CPU指针(cpu_ptr_)已经存在,那么我为gpu(cl_gpu_mem_)创建一个缓冲区。问题是当我将gpu缓冲区映射到cpu指针(mapped_ptr)时,mapped_ptr不等于原始指针(cpu_ptr_),这导致CHECK_EQ(mapped_ptr,cpu_ptr_)引发错误。
cl_gpu_mem_ = clCreateBuffer(ctx.handle().get(),
CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR,
size_, cpu_ptr_, &err);
void *mapped_ptr = clEnqueueMapBuffer(
ctx.get_queue().handle().get(),
cl_gpu_mem_,
true,
CL_MAP_READ | CL_MAP_WRITE,
0, size_, 0, NULL, NULL, NULL);
CHECK_EQ(mapped_ptr, cpu_ptr_)
<< "Device claims it supports zero copy"
<< " but failed to create correct user ptr buffer";
我不知道为什么会发生这种错误。您能否就此问题或任何解决方案向我提出任何建议。非常感谢你。
答案 0 :(得分:1)
OpenCL实现可以自由镜像主机指针(使其非零复制)。在支持真正零拷贝的设备(例如Intel GPU)上,仍然存在一些限制因素,即我们是否真的可以使用该主机分配目录或必须镜像它。在Intel上,主机地址必须是页面对齐的,长度必须是128字节的倍数(偶数高速缓存行)。 (我通常只是将两者对齐。)我不确定AMD和其他要求是什么。
查看aligned_alloc
或通过分配一些额外的页面并使用页面边界作为基础。