CUDA Stream, Event 与 NVVP

news2024/9/22 23:38:10

文章目录

  • 一、CUDA Stream
    • API
    • 实战
    • CUDA Stream和 Serial执行的对比:
    • PCIE和NVLINK
    • CUDA Stream 多流的收益和上限
    • CUDA Kernel合并
    • CUDA7中的Per-Thread编译选项
  • 二、Event
  • 三、NVVP
  • 四、知识点四


一、CUDA Stream

CUDA Stream是GPU上task的执行队列,所有CUDA操作比如Kernel Function,内存拷贝等都是在stream上执行的
CUDA Stream有两种

  1. 隐式流,也叫默认流或者NULL流
    所有的CUDA操作默认运行在隐式流里。隐式流里的GPU task和CPU端计算是同步的。
    举例:𝑛= 1这行代码,必须等上面三行都执行完,才会执行它
    请添加图片描述
    2.显式流:显式申请的流
    显式流中的GPU Task和CPU计算是同步的。不同显式流内的GPU Task执行也是顺序执行的。
    请添加图片描述

API

请添加图片描述

实战

请添加图片描述
在CUDA流(CUDA streams)中,使用cudaMemcpyAsync()是为了实现数据传输和内核执行的并行操作,从而提高GPU的计算性能。在CUDA编程中,流是一系列按顺序执行的操作,这些操作在不同的流之间可能会并行执行。这意味着,如果有多个CUDA流,那么可以同时执行多个流中的操作(前提是它们不会相互干扰或竞争硬件资源)。

cudaMemcpyAsync()是异步的数据传输函数,相较于同步版本cudaMemcpy(),它不会阻塞主机(CPU)线程的执行。当cudaMemcpyAsync()被调用时,它将数据传输操作加入到指定的CUDA流中,并允许主机线程继续执行后续操作。这样可以让主机线程在数据传输执行过程中同时执行其他任务。

使用cudaMemcpyAsync()可以实现以下优势:

隐藏数据传输和计算之间的延迟:当数据传输在一个流中进行时,可以在另一个流中执行计算内核。这样,在计算内核执行的同时,可以传输下一批数据,从而最大程度地利用GPU资源。

优化多流并行:通过将数据传输和计算内核放入不同的流中,可以充分利用GPU上的多个SM(Streaming Multiprocessors),从而实现更好的计算性能。

更高效的主机和设备之间的通信:由于cudaMemcpyAsync()是非阻塞的,主机线程可以在数据传输过程中执行其他任务,提高整体性能。

需要注意的是,使用cudaMemcpyAsync()时,要确保分配的内存是分页锁定(pinned)内存,因为异步数据传输仅在分页锁定内存上有效。可以使用cudaMallocHost()或cudaHostAlloc()函数为主机分配分页锁定内存。

CUDA Stream和 Serial执行的对比:

请添加图片描述

PCIE和NVLINK

1.NVLINK:NVLINK是NVIDIA开发的一种高性能、高带宽的GPU之间的互连技术。它为GPU之间提供了更高的通信带宽和更低的延迟,相较于传统的PCIe接口,NVLINK的性能更为出色。NVLINK主要用于高性能计算(HPC)以及深度学习等需要大量计算资源和高速数据传输的领域。NVLINK可以实现GPU之间的数据共享,以及在多个GPU上运行并行任务时的协同计算。

2.PCIe(Peripheral Component Interconnect Express):PCIe是一种常用的串行计算机扩展总线标准,用于连接主板上的各种设备,如GPU、网络卡和其他I/O设备。PCIe具有良好的向后兼容性,已成为许多计算设备通信的事实标准。然而,相对于NVLINK,PCIe的带宽较低,延迟较高。

CUDA Stream 多流的收益和上限

在许多情况下,使用多CUDA流(CUDA Streams)可以提高GPU的计算效率。CUDA流是一种并行计算机制,使得多个任务可以在GPU上同时运行。这些任务可能是计算任务,也可能是数据传输任务。通过使用多流,可以在某些任务等待数据时执行其他任务,从而实现任务间的流水线并行。同时,一个Stream中的一个Kernel无法充分利用GPU的算力,多流可以充分利用GPU的算力。

