OpenCL SVM缓冲映射与解映射

对于SVM缓冲,可以通过映射SVM缓冲使主机端更新SVM缓冲区域的数据。解映射则表示主机已经更新完SVM缓冲区域的数据。这对于粗粒度SVM缓冲十分有用。
使用如下函数可以映射和解映射SVM缓冲:

cl_int clEnqueueSVMMap(cl_command_queue command_queue,
                            cl_bool blocking_map,
                            cl_map_flags map_flags,
                            void *svm_ptr,
                            size_t size,
                            cl_uint num_events_in_wait_list,
                            const cl_event *event_wait_list,
                            cl_event *event)
cl_int clEnqueueSVMUnmap(cl_command_queue command_queue,
                              void *svm_ptr,
                              cl_uint num_events_in_wait_list,
                              const cl_event *event_wait_list,
                              cl_event *event)
  • 参数command_queue为一个有效的主机命令队列。
  • 参数blocking_map指示映射操作是阻塞操作还是非阻塞操作。
  • 参数map_f lags为一个位域,其值见表5-10。
  • 参数svm_ptr为指向内存区域的指针。
  • 参数size为主机更新的内存区域的大小,单位为字节。

函数clEnqueueSVMMap入队一个命令,指示主机更新SVM缓冲区域的数据。函数clEnqueueSVMUnmap入队一个命令,指示主机已更新SVM缓冲区域的数据。
如下代码展示了使用函数clEnqueueSVMMap使主机更新SVM缓冲,更新完成后使用函数clEnqueueSVMUnmap来解映射:

……
int DataNumber = 1000;
float * inputData = (float *)clSVMAlloc(context,
                                                CL_MEM_READ_WRITE,
                                                sizeof(float) * DataNumber, 0);
//映射
err = clEnqueueSVMMap(cmdqueue, CL_TRUE, CL_MAP_WRITE,
                          inputData, sizeof(Element) * DataNumber
                          , 0, 0, 0);
……//主机端修改操作inputData
//解映射
err = clEnqueueSVMUnmap(cmdqueue, inputData, 0, 0, 0);

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程