В OpenCL NVIDIA SDK, oclCopyComputeOverlap есть пример, который использует 2 очереди для альтернативного переноса буферов/исполняемых ядер. В этом примере используется сопоставленная память.Коммуникация и вычисление перекрытия OpenCL
**//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)
Спасибо
Большое спасибо за ваш ответ. Но я до сих пор не понимаю следующее: 1) Почему он использует приколотую память там, так как схема такова: создайте 3 закрепленных буфера, pinnedA, pinnedB, pinnedResult; создавать закрепленные указатели, flA, flB, flResult; создать 3 обычных буфера, A, B, Результат; enqueue write from host pointer flA to A (половина размера), напишите от flB до B (половина размера) в очереди 1, запустите ядро K1 в очереди 1, запишите запись из flA в A (другая половина), напишите от flB до B (другая половина) в очереди 2; – user2694398
enqueue read from Result (первая половина) для flResult в очереди 1, введите ядро K2 в очередь 2; enqueue read Result (другая половина) в очереди 2. Ядра используют только A, B, Result в качестве буферов. 2) Я имел в виду размер закрепленных буферов (pinnedA, pinnedB, pinnedResult), который добавляет к размеру остальных (A, B, Result). Во всяком случае, еще раз спасибо за то, что вы так быстро ответили – user2694398
Я действительно не знаю подробно, как прикалываются работы. Но этот метод использования является типичным для закрепленной памяти. – DarkZeros