为什么不将clEnequeMapBuffer映射到原始指针,OpenCL,Caffe

时间:2016-09-09 16:57:56

标签: 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";

我不知道为什么会发生这种错误。您能否就此问题或任何解决方案向我提出任何建议。非常感谢你。

1 个答案:

答案 0 :(得分:1)

OpenCL实现可以自由镜像主机指针(使其非零复制)。在支持真正零拷贝的设备(例如Intel GPU)上,仍然存在一些限制因素,即我们是否真的可以使用该主机分配目录或必须镜像它。在Intel上,主机地址必须是页面对齐的,长度必须是128字节的倍数(偶数高速缓存行)。 (我通常只是将两者对齐。)我不确定AMD和其他要求是什么。

查看aligned_alloc或通过分配一些额外的页面并使用页面边界作为基础。