然而,并不是说CUDA流越多越好。创建过多的流可能导致系统资源竞争,如内存、带宽和计算单元,反而降低性能。最佳的CUDA流数量取决于硬件配置和应用程序特性。通常,需要进行实验以找到最佳的流数量,以实现最高的性能和资源利用率。

CUDA Kernel合并

CUDA Kernel函数合并(Kernel Fusion)是一种优化技术,它将多个原子操作或计算任务合并到一个更大的、更高效的Kernel函数中。这种技术可以减少内存访问次数、降低延迟,从而提高GPU的计算性能和资源利用率。通常,要在不影响程序正确性的前提下,将多个Kernel合并成一个。

下面我们以两个简单的矩阵操作为例:矩阵加法和矩阵乘以标量。原始的Kernel函数分别如下:

__global__ void matrixAddKernel(float* A, float* B, float* C, int width, int height) {
    int x = blockIdx.x * blockDim.x + threadIdx.x;
    int y = blockIdx.y * blockDim.y + threadIdx.y;

    if (x < width && y < height) {
        int index = y * width + x;
        C[index] = A[index] + B[index];
    }
}

__global__ void matrixScalarMulKernel(float* A, float scalar, float* B, int width, int height) {
    int x = blockIdx.x * blockDim.x + threadIdx.x;
    int y = blockIdx.y * blockDim.y + threadIdx.y;

    if (x < width && y < height) {
        int index = y * width + x;
        B[index] = A[index] * scalar;
    }
}

合并后的kernel函数为:

__global__ void fusedMatrixOpsKernel(float* A, float* B, float scalar, float* C, int width, int height) {
    int x = blockIdx.x * blockDim.x + threadIdx.x;
    int y = blockIdx.y * blockDim.y + threadIdx.y;

    if (x < width && y < height) {
        int index = y * width + x;
        C[index] = (A[index] + B[index]) * scalar;
    }
}

在这个例子中,我们将矩阵加法和标量乘法合并为一个Kernel函数。这样可以减少内存访问次数,因为在原始的两个Kernel中,我们需要先将矩阵加法的结果存储在全局内存中,然后再从全局内存中读取该结果以进行标量乘法。而在合并后的Kernel中,我们不需要在全局内存中存储中间结果,从而节省了内存带宽和计算时间。

再举一个例子,如右图所示: 请添加图片描述
注意到默认方案和多流方案都需要访问两次A,一次B,一次C,两次E,两次D,一次O一共九次读写。而合并Kernel之后,只需要访问一次A,一次B,一次C,一次O一共四次读写,三次计算。

CUDA7中的Per-Thread编译选项

在给定代码中:

const int N = 1 << 20;

__global__ void kernel(float *x, int n)
{
    int tid = threadIdx.x + blockIdx.x * blockDim.x;
    for (int i = tid; i < n; i += blockDim.x * gridDim.x) {
        x[i] = sqrt(pow(3.14159,i));
    }
}

int main()
{
    const int num_streams = 8;

    cudaStream_t streams[num_streams];
    float *data[num_streams];

    for (int i = 0; i < num_streams; i++) {
        cudaStreamCreate(&streams[i]);
 
        cudaMalloc(&data[i], N * sizeof(float));
        
        // launch one worker kernel per stream
        kernel<<<1, 64, 0, streams[i]>>>(data[i], N);

        // launch a dummy kernel on the default stream
        kernel<<<1, 1>>>(0, 0);
    }

    cudaDeviceReset();

    return 0;
}

我们在显式流中插入了默认流,如果使用如下nvcc命令编译的话:
nvcc ./stream_test.cu -o stream_legacy
结果将会是:
请添加图片描述
原因在这篇博文中已经有所阐述: https://developer.nvidia.com/blog/gpu-pro-tip-cuda-7-streams-simplify-concurrency/
因此,我们需要使用这样的命令进行编译: nvcc --default-stream per-thread ./stream_test.cu -o stream_per-thread

