Cuda Streams的概述(一)

最近在做有关Cuda的一个项目, 碰到匪夷所思的问题,在异步的时候发现并没有达到预期的效果,程序没有异步起来,然后在网上找了一个Nvida的有关Cuda Streams的一个ppt,然后照着里面的提示,使程序达到了异步的效果。

首先,先回顾一下简单的简单的处理流程。

在这里插入图片描述

  • 将数据从CPU内存中拷贝到GPU内存中。
  • 启动一个GPU的kernel。
  • 将结果从GPU内存中拷贝到CPU的内存中。
  • 重复上面的操作。
    在Pipelining中的并发相比于串型可以提高性能。
    在这里插入图片描述
    在这里插入图片描述我们可以发现在并发的情况下,程序的运行速度有显著提高。在Tile DGEMM的实验中,将CPU的浮点数运算作为baseline, 当串型使用GPU(K20X)时,达到519Gflop/s(提高2.3倍),当两路并发时,达到了663Gflop/s(提高3倍),当3路并发时,速度达到990Gflops/s(提高4倍),在GPU和CPU同时的4路并发中,速度达到了1180Gflops/s(提高了5.3倍)。
    在这里插入图片描述

通过MPS(Multi-process service)进行并发

背景介绍:

  • 要求每一个进程拥有唯一的context。
  • 设备上一次只能有一个context处于活跃状态。
  • 在单GPU上的多个进程不能并发操作。

MPS是驱动和应用之间的软件层。

  • 可以一个context可以涵盖所有的CUDA调用。
  • 多个进程可以并发的进行处理。

MPS的优点:

  • Oversubscribe MPI 进程并自动进行并发操作。
  • 简单自然的加速路径。(特别是当应用中已经准备好MPI)

MPS的缺点:

  • MPS增加了启动的延迟。
  • 在旧的硬件上不支持。(Kepler或者之后的架构)
  • 只能在Linux上使用

鉴于MPS的局限性,可以考虑通过Streams方式来进行并发。

通过Streams进行并发

Cuda调用对于主机端来说不是同步的就是异步的,

  • 同步:把work入队然后等待工作完成。
  • 异步:work入队之后立刻返回。
    运行的kernel会自动异步地overlap主机端。

在这里插入图片描述

原创文章 5 获赞 3 访问量 111

猜你喜欢

转载自blog.csdn.net/huikougai2799/article/details/106130024