对于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);