二、Event

三、NVVP

四、知识点四


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/488912.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql表索引(总结篇)

目录 前言 ✨✨✨大家好&#xff0c;我是会飞的鱼-blog&#xff0c;今天我来给大家介绍一下Mysql&#xff0c;有不足之处&#xff0c;请大家多多指教。感谢大家支持&#xff01;&#xff01;&#xff01; 一、索引的概述 1.索引类型 2.索引存储 3.索引优缺点 4.使用建议…

如何在Windows上搭建NFS服务器实现开发板与Windows之间的文件共享

目录 1 安装nfs.exe 2 mounting 172.31.8.183:/f/nfs on /mnt/nfs failed: No such file or directory 3 mounting 172.31.8.183:/d/nfs on /mnt/nfs failed: Permission denied 1 安装nfs.exe 某项目中需要把程序放到Linux开发板中测试&#xff0c;刚开始使用tftp命令下载…

常见8大排序算法详解

常见8大排序算法 分别是冒泡排序、选择排序、插入排序、希尔排序、快速排序、堆排序、归并排序、基数排序&#xff08;桶排序&#xff09; 冒泡排序 思路 n个数字从小到大排序&#xff0c;每个数和它后面的数比较&#xff0c;小的放前面&#xff0c;大的放后面&#xff0c;…

微信小程序学习实录5(H5嵌入小程序、map组件、地图调起功能、腾讯百度高德导航页、返回web-view页)

H5嵌入微信小程序 一、H5页面地图1.H5地图加载2.标注事件 二、H5返回微信小程序1.H5页面核心代码2.微信小程序接收传参核心代码 三、开发中遇见的坑1.wx.openLocation调起地图后需要点击两次返回才到web-view页面2.H5无法调用百度定位new BMap.Geolocation对象3.安卓某些机型无…

Linux:《tar》归档命令

准备好4个文件然后使用tar命令进行归档 最常用的是 -c, --create&#xff08;小写&#xff09; 建立新的存档 -f, --file [HOSTNAME:]F 指定存档或设备 (缺省为 /dev/rmt0) -z, --gzip, --ungzip 用 gzip 对存档压缩或解压 -j&…

京东数据分析:2023年Q1白酒电商整体动销增长,中低端酒企压力大

早在年初就有白酒市场业内人士表示&#xff0c;2023年春节白酒消费市场整体景气度较高&#xff0c;白酒动销表现较为优秀&#xff0c;预计2023年一季度白酒动销有望实现一定的增长。 对于这一观点&#xff0c;我们在今年电商数据平台鲸参谋出炉的Q1白酒销售数据表现中得到了验证…

【软考高级】2019年系统分析师案例分析

1、阅读以下关于软件系统分析的叙述&#xff0c;在答题纸上回答问题1至问题3。 【说明】 某软件企业为电信公司开发一套网上营业厅系统&#xff0c;以提升服务的质量和效率。项目组经过分析&#xff0c;列出了项目开发过程中的主要任务、持续时间和所依赖的前置任务&#xff…

1.0 Vue的编译和运行

1、编程范式&#xff1a;命令式和声明式 编程范式是指一种程序语言的代码风格、样式&#xff0c;每一种范式都包含了代码特征和结构&#xff0c;以及处理错误的方式。 例如现在需要实现生成一个div模块&#xff0c;其显示的文本内容为hello world&#xff0c;添加一个点击事件…

X3派caffe yolov3 部署demo

yolov3放置在docker中/open_explorer/ddk/samples/ai_toolchain/horizon_model_convert_sample/04_detection/02_yolov3_darknet53/mapper 模型所需要的prototxt和caffe模型yolov3.caffemodel文件放置在docker中的/open_explorer/ddk/samples/ai_toolchain/model_zoo/mapper/de…

78页2023年智慧公安发展构思与建设解决方案(ppt可编辑)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。 总体架构10 建设方案-网络系统11 物联网15 视频网系统16 视频专网主干网根据运营商链路分为若干个环网部署&#xff0c;市局两台核心交换机位于网络核心层&#xff1b;部分…

