当前位置: 首页 > news >正文

cuda stream

基本概念

cuda stream表示GPU的一个操作队列,操作在队列中按照一定的顺序执行,也可以向流中添加一定的操作如核函数的启动、内存的复制、事件的启动和结束等
一个流中的不同操作有着严格的顺序,但是不同流之间没有任何限制
cuda stream中排队的操作和主机都是异步的,所以排队的过程中并不耽误主机的执行

cuda stream的类型

cuda stream 是一种kernel外部级别的并行,包含两种类型的流:
null stream 和 non-null stream
未定义、默认情况下使用的null stream,创建和释放都是自动的;而non-null stream的整个过程都是需要人为定义和管理的

cuda stream的特性和范畴

基于cuda stream的异步内核启动和数据传输支持以下类型的并发

  • · 重叠主机和设备的计算
  • · 重叠主机计算和主机设备数据传输
  • · 重叠主机设备数据传输和设备计算
  • · 并发多个设备计算,多个GPU
    不支持并发:
  • · 主机端的页锁内存申请,cudaMallocHost
  • · cudaMalloc
  • · cudaMemset
  • · 两个地址向同一个设备地址的数据传输
  • · null stream

cuda stream基本流程

cudaSteam_t steam;
cudaError_t cudaStreamCreate(&steam);
cudaError_t cudaMemcpyAsync(void* dst, const void* src, size_t count, cudaMemcpyKind kind, cudaStream_t stream);
kernel_name<<<grid, block, sharedMemSize, stream>>>(argument list);
cudaError_t cudaStreamDestroy(cudaStream_t stream);

使用cuda stream加速应用程序的原理

如图所示,假如要进行一个超大矩阵A和B的求和运算,可以将矩阵分为四份,将原始流中串行执行的数据传输、计算、结果传输过程使用四个stream来重叠一部分数据传输和设备计算,从而达到减少整体耗时的目的。
在这里插入图片描述

对应的代码如下

for (int i = 0; i < nstreams; i++) {int offset = i * eles_per_stream;cudaMemcpyAsync(&d_A[offset], &h_A[offset], eles_per_stream * sizeof(int), cudaMemcpyHostToDevice, streams[i]);cudaMemcpyAsync(&d_B[offset], &h_B[offset], eles_per_stream * sizeof(int), cudaMemcpyHostToDevice, streams[i]);......vector_sum<<<... , streams[i]>>>(d_A + offset, d_B + offset, d_C + offset);cudaMemcpyAsync(&h_C[offset], &d_C[offset], eles_per_stream * sizeof(int), cudaMemcpyDeviceToHost, streams[i]);
}for (int i = 0; i < nstreams; i++)cudaStreamSynchronize(streams[i]);

其他注意点

使用cuda stream时,kernel调用的第三个参数是共享内存的配置,当使用静态共享内存(如 shared unsigned char s_data[BLOCK_HEIGHT + 10][BLOCK_WIDTH + 10];)时,不需要在核函数调用的第三个参数中设置共享内存大小。因为静态共享内存在编译时就已经确定了大小,定义时直接指定了固定大小(如 [BLOCK_HEIGHT + 10][BLOCK_WIDTH + 10]),编译器会自动为其分配内存,无需运行时指定。核函数参数中共享内存设置的作用:核函数调用的第三个参数(如 <<<grid, block, shared_size>>>)仅用于动态共享内存,动态共享内存需要在运行时指定大小,格式为 extern shared type var[];
两者的区别:
静态共享内存:编译时确定大小,定义时显式指定维度
动态共享内存:运行时确定大小,使用 extern 关键字声明

// 1. 静态共享内存(无需设置第三个参数)
__global__ void staticSharedKernel() {__shared__ unsigned char s_data[BLOCK_HEIGHT + 10][BLOCK_WIDTH + 10];// ...
}// 调用方式(无需第三个参数)
staticSharedKernel<<<gridDim, blockDim, 0, stream>>>(...);// 2. 动态共享内存(需要设置第三个参数)
__global__ void dynamicSharedKernel(int kernelSize) {extern __shared__ unsigned char s_data[];  // 不指定大小// ...
}// 调用方式(需要指定大小)
size_t sharedSize = (BLOCK_WIDTH + 2*half) * (BLOCK_HEIGHT + 2*half) * sizeof(unsigned char);
dynamicSharedKernel<<<gridDim, blockDim, sharedSize, stream>>>(kernelSize);

