为方便起见后面的内容将按照话题来分类~
异步并行执行
主机和设备间并行执行
为了支持主机和设备的并行执行,CUDA提供了一些异步函数。异步是指设备在完成功能执行之前就将控制权交还给主机线程,以便主机线程继续执行。这些函数有:
1、内涵启动(Kernel Launches);
2、同一设备内存中两个地址块之间的数据传输;
3、从主机到设备的小于或等于64KB的一次数据块传输;
4、使用Async前缀函数进行的数据传输;
5、内存置位函数调用(Memory set functions calls)。
程序员可以通过设置环境变量CUDA_LAUNCH_BLOCKING来开启或者关闭内核启动(Kernel Launch)的异步功能。但是这一方法仅限于调试,在任何产品代码中不应当关闭异步内核启动。
内核启动在下面这些情况下则是同步的:
1、应用程序通过调试器或者内存检查器运行在计算能力为1.x的设备上。
2、硬件计数器信息正被性能分析器收集。
将内核启动与数据传输重叠起来
对于一些计算能力等于或高于1.1的设备,它们可以将内核启动任务和锁页内存到设备内存的数据传输任务并行执行。应用程序可以检查设备属性中的asyncEngineCount项来确定设备是否支持这一功能。当该项值大于0时代表设备支持这一层次的并行。对于计算能力1.x的设备,该功能不支持通过cudaMallocPitch()函数分配的CUDA数组或2D数组。