文件名称:并行计算与CUDA编程理论-onfi接口规范
文件大小:3.89MB
文件格式:PDF
更新时间:2024-07-05 04:53:41
CUDA
东北大学硕士学位论文 第2章并行计算与CUDA编程理论 2.3.4 CUDA异步并行执行 异步执行是指设备端函数从主机端启动到设备端执行完成之间的这段时间,控制已 经返回到主机线程,告诉主机端线程可以根据需要执行下一步操作。通俗地讲,主机端 函数的运行、kernel启动或终止,与设备端真正完成这些操作的关系是异步的。为使 CUDA中Host端与Device端并行执行,许多函数需要设置为异步。 异步执行的意义在于【221:同一Stream内计算与数据传输虽是顺序执行,但该Stream 的数据计算可以和另外一个Stream的数据传输同时进行,这样能够令GPU中执行单元 与存储控制单元同时工作,以提高工作效率;另外,主机线程也不需要一直等待GPU 运行结束,CPU可在设备端进行数据运算或者数据拷贝时,利用这个空闲时间执行其它 一些任务,使得CPU与GPU实现并行执行。 kernel的启动与显存中设备端到设备端的数据读写是异步执行的,而主机端内存与 设备端显存之间数据的传输可以异步实现也可以同步实现。如果调用异步 cudaMemcpyAsync()函数在主机与设备端传输数据,主机端线程不会等待Host与Device 间数据是否拷贝完毕就开始执行下一步程序,也就是说Host线程与另外一个数据传输 任务之间是同时进行的。设备端如果是调用同步版本的GPU内核拷贝函数 cudaMemcpy(),拷贝任务执行完成之前控制是不会返回Host端线程的。此时主机端 thread会处于Yield、Block以及Spin(分别是让步、阻滞、自旋)三种状态之一。从 Host端来看,kemel启动是异步执行的。Host端若要对kernel函数计算结果进行操作, 就需要考虑一致性问题,因为内核的异步执行会导致计算结果无法保证更新问题。此时, 可以使用cudaThreadSynchronizeoi函数来保证操作顺序的一致性。 CUDA异步并发执行通过流来管理,流是系统中顺序执行的一组操作集合,需要根 据Stream参数区分是否同属一个流【231。不同流之问程序执行则可能是乱序的,也可能 是并行执行的。使用流和异步,可将主机端与设备端数据传输耗时隐藏。同一Stream 中kernel函数的启动一定是同步的,kernel函数若没有显式指明所属的Stream,就会被 CUDA默认为Stream0。 使用异步执行算法耗时等于执行时间与数据传输时间的和;而当使用Stream与异 步之后,算法耗时将会变为执行时间加上传输时间与Stream数量的比值,说明算法传 输时间已经被降低了,有助于隐藏数据传输耗时,因此算法的实现中要尽量使用Stream 技术。 一14. zhi ku quan 20150807 万方数据