OpenCL 2.0标准中支持三种类型的SVM。
- 粗粒度缓冲SVM:共享发生的粒度为OpenCL缓冲存储器对象区域。不支持跨设备的原子操作。
- 细粒度缓冲SVM:SVM由OpenCL API函数(clSVMAlloc)显式地创建。共享发生的粒度为OpenCL缓冲存储器对象中独立的加载和存储。支持跨设备的原子操作,但是该功能是可选的。
- 细粒度系统SVM:SVM由操作系统函数(如malloc、new或其他函数)创建。共享发生的粒度为主机内存中独立的加载和存储。支持跨设备的原子操作,但是该功能是可选的。
跨设备原子操作或SVM原子操作为原子函数和栅栏(fence)操作,可以用来协调主机和内核同时访问存储器对象。细粒度类型有选择地支持原子操作,粗粒度类型不支持原子操作。
接下来会讲解SVM的特性,不同的SVM类型提供的SVM特性也是不同的。要想SVM能提供越多的特性,相应的硬件、操作系统和设备驱动也越复杂。所以,对于这三种SVM类型,并不要求OpenCL平台和设备都支持。实际上,粗粒度缓冲SVM是OpenCL 2.0平台都支持的,细粒度的类型都是可选的。
对于OpenCL设备支持哪种SVM类型,可以使用函数clGetDeviceInfo查询CL_DEVICE_SVM_CAPABILITIES属性结果:
cl_device_svm_capabilities caps;
cl_int err = clGetDeviceInfo(deviceID,
CL_DEVICE_SVM_CAPABILITIES,
sizeof(cl_device_svm_capabilities),
&caps, 0);
上述代码的结果可以用下表来总结。当下表中第一列表达式为真时,相应的SVM类型在“SVM类型”一列列出。
在AMD R9 285的GPU设备上,支持粗粒度缓冲SVM和细粒度缓冲SVM。