Развернутая копия между 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, а также со смещениями и регионами. Поскольку это очень легко запутаться. (И, пожалуйста, проверьте мой код, если вы его используете)