3.2.6 异步并发执行
3.2.6.1 主机和设备间异步执行
为了易于使用主机和设备间的异步执行,一些函数是异步的:在设备完全完成任务前,控制已经返回给主机线程了。它们是:
1、内核发射;
2、存储器拷贝函数中带有Async后缀的;
3、设备间数据拷贝函数;
4、设置设备存储器的函数;
程序员可通过将CUDA_LAUNCH_BLOCKING环境变量设置为1来全局禁用所有运行在系统上的应用的异步内核发射。提供这个特性只是为了调试,永远不能作为使软件产品运行得可靠的方式。
当应用通过CUDA调试器或CUDA profiler运行时,所有的内核发射都是同步的。
3.2.6.2 数据传输和内核执行重叠
一些计算能力1.1或更高的设备可在内核执行时,在分页锁定存储器和设备存储器之间拷贝数据。应用可以通过调用cudaGetDeviceProperties()函数检查deviceOverlap属性查询这种能力。这种能力目前只支持不涉及CUDA数组和使用cudaMallocPitch()分配的二维数组的存储器拷贝(参见3.2.1节)。
3.2.6.3 并发内核执行
一些计算能力2.0的设备可并发执行多个内核。应用可以通过调用cudaGetDeviceProperties()函数检查concurrentKernels属性以查询这种能力。
设备最大可并发执行的内核数目是4。
来自不同CUDA上下文的内核不能并发执行。
使用了许多纹理或大量本地存储器的内核和其它内核并发执行的可能性比较小。
3.2.6.4 并发数据传输
在计算能力2.0的设备上,从主机分页锁定存储器复制数据到设备存储器和从设备存储器复制数据到主机分页锁定存储器,这两个操作可并发执行。