首页 > 其他分享 >Cuda Stream流并发

Cuda Stream流并发

时间:2023-04-06 18:39:09浏览次数:38  
标签:Stream Cuda stream 并发 CUDA GPU CPU 内存

简述

介绍CUDA里面Stream的概念,用到CUDA的程序一般需要处理海量的数据,内存带宽经常会成为主要的瓶颈。在Stream的帮助下,CUDA程序可以有效地将内存读取和数值运算并行,从而提升数据的吞吐量。

内容

一般cuda流程

由于GPU和CPU不能直接读取对方的内存,CUDA程序一般会有一下三个步骤:1)将数据从CPU内存转移到GPU内存,2)GPU进行运算并将结果保存在GPU内存,3)将结果从GPU内存拷贝到CPU内存。如果不做特别处理,那么CUDA会默认只使用一个Stream(Default Stream)

默认stream流并发

Cuda Stream流并发_CUDA

Cuda Stream流并发_CUDA_02

1.将数据拆分称许多块,每一块交给一个Stream来处理。

2.每一个Stream包含了三个步骤:1)将属于该Stream的数据从CPU内存转移到GPU内存,2)GPU进行运算并将结果保存在GPU内存,3)将该Stream的结果从GPU内存拷贝到CPU内存。

3.所有的Stream被同时启动,由GPU的scheduler决定如何并行。

简单的多流示例在将任何交错内核发送到默认流时不会实现并发

Cuda Stream流并发_stream并发_03

真正stream流并发

要在 nvcc7 及更高版本中启用每线程默认流,可以在包含 CUDA 头( cuda.h 或 cuda_runtime.h )之前,使用 nvcc 命令行选项 CUDA 或 #define 编译 CUDA_API_PER_THREAD_DEFAULT_STREAM 预处理器宏。

vs中的具体方法是,右键项目属性中的CUDA C/C++(前提是你创建的是CUDA程序,不然没有这个选项)选项中的Command Line中添加--default-stream per-thread就可以;

Cuda Stream流并发_stream并发_04

在这里可以看到九个流之间的完全并发:默认流(在本例中映射到流 14 )和创建的其他八个流

Cuda Stream流并发_CUDA_05

在GPU端默认一个时刻下只能运行一个kernel,但是有三种情况除外:

1.是开启了mps服务后同用户的多个进程调用可以同时刻在GPU上运行,实现kernel的并发执行;

2.是一个进程的多个线程调用写明不同stream队列的kernel操作,并且代码使用 --default-stream per-thread 参数进行nvcc的编译。

3.是一个进程(单线程)异步调用写明不同stream队列的kernel操作,并且代码使用 --default-stream per-thread 参数进行nvcc的编译。

cuda stream流特性

NVIDIA家的GPU有着不错的技能:

1.数据拷贝和数值计算可以同时进行。

2.两个方向的拷贝可以同时进行(GPU到CPU,和CPU到GPU)

不论GPU端是否可以多kernel并发,HOST和Device间的数据传输在一个时刻下都只能是单个操作,也就是说一个时刻下host端向device的数据传输只能是一个cuda调用,但是在host向device传输数据的同时device可以向host同时传输数据,同理同一时刻下device向host传输数据也只能是以cuda操作,不论GPU端的cuda操作是否有多个stream队列,单向的数据传输都是不能并发的。

标签:Stream,Cuda,stream,并发,CUDA,GPU,CPU,内存
From: https://blog.51cto.com/u_15996251/6174017

相关文章

  • 面试突击MySQL:高并发情况下,数据库该如何设计?
    转载:http://blog.itpub.net/70000181/viewspace-2776766/面试题剖析为什么要分库分表?(设计高并发系统的时候,数据库层面该如何设计?)说白了,分库分表是两回事儿,大家可别搞混了,可能是光分库不分表,也可能是光分表不分库,都有可能。我先给大家抛出来一个场景:假如我们现在是一个小创业公......
  • 6步带你用Spring Boot开发出商城高并发秒杀系统
    摘要:本博客将介绍如何使用SpringBoot实现一个简单的商城秒杀系统,并通过使用Redis和MySQL来增强其性能和可靠性。本文分享自华为云社区《SpringBoot实现商城高并发秒杀案例》,作者:林欣。随着经济的发展和人们消费观念的转变,电子商务逐渐成为人们购物的主要方式之一。高并发是......
  • 6步带你用Spring Boot开发出商城高并发秒杀系统
    摘要:本博客将介绍如何使用SpringBoot实现一个简单的商城秒杀系统,并通过使用Redis和MySQL来增强其性能和可靠性。本文分享自华为云社区《SpringBoot实现商城高并发秒杀案例》,作者:林欣。随着经济的发展和人们消费观念的转变,电子商务逐渐成为人们购物的主要方式之一。高并......
  • Java Stream学习笔记(一)
    JavaStream学习笔记Stream是Java8API添加的一个新的抽象,称为流Stream,以一种声明性方式处理数据集合(侧重对于源数据计算能力的封装,并且支持序列与并行两种操作方式)。一、特点1、代码简洁:函数式编程写出的代码简洁且意图明确,使用stream接口让你从此告别for循环。2、多核友好......
  • NGINX的stream模块以及实操问题
    NGINX的stream模块以及实操问题前言:nginx从1.9.0开始,新增加了一个stream模块,用来实现四层协议的转发、代理或者负载均衡等。nginx作为一个优秀的web服务器软件,毫无疑问,功能是十分强大的,但学习这种软件,如果脱离了实际操作(应用场景落地),那么就是一种耍流氓的行为。(1)关于stream域的模块......
  • [FAQ] Pytorch PytorchStreamReader failed reading zip archive
     比如:rm-rf~/.cache/huggingface  Link:https://www.cnblogs.com/farwish/p/17290240.html......
  • win10+OpenCV4.7.0+cuda环境配置
    需要先安装和下载好以下文件vs2022CMake3.24.2opencv-4.7.0 GitHub-opencv/opencv:OpenSourceComputerVisionLibrary有时github上不去多刷新几次,久等一会儿,因为后续需要手动下载一些cmake不能下载的文件。opencv_contrib-4.7.0 GitHub-opencv/opencv_contrib:Rep......
  • CUDA编程入门
    一、CUDA编程模型 1.CUDA程序执行流程  2.CUDA核函数kernel  3.CUDA程序层次结构kernel/Grid——>Block——>WARP——>Thread 上图中一个Kernel/Grid包含2×3个Block,一个Block包含3×5个线程     4.CUDA内置变量      二、向......
  • 【Java 并发】【九】【AQS】【一】什么是AQS?为什么说它是JUC基础框架?
    1 前言这节我们来开始看AQS,这个东西可以说是搞Java的都知道的,本节会介绍一下AQS以及它提供的基本机制,后面再对AQS提供的每一个机制一个个深入的剖析。2  什么是AQS?(同步器基础框架)AQS叫做抽象队列同步器(AbstractQueuedSynchronizer),它是一个实现了同步器功能的基础框架,其......
  • Java并发和多线程4:使用通用同步工具CountDownLatch实现线程等待
    CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 用给定的计数初始化CountDownLatch。由于调用了countDown()方法,所以在当前计数到达零之前,await方法会一直受阻塞。之后,会释放所有等待的线程,awai......