使用如下函数可以实现SVM缓冲数据填充:
cl_int clEnqueueSVMMemFill(cl_command_queue command_queue,
void *svm_ptr,
const void *pattern,
size_t pattern_size,
size_t size,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
cl_event *event)
- 参数command_queue为一个有效的主机命令队列。
- 参数svm_ptr指向内存区域的指针,内存区域的值将会用pattern来填充。
- 参数pattern指向数据范式,其大小为pattern_size,单位为字节。
- 参数size为内存区域填充的字节大小,位置从svm_ptr开始,其值必须是pattern_size的整数倍。
函数clEnqueueSVMMemFill实现SVM缓冲的数据填充。与缓冲区对象填充一样,将SVM缓冲的值用pattern来填充。
如下代码展示了把分配的细粒度缓冲SVM填充值设置为4:
……
int DataNumber = 1000;
float * inputData = (float *)clSVMAlloc(context,
CL_MEM_READ_WRITE |
CL_MEM_SVM_FINE_GRAIN_BUFFER,
sizeof(float) * DataNumber, 0);
float InitData = 4.0;
err = clEnqueueSVMMemFill(cmdqueue, inputData, &InitData,
sizeof(InitData),
sizeof(float) * DataNumber, 0, NULL, NULL);
……
使用如下函数可以实现在两个SVM缓冲间数据拷贝:
cl_int clEnqueueSVMMemcpy (cl_command_queue command_queue,
cl_bool blocking_copy,
void *dst_ptr,
const void *src_ptr,
size_t size,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
cl_event *event)
- 参数command_queue为一个有效的主机命令队列。
- 参数blocking_copy指示拷贝操作是阻塞操作还是非阻塞操作。
- 参数size确定需要拷贝数据的字节大小。
- 参数dst_ptr为指向目的SVM缓冲的指针。
- 参数src_ptr为指向源SVM缓冲的指针。
函数clEnqueueSVMMemcpy实现在两个SVM缓冲中进行数据拷贝。
如下代码实现了把之前细粒度缓冲SVM inputData中的数据拷贝到细粒度缓冲SVM tempData中:
……
float *tempData = (float *)clSVMAlloc(context,
CL_MEM_READ_WRITE |
CL_MEM_SVM_FINE_GRAIN_BUFFER,
sizeof(float) * size, 0);
err = clEnqueueSVMMemcpy(cmdqueue, CL_TRUE, tempData, inputFloats,
sizeof(float) * DataNumber, 0, NULL, NULL);
……