异步并发执行:
CUDA将以下操作公开为可以相互并行操作的独立任务:
1:在主机上计算;
2:在设备上计算;
3:内存从主机传输到设备;
4:内存从设备传输到主机;
5:内存在给定设备的内存中传输;
6:内存在设备间传输。
这些操作之间实现的并发级别将取决于设备的功能集和计算能力,如下所述:
主机和设备之间的并行执行:
通过在设备完成所请求的任务之前将控制权返回给主机线程的异步库函数来简化并行主机的执行。 在适当的设备资源可用的情况下,使用异步调用,可以将许多设备操作排队在一起以便由CUDA驱动程序执行。 这减轻了管理设备的许多责任的主线程,使其免于其他任务。 以下设备操作对于主机是异步的:
1:内核启动;
2:在单个设备的内存中复制;
3:内存从64 KB或更少的内存块的主机复制到设备;
4:使用Async后缀的函数执行内存拷贝;
5:内存设置函数调用
编程人员可以通过将CUDA_LAUNCH_BLOCKING环境变量设置为1来全局禁用运行在系统上的所有CUDA应用程序的内核启动的异步性。此功能仅用于调试目的,不应用作使生产软件可靠运行的方式.
并发内核执行:
计算能力2.x和更高的一些设备可以同时执行多个内核。 应用程序可以通过检查concurrentKernels设备属性(请参阅设备枚举)来查询此功能,对于支持它的设备,该属性等于1。
设备可同时执行的最大内核启动数取决于其计算能力,如表14所示:
来自一个CUDA上下文的内核不能与来自另一个CUDA上下文的内核同时执行。
使用许多纹理或大量本地内存的内核不太可能与其他内核同时执行。
数据传输和内核执行的重叠:
一些设备可以在内核执行的同时与GPU执行异步内存拷贝。 应用程序可以通过检查asyncEngineCount设备属性来查询此功能,对于支持它的设备,该属性大于零。 如果主机内存涉及副本,则必须进行页面锁定。
也可以在内核执行的同时(在支持concurrentKernels设备属性的设备上)或在设备上执行设备内拷贝(对于支持asyncEngineCount属性的设备)。 使用标准的存储器复制功能来初始化复制,其中目标和源地址驻留在同一设备上。
并发数据传输:
计算能力2.x及更高版本的某些设备可以与设备之间的拷贝重叠。 应用程序可以通过检查asyncEngineCount设备属性来查询此功能,对于支持该设备的设备,该属性等于2。 为了重叠,传输中涉及的任何主机内存必须为页锁定内存。