HOST和DEVICE之间的跨文件复制clEnqueueWriteBufferRect

时间:2016-03-23 11:04:20

标签: copy opencl device host stride

我搜索了一种方法,以两种方式将数据从两个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>

由于

1 个答案:

答案 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,以及偏移和区域。因为它很容易弄乱。 (如果你使用它,请检查我的代码)

clEnqueueWriteBufferRect