SpringCloud 分布式事务组件之Seata

目录 背景介绍什么是分布式事务什么叫做逆向补偿呢互联网最流行的分布式事务组件seata总结 背景 大家好&#xff0c;今天给大家分享一个在2022年出去面试Java几乎必问的一个技术&#xff0c;那就是seata。什么&#xff1f;&#xff1f;你才看了第一句话心里有闪现了无数个问…

024 - C++ 虚函数

本期我们学习的是 C 中的虚函数。 过去的几期&#xff0c;我们一直在讨论类、面向对象编程、继承这些内容&#xff0c;所有的这些内容&#xff0c;包括本期我们将要学习的虚函数&#xff0c;对整个面向对象的概念都非常重要。 虚函数能干什么呢? 虚函数允许我们在子类中重写…

关于C语言的一些笔记

文章目录 May4,2023常量问题基本数据类型补码printf的字符格式控制关于异或、异或的理解赋值运算i和i的区别关系运算符 摘自加工于C技能树 May4,2023 常量问题 //定义常量 const float PI; PI 3.14; //false ,这种声明变量是错误的&#xff0c;常量声明之后就不能修改&…

树脂塞孔有哪些优缺点及应用?

树脂塞孔的概述 树脂塞孔就是利用导电或者非导电树脂&#xff0c;通过印刷&#xff0c;利用一切可能的方式&#xff0c;在机械通孔、机械盲埋孔等各种类型的孔内进行填充&#xff0c;实现塞孔的目的。 树脂塞孔的目的 1 树脂填充各种盲埋孔之后&#xff0c;利于层压的真空下…

关于使用Notion的board做工作安排这件事

关于使用Notion的board做工作安排这件事 Created: May 4, 2023 5:39 PM 壹 最近想用一个工具来实现平时工作的记录、跟踪、留痕以及年终的统计&#xff0c;之前尝试过幕布、微软的todo、手机自带的备忘录等工具&#xff0c;但是还是不能够完全满足需求。之前也用过一段时间的…

SPSS如何进行回归分析之案例实训?

文章目录 0.引言1.线性回归分析2.曲线回归分析3.非线性回归分析4.Logistic回归分析5.有序回归分析6.概率回归分析7.加权回归分析 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对SPSS进行了学习&#xff0c;本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上…

Redis 实战篇:巧用 Bitmap 实现亿级海量数据统计

目录 二值状态统计判断用户登陆态SETBIT 命令GETBIT 命令第一步&#xff0c;执行以下指令&#xff0c;表示用户已登录。第二步&#xff0c;检查该用户是否登陆&#xff0c;返回值 1 表示已登录。第三步&#xff0c;登出&#xff0c;将 offset 对应的 value 设置成 0。 用户每个…

【web】HTTP工作原理及应用

一、浏览器工作 浏览器输入网址后&#xff0c;从DNS服务器中查找对应的IP&#xff0c;并返回客户端浏览器&#xff0c;然后通过ip地址去访问服务器。&#xff08;操作系统中host文件存了一些对应的IP地址&#xff0c;浏览器拿到域名会先从host文件中查找ip&#xff0c;如果找…

重工业生产VR虚拟现实数字化互动展示为后续招商引资打好基础和口碑

智慧工业厂区已经是当今城市规划和发展的重要焦点。华锐视点运用数字孪生&#xff0c;三维虚拟仿真和3D可视化打造的智慧园区管理平台&#xff0c;不仅提升了工业厂区吸引力&#xff0c;而且促进工业厂区可持续发展&#xff0c;给予了园区互联网先进技术发展的基础&#xff0c;…

Noah-MP陆面过程模型建模方法与站点、区域模拟实践技术

查看原文&#xff1a;Noah-MP陆面过程模型建模方法与站点、区域模拟实践技术 目标&#xff1a; 了解陆表过程的主要研究内容以及陆面模型在生态水文研究中的地位和作用&#xff1b;熟悉模型的发展历程&#xff0c;常见模型及各自特点&#xff1b;理解Noah-MP模型的原理&#…