在OpenCL 2.0中,一个显著的新特性就是共享虚拟存储器(Shared Virtual Memory, SVM)。SVM使得将链表或树这样的指针链表数据用OpenCL处理变得非常容易。
如下图所示,在OpenCL 1.2中,标准不保证指向主机端数据的指针,在设备内核中能够访问这些数据;也不能保证指向设备端数据的指针,在主机端能够访问这些数据。在OpenCL 1.2中指针数据无法在主机与设备端共享,应用也需要相应地重新设计和修改,如用索引代替指针,并且把数据在主机与设备间拷贝。
如下图所示,OpenCL 2.0 SVM把主机与设备地址空间抽象成一个独立的地址空间,主机与设备都能够直接访问这个地址空间。这使得设备端指向主机地址空间的指针,内核也能直接访问这些数据;主机端指向设备地址空间的指针,主机也能直接访问这些数据。不用在主机与设备间进行数据拷贝,直接使用共享指针就可以了。需要注意的是,OpenCL 2.0 SVM只是在软件层面虚拟出来的共享地址空间,方便了编程人员并行指针链表数据的应用,避免了主机与设备间数据拷贝,这么做可能会提升程序性能。但是在真实硬件环境下,主机与设备有各自独立的地址空间。