0

我寻找一种将数据从两个 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 参数,对吗?

谢谢

4

1 回答 1

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 

因此,复制 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

于 2016-03-23T11:49:11.857 回答