2017-10-05 9 views
-1

私はOpenCLを使用してCUDAで書かれたコードをアルテラのFPGA上で実行しようとしています。私はバッファにあると思われるデータを読み戻す際に問題が発生しています。私はCUDAのバージョンと同じ構造を使用していますが、cudaMallocはすべてのタイプのポインタにメモリを割り当てることができますが、clCreateBufferではcl_memを使用する必要があります。私のコードは次のようになります。OpenCL、ホストからのデバイスバッファポインタを管理しますか?

cl_mem d_buffer=clCreateBuffer(...); 
//CUDA version: 
//float* d_buffer; 
//cudaMalloc((void **)&d_buffer, MemSz); 

clEnqueueWriteBuffer(queue, d_buffer, ..., h_data,); 
//cudaMemcpy(d_buffer, h_Data, MemSz, cudaMemcpyHostToDevice); 

#define d_buffer(index1, index2, index3) &d_buffer + index1/index2*index3 
//#define d_buffer(index1, index2, index3) d_buffer + index1/index2*index3 

cl_mem* d_data=d_buffer(1,2,3); 

clEnqueueReadBuffer(queue, *d_data,...)// Error reading d_data 

私はclCreateBufferためclEnqueueMapBufferまたはCL_MEM_ALLOC_HOST_PTRを試みたが、それはどちらか動作しません。

答えて

1

cl_memは、不透明なオブジェクトです。あなたはそれに対してポインタ演算を行うべきではありません。そうしようとすると、非常に厄介なバグが発生します。

私はCUDAがバッファ割り当てをどのように処理するかに慣れていませんが、あなたのコメントアウトされたコードの意味は、CUDAバッファは常にHost-Visibleであるということです。これは非常に厳密にOpenCLのケースではありません。 OpenCLを使用すると、バッファをホストから見えるメモリに「マップ」できますが、ホストには暗黙的に表示されません。バッファの任意のインデックスを読み取る場合は、最初にマップするか、データをホストするためにコピーする必要があります。

float * h_data = new float[1000]; 
cl_mem d_buffer=clCreateBuffer(...); 

clEnqueueWriteBuffer(queue, d_buffer, true, 0, 1000 * sizeof(float), h_data, 0, nullptr, nullptr); 
//======OR====== 
//float * d_data = static_cast<float*>(clEnqueueMapBuffer(queue, d_buffer, true, CL_MAP_WRITE, 0, 1000 * sizeof(float), 0, nullptr, nullptr, nullptr)); 
//std::copy(h_data, h_data + 1000, d_data); 
//clEnqueueUnmapMemObject(queue, d_buffer, d_data, 0, nullptr, nullptr); 
//clEnqueueBarrier(queue); 

//Do work with buffer, probably in OpenCL Kernel... 

float result; 
size_t index = 1/2 * 3; //This is what you wrote in the original post 
clEnqueueReadBuffer(queue, d_buffer, true, index * sizeof(float), 1 * sizeof(float), &result, 0, nullptr, nullptr); 
//======OR====== 
//float * result_ptr = static_cast<float*>(clEnqueueMapBuffer(queue, d_buffer, true, CL_MAP_READ, index * sizeof(float), 1 * sizeof(float), 0, nullptr, nullptr, nullptr)); 
//result = *result_ptr; 
//clEnqueueUnmapMemObject(queue, d_buffer, result_ptr, 0, nullptr, nullptr); 
//clEnqueueBarrier(queue); 

std::cout << "Result was " << result << std::endl; 
関連する問題