爲了減少我的應用程序從主機到設備的傳輸時間,我想使用固定內存。 NVIDIA's best practices guide提出映射緩衝劑,並使用下面的代碼寫入數據:如何在OpenCL中使用固定內存/映射內存
cDataIn = (unsigned char*)clEnqueueMapBuffer(cqCommandQue, cmPinnedBufIn, CL_TRUE,CL_MAP_WRITE, 0, memSize, 0, NULL, NULL, NULL);
for(unsigned int i = 0; i < memSize; i++)
{
cDataIn[i] = (unsigned char)(i & 0xff);
}
clEnqueueWriteBuffer(cqCommandQue, cmDevBufIn, CL_FALSE, 0,
szBuffBytes, cDataIn, 0, NULL, NULL);
Intel's optimization guide推薦使用調用clEnqueueMapBuffer和clEnqueueUnmapBuffer代替調用clEnqueueReadBuffer或clEnqueueWriteBuffer的。
什麼是使用固定內存/映射內存的正確方法?是否有必要使用enqueueWriteBuffer寫入數據還是enqueueMapBuffer足夠?
另外,CL_MEM_ALLOC_HOST_PTR和CL_MEM_USE_HOST_PTR之間的區別是什麼?
真的很奇怪,你需要使用clEnqueueWriteBuffer()以及Map/Unmap。因爲當你做Map時,然後改變主機指針,你實際上正在改變CPU和GPU數據。當你進行unmap時,數據將在CPU和GPU之間同步。我不明白您需要在MAP +更改cDataIn和UNMAP之間執行clEnqueueWriteBuffer。很奇怪... –