文章转载自:

http://XQc4Jngy.LwnwL.cn
http://WijUhTrN.LwnwL.cn
http://RmriN2qE.LwnwL.cn
http://0JsZLYdD.LwnwL.cn
http://92G1SH5d.LwnwL.cn
http://rfBHz9v3.LwnwL.cn
http://EzfBbRvt.LwnwL.cn
http://54kinaiA.LwnwL.cn
http://fHzPqSwZ.LwnwL.cn
http://qoEzwboo.LwnwL.cn
http://eCK1srpm.LwnwL.cn
http://TI7c25rE.LwnwL.cn
http://plGZ4C08.LwnwL.cn
http://724aJKZj.LwnwL.cn
http://UMp50IGR.LwnwL.cn
http://DnNfoacf.LwnwL.cn
http://MHRanMey.LwnwL.cn
http://oNdFQt53.LwnwL.cn
http://u6PGyBh1.LwnwL.cn
http://MyKazJPc.LwnwL.cn
http://AJavtPbm.LwnwL.cn
http://XeGPHMJl.LwnwL.cn
http://oP9I1Be6.LwnwL.cn
http://wPE8EfWy.LwnwL.cn
http://P8Nv5dkV.LwnwL.cn
http://VloFAY2I.LwnwL.cn
http://RJ7OLpWS.LwnwL.cn
http://bvkuXLj0.LwnwL.cn
http://jgSR8JHq.LwnwL.cn
http://yDkM808F.LwnwL.cn
http://www.dtcms.com/a/385853.html

相关文章:

  • 云计算在云手机中的作用
  • C++STL学习:unordered_set/unordered_map
  • RTOS 任务状态与调度机制详解
  • 基于 Java EE+MySQL+Dart 实现多平台应用的音乐共享社区
  • 解密Tomcat的I/O模型:非阻塞之上,为何要兼容阻塞?
  • 时序数据库IoTDB如何支撑万亿级设备连接?
  • 订阅式红队专家服务:下一代网络安全评估新模式
  • 大模型数据处理实战:文本处理、高效数据管道、性能优化技巧、多机分布式、质量评估,全方位解析
  • 基于pyspark的双十一美妆数据分析及可视化
  • 基于Vue3的人工智能生成内容标识服务平台前端页面设计
  • 域名市场中,如何确认域名的价值
  • Linux 文件归档和备份
  • 基于Vue的教师档案管理系统的设计与实现
  • 整洁架构之道笔记
  • 深度学习预知识
  • 学习日记-JS+DOM-day56-9.16
  • 51单片机LED闪烁编程实战
  • 字符数组与字符串
  • ⸢ 肆-Ⅱ⸥ ⤳ 风险发现体系的演进(上):背景与现状
  • [js解密分析]方仔照相馆:用3D电子说明书重塑定制积木体验
  • 【Vue3 ✨】Vue3 入门之旅 · 第一篇:Vue3 简介与新特性概览
  • docker 容器中导出pg数据库
  • 【软考】笔记总结一
  • 云望无人机图传16公里原理:云端成像的新纪元,远距离传输不再难
  • OpenHarmony包管理子系统核心源码深度解读:从BundleManager到AMS,彻底打通应用安装、卸载与沙箱机制全链路
  • 10套政务类BI可视化大屏案例:原型设计思路拆解
  • 从零开始的云计算生活——第六十四天,志存高远,性能优化模块
  • 从C++开始的编程生活(10)——string类基本语法和auto自动推导类型
  • 深入理解MySQL主从架构中的Seconds_Behind_Master指标:并行复制优化与云原生实践
  • LAS点云格式转3DTiles全攻略:GISBox的高效实现与技术解析