Развернутая копия между HOST и DEVICE clEnqueueWriteBufferRect

Я ищу способ передачи данных из двух буферов HOST в один буфер DEVICE следующим пошаговым способом:

Ниже приведены два буфера хоста Host_buffer_1 = [0 5] // копирование на устройство с шагом, равным 5 Host_buffer_2 = [1 2 3 4 6 7 8 9] // // каждая область из 4 чисел копируется с шагом

Мне нужно, чтобы результирующий буфер устройства был буфером устройства [0 1 2 3 4 5 6 7 8 9]

Должен ли я реализовать это сначала в HOST, а затем в обычном режиме передачи на устройство, или вы знаете способ достижения этого, например, с помощью функции clEnqueueWriteBufferRect, но эта функция не имеет какого-либо параметра шага, верно?

Спасибо

1 ответ

Вы можете использовать вызовы cl, чтобы сделать прямоугольную копию патча на лету. Тем не менее, с точки зрения производительности, я не уверен, что это правильный подход.

Если вы формируете свои данные как 2D:

0 1 2 3 4
5 6 7 8 9

Тогда карта буферов выглядит так:

Device         Host1  Host2
1 2 2 2 2      1      2 2 2 2
1 2 2 2 2      1      2 2 2 2 

Поэтому команды copy rect должны быть:

clEnqueueWriteBufferRect(queue, buffer, CL_FALSE, 
                     {0,0,0},  //buffer_origin
                     {0,0,0},  //host_origin
                     {1,2,1},  //region
                     5*sizeof(type),  //buffer_row_pitch
                     0,  //buffer_slice_pitch
                     1*sizeof(type),  //host_row_pitch
                     0,  //host_slice_pitch
                     host1, 0, NULL, NULL);

clEnqueueWriteBufferRect(queue, buffer, CL_FALSE, 
                     {1,0,0},  //buffer_origin
                     {0,0,0},  //host_origin
                     {4,2,1},  //region
                     5*sizeof(type),  //buffer_row_pitch
                     0,  //buffer_slice_pitch
                     4*sizeof(type),  //host_row_pitch
                     0,  //host_slice_pitch
                     host2, 0, NULL, NULL);

Но будьте ОЧЕНЬ осторожны с row_pitch и slice_pitch, а также со смещениями и регионами. Поскольку это очень легко запутаться. (И, пожалуйста, проверьте мой код, если вы его используете)

clEnqueueWriteBufferRect

Другие вопросы по тегам