cuda学习笔记之异步并行执行

来源:互联网 发布:数组排序jquery 编辑:程序博客网 时间:2024/05/01 04:36

分类: CUDA
 2526人阅读 评论(1) 收藏 举报
cuda多线程direct3d集群api编译器

异步函数使得主机端与设备端并行执行:控制在设备还没有完成前就被返回给主机线程;

    包括:

      kernel启动; 以Async为后缀的内存拷贝函数; device到device内存拷贝函数;存储器初始化函数,比如cudaMemset(),cudaMemset2D(),cudaMemset3D();

     一些设备能够在kernel执行期间,执行pinned memory和显存间的数据传输,可以通过调用cudaGetDeviceProperties()检验;

 

异步执行意义:一个流内的计算与数据拷贝时依次进行的;

                     不同流之间的这些操作可以同时执行;

                     当GPU传输数据时,主机线程不必等待可以进行一些运算,提高cpu与GPu并行工作;

 

如果调用了同步版本的GPU函数,只能在设备完成任务后才能返回主机线程,此时主机端进入yield,block或者spin状态,可以由cudaSetDeviceFlags()或cuCtxCreate()来选择主机端在进行GPU计算时进入的状态;

 

:程序通过流来管理并发,每个流是按顺序执行的一系列操作;不同流之间乱序执行或者并行执行;定义是创建一个cudaStream_t对象;

      当使用两个流处理同一块存储时,必须使用pinned memory;

      如果主机线程在来自不同流的两个操作之间调用了pinned memory的分配,显存分配,显存设置,设备与设备间的双向拷贝或0流的两项操作,则这两项操作无法并行执行;

     可以设置CUDA_LAUNCH_BLOCKING = 1,禁用所有cuda应用程序异步执行;

      cudaStreamSynchronize() 强制cuda运行时等待流中所有操作完成;函数没有采取中断,会进行轮询,占用大量CPU资源;

       

事件

     运行时API可以通过事件管理密切监控设备进度并执行准确计时,可以异步的记录下程序内任一点的事件,并可以查询这些事件被记录的时间;时间使用的GPU计时器,比CPU计时器更加准确;事件管理可以用于测量程序运行时间,或者管理CPU和GPU同时进行运算;

CUDA与图形学API互操作

   经过配置可以与OpenGL,Direct3D共同使用;

多设备与设备集群:

               主机端的线程数量可以多于设备数量,但是同一时刻一个设备上只能有一个线程;

              多个设备可以通过C提供的多线程进行管理;

              可以通过openMP管理多个设备;

                cuda可以与MPI联用;

OpenMP:用于共享内存并行系统的多线程程序设计的一套指导性注释;提供并行算法的高层抽象描述,程序员在源代码中加入专用pragama来知名自己的意图,编译器自动将程序并行化;非常适用于基于数据分级的多线程程序设计;不适合需要复杂线程同步和互斥的场合;不能在飞共享内存系统(如计算集群常用mpi)上使用;

0 0
原创粉丝点击