在主机端可以使用memset()函数实现对已分配好的存储空间填充某个给定的值。在OpenCL中,也有类似类型的函数实现对已分配好的存储器对象填充某个给定的值。
缓冲区对象数据填充
缓冲区对象可以使用如下函数来实现数据填充:
cl_int clEnqueueFillBuffer (cl_command_queue command_queue,
cl_mem buffer,
const void *pattern,
size_t pattern_size,
size_t offset,
size_t size,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
cl_event *event)
- 参数command_queue为这个填充命令队列要插入的队列。
-
参数buffer为一个有效的缓冲区对象。buffer和command_queue必须位于同一个OpenCL上下文中。
-
参数pattern指向数据范式,其大小为pattern_size。用pattern填充的区域在buffer中的偏移量为offset,大小为size。数据范式必须是OpenCL所支持的标量或矢量的整数或浮点数类型。
-
参数offset为填充区域在buffer中的偏移量,单位为字节。其大小必须是patter_size的整数倍。
-
参数size为buffer填充的字节数,其大小必须是patter_size的整数倍。
如下代码实现了把总长为80个整数类型的缓冲区对象前40个值填充为1,将后40个值填充为2:
……
int data = 1;
int data_out[80];
clEnqueueFillBuffer(cmdqueue, d_a, &aa, sizeof(data), 0,
sizeof(int) * 40,
0, NULL, NULL);
data = 2;
clEnqueueFillBuffer(cmdqueue, d_a, &aa, sizeof(data),
sizeof(int) * 40,
sizeof(int) * 40, 0, NULL, NULL);
clEnqueueReadBuffer(cmdqueue, d_a, CL_TRUE, 0, sizeof(int) * 80,
data_out, 0, NULL, NULL);
……
大家可以输出查看data_out中的值。
clEnqueueFillBuffer函数在OpenCL 1.2中增加的函数。在这之前,要完成类型功能可以选择:
①在主机端memset填充,然后用clEnqueueWriteBuffer来填充存储器对象;
②启动一个内核来实现填充赋值操作。有了clEnqueueFillBuffer函数,极大地方便了我们的编程。