OpenCL SVM缓冲创建与释放

为了便于后续章节讲述,我们先讲解SVM缓冲操作。在本章后续章节我们将知道创建SVM缓冲有两种方式:缓冲分配和系统分配,在此我们暂时讲解缓冲分配SVM缓冲的操作,包含SVM缓冲创建与释放、SVM缓冲映射与解映射、SVM缓冲填充与拷贝等操作。

SVM缓冲创建与释放

可以使用如下函数来创建SVM缓冲:

void *clSVMAlloc (cl_context context,
                    cl_svm_mem_flags flags,
                    size_t size,
                    unsigned int alignment)
  • 参数context为一个有效的上下文,用于创建SVM缓冲。

  • 参数f lags为一个位域,用于指定SVM缓冲分配和使用信息。详细值见下表。

cl_svm_mem_flags支持列表

  • 参数size为分配的SVM缓冲的大小,单位为字节。
  • 参数alignment为新创建的缓冲区内存区域所需的最小对齐大小,单位为字节。该值必须为2的幂次方,最大为OpenCL设备支持的最大数据类型。对于完全简档,最大数据类型为long16;对于嵌入式简档,如果设备支持64位整数,最大数据类型为long16,否则为int16。如果alignment为0,默认使用最大的数据类型。

函数clSVMAlloc用于分配一个共享虚拟内存,它可以在上下文中的主机与所有设备间共享。如果没有指定CL_MEM_SVM_FINE_GRAIN_BUFFER,则创建的是粗粒度SVM缓冲。如果没有指定CL_MEM_SVM_ATOMICS,则创建的SVM缓冲不支持OpenCL 2.0的SVM层级的原子操作。
如下代码展示了clSVMAlloc的使用:

……
int DataNumber = 1000;
float * inputData = (float *)clSVMAlloc(context,
                                            CL_MEM_READ_WRITE,
                                            sizeof(float) * DataNumber, 0);
……

在上述代码中,未定义CL_MEM_SVM_FINE_GRAIN_BUFFER,所以分配的SVM缓冲为粗粒度缓冲SVM。
可以使用如下函数来释放创建的SVM缓冲:

void clSVMFree (cl_context context, void *svm_pointer)
cl_int clEnqueueSVMFree (cl_command_queue command_queue,
                              cl_uint num_svm_pointers,
void *svm_pointers[],
                              void (CL_CALLBACK *pfn_free_func)(
                              cl_command_queue queue,
                              cl_uint num_svm_pointers,
                              void *svm_pointers[],
                              void *user_data),
                              void *user_data,
                              cl_uint num_events_in_wait_list,
                              const cl_event *event_wait_list,
                              cl_event *event)
  • 参数context为一个有效的上下文,用于创建SVM缓冲。
  • 参数svm_pointer必须是调用clSVMAlloc返回的值,指定将要释放的共享虚拟内存指针。
  • 参数command_queue为一个有效的主机命令队列。
  • 参数svm_pointers和num_svm_pointers指定将要释放的共享虚拟内存指针。
  • 参数pfn_free_func指定释放SVM指针将会调用的回调函数。
  • 参数user_data,当调用pfn_free_func时,作为use_data参数传递,可以为NULL。

函数clSVMFree、clEnqueueSVMFree都是释放clSVMAlloc创建的共享虚拟存储器对象。函数clEnqueueSVMFree需要入队命令来实现相应操作,并且svm_pointers可以为共享系统内存指针。
如下代码展示了使用函数clSVMAlloc或clEnqueueSVMFree释放创建的粗粒度缓冲SVM:

clSVMFree(context, inputData);
或者:

err = clEnqueueSVMFree(cmdqueue, 1, (void **)&inputData,
                            NULL, NULL, 0, NULL, NULL);

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程