Има пример в OpenCL NVIDIA SDK, oclCopyComputeOverlap, който използва 2 опашки за алтернативно прехвърляне на буфери / изпълнение на ядра. В този пример се използва картографирана памет.
**//pinned memory**
cmPinnedSrcA = clCreateBuffer(cxGPUContext, CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, szBuffBytes, NULL, &ciErrNum);
**//host pointer for pinned memory**
fSourceA = (cl_float*)clEnqueueMapBuffer(cqCommandQueue[0], cmPinnedSrcA, CL_TRUE, CL_MAP_WRITE, 0, szBuffBytes, 0, NULL, NULL, &ciErrNum);
...
**//normal device buffer**
cmDevSrcA = clCreateBuffer(cxGPUContext, CL_MEM_READ_ONLY, szBuffBytes, NULL, &ciErrNum);
**//write half the data from host pointer to device buffer**
ciErrNum = clEnqueueWriteBuffer(cqCommandQueue[0], cmDevSrcA, CL_FALSE, 0, szHalfBuffer, (void*)&fSourceA[0], 0, NULL, NULL);
Имам 2 въпроса: 1) Има ли нужда да използвам фиксирана памет, за да възникне припокриването? Не може ли fSourceA да бъде просто обикновен указател на хост,
fSourceA = (cl_float *)malloc(szBuffBytes);
...
//write random data in fSourceA
2) cmPinnedSrcA не се използва в ядрото, вместо него се използва cmDevSrcA. Мястото, заемано от буферите на устройството, все още ли не расте? (пространството, необходимо за cmPinnedSrcA, е добавено към пространството, необходимо за cmDevSrcA)
Благодаря ти