为什么 clEnequeMapBuffer 不映射到原始指针、OpenCL、Caffe
why does not clEnequeMapBuffer map to original pointer, OpenCL, Caffe
假设一个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";
我完全不知道为什么会出现这个错误。请你给我任何关于这个问题的建议,或者任何解决方案。非常感谢。
OpenCL 实现可以自由镜像主机指针(使其成为非零副本)。在支持真正零拷贝的设备上(例如 Intel GPU),通常仍然存在一些限制,这些限制强加了我们是否可以真正使用该主机分配目录或必须对其进行镜像。在 Intel 上,主机地址必须是页面对齐的,并且长度必须是 128 字节的倍数(偶数缓存行)。 (我通常只是将两者页面对齐。)我不确定 AMD 和其他人的要求是什么。
查看 aligned_alloc
或过度分配几个额外的页面,并使用页面边界作为基础。
假设一个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";
我完全不知道为什么会出现这个错误。请你给我任何关于这个问题的建议,或者任何解决方案。非常感谢。
OpenCL 实现可以自由镜像主机指针(使其成为非零副本)。在支持真正零拷贝的设备上(例如 Intel GPU),通常仍然存在一些限制,这些限制强加了我们是否可以真正使用该主机分配目录或必须对其进行镜像。在 Intel 上,主机地址必须是页面对齐的,并且长度必须是 128 字节的倍数(偶数缓存行)。 (我通常只是将两者页面对齐。)我不确定 AMD 和其他人的要求是什么。
查看 aligned_alloc
或过度分配几个额外的页面,并使用页面边界作为基础。