2013-08-18 3 views
1

В 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

Если я понял ваш вопрос правильно:

1) Да, вы можете использовать любой вид памяти (возлагал, хост указатель и т. д.), и перекрытие все равно будет происходить. Насколько вы используете две очереди, и HW/drivers поддерживают ее.

Но оставайтесь, что очереди всегда не поддаются проверке. И в этом случае необходимы события, чтобы не допустить, чтобы очередь копирования копировала несогласованные данные работающего ядра.

2) Я думаю, вы используете 2 раза память, если используете фиксированную память, одну для закрепленной и другую для временной копии. Но я не уверен на 100%, может быть, это всего лишь указатель.

+0

Большое спасибо за ваш ответ. Но я до сих пор не понимаю следующее: 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

+0

enqueue read from Result (первая половина) для flResult в очереди 1, введите ядро ​​K2 в очередь 2; enqueue read Result (другая половина) в очереди 2. Ядра используют только A, B, Result в качестве буферов. 2) Я имел в виду размер закрепленных буферов (pinnedA, pinnedB, pinnedResult), который добавляет к размеру остальных (A, B, Result). Во всяком случае, еще раз спасибо за то, что вы так быстро ответили – user2694398

+0

Я действительно не знаю подробно, как прикалываются работы. Но этот метод использования является типичным для закрепленной памяти. – DarkZeros