Afin de réduire le temps de transfert entre l'hôte et l'appareil pour mon application, je souhaite utiliser la mémoire épinglée. NVIDIA's best practices guide propose des tampons de cartographie et de l'écriture des données en utilisant le code suivant:Comment utiliser la mémoire épinglée/la mémoire mappée dans 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 recommande d'utiliser des appels à clEnqueueMapBuffer et clEnqueueUnmapBuffer au lieu des appels à clEnqueueReadBuffer ou clEnqueueWriteBuffer.
Quelle est la bonne façon d'utiliser la mémoire épinglée/la mémoire mappée? Est-il nécessaire d'écrire les données en utilisant enqueueWriteBuffer ou est-ce que enqueueMapBuffer est suffisant?
De même, quelle est la différence entre CL_MEM_ALLOC_HOST_PTR et CL_MEM_USE_HOST_PTR?
Il est vraiment étrange que vous deviez utiliser clEnqueueWriteBuffer() avec Map/Unmap. Depuis que vous faites la carte, puis changez le pointeur d'hôte, vous changez réellement les données de processeur et de GPU. Lorsque vous effectuez l'unmap, les données seront synchronisées entre le CPU et le côté GPU. Je ne comprends pas la nécessité pour vous d'effectuer un clEnqueueWriteBuffer entre MAP + modifier cDataIn et UNMAP. Très étrange... –