OpenCL SVM缓冲填充与拷贝

使用如下函数可以实现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);
……

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程