首页 > 编程语言 >CUDA C++ / 并发CUDA流

CUDA C++ / 并发CUDA流

时间:2023-02-01 21:58:06浏览次数:39  
标签:函数 stream C++ cudaStreamCreate 流中 默认 并发 CUDA

计算与传输重叠

工作模式

CPU与GPU之间交互有两个引擎:

      • 内存复制引擎:负责CPU和GPU之间的数据传输。
      • 核函数执行引擎:负责CPU向GPU部署核函数任务。

这两个引擎是相互独立的,可以并发执行。

查看是否支持

cudaGetDeviceProperties()函数,通过deviceOverlap属性查看计算机是否支持计算与传输重叠功能。

注意PCle是双通的,也就是一个流在执行核函数的时候,一个流可以从主机向设备传输数据,另一个流也可以同时从设备向主机传输数据。


在一个流中,所有指令必须在下一个流开始之前完成,所有流中核函数均按顺序执行。

默认流

在启动核函数的时候不指定流,则核函数在默认流中执行。默认流会阻止其他流中的所有核函数。

非默认流

启动核函数之前创建流,并启动核函数的时候指定在该流中执行。

控制CUDA流行为的规则

      • 给定流中的所有操作会按序执行。
      • 不同的非默认流无法保证它们之间按照顺序实行。
      • 默认流具有阻断能力,即,它会等待其它已在运行的所有流完成当前操作之后才运行,但在其自身运行完毕之前亦会阻碍其它流的运行。
      • 不同的非默认流中的核函数可以同时交互。

使用案例

使用cudaStreamCreate()函数创建3个流

在3个流上使用cudaMemcpyAsync()函数将主机数据异步传输到设备中;

在3个流上执行核函数

在3个流上利用cudaMemcpyAsync()函数将设备数据异步传输到主机中。

利用cudaStreamSynchronize()和cudaDeviceSynchronize()函数对3个流进行同步。

利用cudaStreamDestroy()函数销毁3个流。

注意:使用cudaMemcpyAsync()函数传输数据时,必须使用cudaMallocHost()或cudaHostAlloc()分配主机内存(内存必须固定)

同一个流内不能实现计算和传输重叠,因为一般一个流上核函数的执行依赖于传输的数据。

可以创建多个非默认流,然年在不同的流中并发执行多个核函数。


流操作

创建非默认流

函数:cudaStreamCreate(cudaStream_t &stream);

使用案例:

cudaStream_t stream

cudaStreamCreate(&stream)

在非默认流中启动核函数

函数:核函数第三个参数为0,第四个参数为需要启动的流。

使用案例:

cudaStream_t stream
cudaStreamCreate(&stream)
KernelFunction<<<blocks,threads,0,stream>>>();

销毁非默认流

函数:cudaStreamDestroy(cudaStream_t stream);

使用案例:

cudaStream_t stream
cudaStreamCreate(&stream)
KernelFunction<<<blocks,threads,0,stream>>>();
cudaStreamDestroy(stream);

 

标签:函数,stream,C++,cudaStreamCreate,流中,默认,并发,CUDA
From: https://www.cnblogs.com/RedNoseBo/p/17083298.html

相关文章

  • C++日期类[2023-02-01]
    C++日期类[2023-02-01]一、考核题目:设计一个日期类,实现时间的加、减操作。二、基本要求:1.描述设计和相关算法思路;2.类体要定义对日期的初始化构造函数,包含一个重载......
  • C/C++ Socket UDP 广播消息的发送与接收
    C/C++SocketUDP广播消息的发送与接收局域网内全网段广播消息的IP地址为:255.255.255.255,向该IP地址发送广播消息,局域网下的任何网段的客户机都能收到广播。对于发送端,如果......
  • goroutine 并发案例
      1.goselect是一种仅能用于channel发送和接收消息的语句,此语句运行期间是阻塞的;当select中没有case语句的时候,会阻塞当前goroutine2.select是go在语言层面提供......
  • C++ Day11 使用单例模式封装log4cpp
    一、实现log4cpp的封装,使其可以像printf一样使用,测试用例如下: 思路:使用可变模板参数,最终达到的效果是在使用 LogInfo、LogError、LogWarn、LogDebug时候可以传递任意类......
  • 闲散随笔的C++教程(一)——绪
    绪在猴子的世界中,编程语言是很多的。你不一定非要选择C++——没错,这并不是一门非常好学的语言。所以当你看到这个开头时就后悔,还是来得及的。但是看样子你是不准备后悔,或......
  • 递归先序输入构造一颗二叉树并输出并求从根结点出发的最大带权和 (c++)
    #include<iostream>#include<cstdio>usingnamespacestd;typedefstructBiTNode//一颗二叉树的结构体{intdata;structBiTNode*lchild,*rchiild;}BiTNode,......
  • C语言&C++
    C语言和C++中都有结构的概念,但是在C语言中结构只有成员变量,而没成员方法,而在C++中结构中,它可以有自己的成员变量和成员函数。但是在C语言中结构的成员是公共的,不管什么人想......
  • C++ 信奥赛 1077:统计满足条件的4位数
    1077:统计满足条件的4位数【题目描述】给定若干个四位数,求出其中满足以下条件的数的个数:个位数上的数字减去千位数上的数字,再减去百位数上的数字,再减去十位数上的数字......
  • detectron2 The detected CUDA version mismatches 错误
    我的报错信息ThedetectedCUDAversion(9.1)mismatchestheversionthatwasusedtocompilePyTorch(11.3).PleasemakesuretousethesameCUDAversions.h......
  • Java并发编程——ForkJoinPool
    一、ForkJoinPoolForkJoinPool是JDK7引入的,由DougLea编写的高性能线程池。核心思想是将大的任务拆分成多个小任务(即fork),然后在将多个小任务处理汇总到一个结果上(即j......