Aby zmniejszyć czas transferu z hosta do urządzenia dla mojej aplikacji, chcę użyć przypiętej pamięci. NVIDIA's best practices guide proponuje bufory mapowania i zapisywania danych za pomocą następującego kodu:Używanie przypiętej pamięci/zmapowanej pamięci w 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 zaleca stosowanie połączeń do clEnqueueMapBuffer i clEnqueueUnmapBuffer zamiast wywołań clEnqueueReadBuffer lub clEnqueueWriteBuffer.
Jaki jest właściwy sposób użycia przypiętej pamięci/zmapowanej pamięci? Czy konieczne jest zapisanie danych przy użyciu enqueueWriteBuffer lub czy program EnqueueMapBuffer jest wystarczający?
Czym różni się CL_MEM_ALLOC_HOST_PTR od CL_MEM_USE_HOST_PTR?
To naprawdę dziwne, że musisz użyć clEnqueueWriteBuffer() wraz z Map/Unmap. Odkąd robisz Mapę, a następnie zmieniasz wskaźnik hosta, zmieniasz dane zarówno CPU, jak i GPU. Kiedy zrobisz mapowanie, dane zostaną zsynchronizowane pomiędzy procesorem a stroną GPU. Nie rozumiem potrzeby wykonywania clEnqueueWriteBuffer między MAP + zmiana cDataIn i UNMAP. Bardzo dziwne... –