您可以使用 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