OpenCL 2.0的一个重要的修订就是支持共享虚拟内存(SVM)。共享虚拟内存属于全局内存,其相当于在主机内存区域上做的扩展,其允许上下文对象上的所有设备能和主机共享这块内存。SVM能将结构体指针作为参数传入内核,这相较之前的标准方便许多。例如,在未使用SVM之前,在主机端创建的链表结构无法传递到内核中,只能一个节点一个节点的传入。那么,2.0之后如何将链表实例通过传参的形式传入内核呢?将内存块拆分成小块的方式不适合OpenCL的内存模型,将其整块传入内核才是真正合理的方式。SVM将打破原先内存模型的限制。
OpenCL 2.0中定义了三种SVM类型:
粗粒度数组SVM
细粒度数组SVM
系统细粒度SVM
读者可以通过表6.1来了解,我们将要讨论的各种SVM。
粗粒度数组SVM可以与OpenCL内存对象进行虚拟地址共享。粗粒度SVM内存与非SVM内存的不同点在于,主机和设备可以共用虚拟内存指针。粗粒度SVM内存需要在主机端进行映射和反映射,这样才能保证最后一次更新的数据对设备可见。为了完成这个功能,主机端线程需要调用clEnqueueMapBuffer()将指定的内存区域阻塞的进行映射。当映射完成后,内核就可以对该内存进行使用。当clEnqueueMapBuffer()返回时,内核对该内存的任何操作,对于主机都是可见的。
我们使用clCreateBuffer()创建非SVM内存,同样SVM也有其创建API——clSVMAlloc(),其