Per ridurre il tempo di trasferimento da host a dispositivo per la mia applicazione, desidero utilizzare la memoria bloccata. NVIDIA's best practices guide propone buffer di mappatura e di scrittura dei dati utilizzando il seguente codice:Come utilizzare la memoria bloccata/memoria mappata in 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 raccomanda di utilizzare le chiamate a clEnqueueMapBuffer e clEnqueueUnmapBuffer invece di chiamate verso clEnqueueReadBuffer o clEnqueueWriteBuffer.
Qual è il modo corretto di utilizzare la memoria bloccata/la memoria mappata? È necessario scrivere i dati usando enqueueWriteBuffer o è sufficiente enqueueMapBuffer?
Inoltre, qual è la differenza tra CL_MEM_ALLOC_HOST_PTR e CL_MEM_USE_HOST_PTR?
è davvero strano che sia necessario utilizzare clEnqueueWriteBuffer() insieme a Map/Unmap. Da quando si esegue la mappatura e quindi si modifica il puntatore dell'host, si stanno effettivamente modificando i dati della CPU e della GPU. Quando si esegue l'unmap, i dati verranno sincronizzati tra CPU e GPU. Non capisco la necessità per voi di eseguire un clEnqueueWriteBuffer tra MAP + modificare cDataIn e UNMAP. Molto strano... –