我搜索了一种方法,以两种方式将数据从两个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函数实现此目的的方法,但是此函数没有任何stride参数,对吧? / p>
由于
答案 0 :(得分: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,以及偏移和区域。因为它很容易弄乱。 (如果你使用它,请检查我的代码)