2016-09-09 6 views
1

CPUポインタ(cpu_ptr_)がすでに存在すると仮定して、gpu(cl_gpu_mem_)のバッファを作成します。問題は、gpuバッファをCPUポインタ(mapped_ptr)にマップすると、mapped_ptrが元のポインタ(cpu_ptr_)と等しくなく、そのCHECK_EQ(mapped_ptr、cpu_ptr_)がエラーを発生させるということです。clEnequeMapBufferが元のポインタOpenCL Caffeにマップされない理由

 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

OpenCLの実装では、ホストポインタをミラーリングすることができます(非ゼロコピーにします)。真のゼロコピー(インテルGPUなど)をサポートするデバイスでは、依然としてホスト割り当てディレクトリを実際に使用できるかどうか、またはミラーリングする必要があるという制約があります。インテルでは、ホストアドレスはページアライメントされ、長さは128バイトの倍数(偶数のキャッシュライン)でなければなりません。 (私は通常、両方のページを整列させるだけです)AMDと他の要件は何か分かりません。

aligned_allocを調べるか、余分なページをいくつか追加してベースにページ境界を使用してください。

+0

アドバイスをいただきありがとうございます。私はエラーを見つけて修正しようとしました。 –