[CUDA] stream使用笔记
文章目录
- 1. stream一般用法
- 2. stream与event:
- 3. stream异常的排查
- 4. stream的异步与同步行为
1. stream一般用法
cudaStream_t stream_;
cudaStreamCreate(&stream_); // create stream
// some operators running on this stream_
cudaStreamSynchronize(stream_)// in final
cudaStreamDestroy(stream_);
- stream: Nonblocking模式 (WithFlags模式)
// stream_flags:
// 1)cudaStreamDefault:这个和stream0默认流是同步的,启示和stream0上操作没区别
// 2)cudaStreamNonBlocking:和stream0号默认流不同步,异步,可以看reference[2]中的效果图可视化情况,更加形象
cudaStreamCreateWithFlags(&cuda_stream_, stream_flags)
2. stream与event:
cudaStream_t stream1;
cudaStream_t stream2;
cudaEvent_t event_stream2_wait_stream1_on_kernel2 = nullptr;
cudaEventCreate(&event_stream2_wait_stream1_after_kernel2, CU_EVENT_DISABLE_TIMING);
cudaStreamCreate(&stream1); // create stream1流,可以理解为任务队列1
cudaStreamCreateWithFlags(&stream2, cudaStreamNonBlocking); // create stream2,可以理解为任务队列2// kernel1 加入到任务队列1,并且排队等待执行,接着就返回来,执行下一句
kernel1<<<blocks, threads, 0, stream1>>>(n, data);
// 这个时候,只知道kernel1已经加到队列1中去执行了,具体执行完与否不知道,开始将kernel2加入到队列1中,
// 接着kernel1执行,只有kernel1执行完毕后,才开始执行kernel2,因为他们俩都在stream1上。
kernel2<<<blocks, threads, 0, stream1>>>(n, data);
// 在这个地方打标签,也就是在kernel2后面打标签,如果stream1上的kernel2执行完,
// 并且stream1通过了这个标签,那么后面就不用等待; 如果kernel2还没有结束,
// 则stream1还没走到这个标签,则后面就需要等待走过这个标签才可以执行。
cudaEventRecord(event_stream2_wait_stream1_after_kernel2,stream1);
// 上面打完标签record完后,就开始执行这个wait, 这个时候,wait等待这个标签是否在stream1上被经过(被经过的解释只是形象表示,具体是什么机制触发还不清楚,可能是信号量的方式触发这一行使其不再等待),如果被经过,则这个wait就不再等待,直接放行,执行kernel3,将kernel3的任务发配到stream2上; 因为stream2是nonblocking方式,所以会很大程度上保持与stream1的并行。
cudaStreamWaitEvent(stream2, event_stream2_wait_stream1_after_kernel2);
kernel3<<<blocks, threads, 0, stream2>>>(n, data);// some operators running on this stream_
cudaStreamSynchronize(stream1);
cudaStreamSynchronize(stream2);
3. stream异常的排查
- 有的时候cudaStreamSynchronize(stream) illegal memory不一定是stream存在问题,有可能是前面数据拷贝计算等没有完成,或者同步异常导致的后面数据非法,从而stream sync出现问题, 排查思路
- 打印前后的数据,出错与不出错对比,前面操作的一些数据是否存在差异(是否由于前面操作非法导致的);
- 用nsys tools工具,可视化执行流的情况,并且对比出错与不出错时的情况,查看流中函数执行的差异性;是否有越界情况。
4. stream的异步与同步行为
https://docs.nvidia.com/cuda/cuda-runtime-api/api-sync-behavior.html#api-sync-behavior__memcpy-async
需要注意的一个点:一些cudaMemcpyAsync, 不一定是异步的,比如当host和device之间传输数据的时候,虽然使用异步copy,但是会内含同步,从而导致一些block或spin行为。
2. API synchronization behavior
The API provides memcpy/memset functions in both synchronous and asynchronous forms, the latter having an "Async" suffix. This is a misnomer as each function may exhibit synchronous or asynchronous behavior depending on the arguments passed to the function.
Memcpy
In the reference documentation, each memcpy function is categorized as synchronous or asynchronous, corresponding to the definitions below.
**Synchronous**- For transfers from pageable host memory to device memory, a stream sync is performed before the copy is initiated. The function will return once the pageable buffer has been copied to the staging memory for DMA transfer to device memory, but the DMA to final destination may not have completed.- For transfers from pinned host memory to device memory, the function is synchronous with respect to the host.- For transfers from device to either pageable or pinned host memory, the function returns only once the copy has completed.- For transfers from device memory to device memory, no host-side synchronization is performed.- For transfers from any host memory to any host memory, the function is fully synchronous with respect to the host.
Asynchronous- For transfers between device memory and pageable host memory, the function might be synchronous with respect to host.- For transfers from any host memory to any host memory, the function is fully synchronous with respect to the host.- If pageable memory must first be staged to pinned memory, the driver may synchronize with the stream and stage the copy into pinned memory.- For all other transfers, the function should be fully asynchronous.
Memset
The cudaMemset functions are asynchronous with respect to the host except when the target memory is pinned host memory. The Async versions are always asynchronous with respect to the host.
Kernel Launches
Kernel launches are asynchronous with respect to the host. Details of concurrent kernel execution and data transfers can be found in the CUDA Programmers Guide.相关文章:
[CUDA] stream使用笔记
文章目录 1. stream一般用法2. stream与event:3. stream异常的排查4. stream的异步与同步行为 1. stream一般用法 cudaStream_t stream_; cudaStreamCreate(&stream_); // create stream // some operators running on this stream_ cudaStreamSynchronize(str…...
第二课:开发工具
在本课中,我们将介绍一些常用的C开发工具,并附上下载链接,帮助你选择合适的工具进行开发。 1. DEVC DEVC 是一个轻量级的C开发工具,适合初学者使用。它提供了基本的代码编辑、编译和调试功能。 下载链接: DEVC 下载 2. Visual…...
Vue 学习随笔系列十三 -- ElementUI 表格合并单元格
ElementUI 表格合并单元格 文章目录 ElementUI 表格合并单元格[TOC](文章目录)一、表头合并二、单元格合并1、示例代码2、示例效果 一、表头合并 参考: https://www.jianshu.com/p/2befeb356a31 二、单元格合并 1、示例代码 <template><div><el-…...
对于一个含有直流和交流分量的信号,如何使用示波器正确显示并测出直流电压值和交流电压峰峰值?
对于一个含有直流(DC)和交流(AC)分量的混合信号,使用示波器来正确显示和测量其直流电压值和交流电压峰峰值需要选择适当的设置和方法。以下是详细的步骤: 所需设备 示波器电压探头 步骤一:连…...
移动混合开发面试题及参考答案
目录 什么是混合开发(Hybrid App)? 混合开发(Hybrid App)与原生开发相比有什么优缺点? 优点 缺点 混合开发(Hybrid App)的兴起原因是什么? 市场竞争和成本控制需求 技术发展和资源整合 人才资源的考量 Web App、Native App 和混合开发(Hybrid App)的区别是…...
命令行工具开发秘籍:从零开始创建实用Python脚本(如何创建Python命令行工具)
文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 创建命令行工具的基础🔖 在非模块化的环境中🔖 在模块化环境中📝 打包和安装模块📝 使用命令行工具⚓️ 相关链接 ⚓️📖 介绍 📖 如何将自己的Python模块打包成一个可在命令行中直接执行的工具?…...
Python - PDF 分割成单页、PDF 转图片(PNG)
文章目录 PDF 分割成一页页的 PDFPDF 转 PNGPDF 分割成一页页的 PDF import fitz def split_pdf(pdf_path, save_dir):source_pdf = fitz.open(pdf_path)# 遍历source_pdf中的每一页,page_number从0开始计数 for idx...
【网络】套接字编程——TCP通信
> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:TCP网络服务器简单模拟实现。 > 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安! > 专栏选自:…...
PyTorch实践-CNN-验证码识别
1 需求 GitHub - xhh890921/cnn-captcha-pytorch: 小黑黑讲AI,AI实战项目《验证码识别》 2 接口 含义 在optim.Adam接口中,lr参数代表学习率(Learning Rate)。学习率是优化算法中的一个关键超参数,它决定了在每次迭代…...
json和pb的比较
1.介绍 在数据序列化和通信领域,schema 指的是用于定义数据结构的模式或结构描述。它描述了数据的字段、类型、嵌套结构和约束,并在数据验证和解释上发挥重要作用。常见的 schema 格式包括 Protocol Buffers (proto)、JSON Schema、XML Schema 等。 Pr…...
Redis-基本了解
一、Redis 初识 Redis 是⼀种基于键值对(key-value)的NoSQL数据库,与很多键值对数据库不同的是,Redis 中的值可以是由string(字符串)、hash(哈希)、list(列表)…...
HarmonyOS第一课 06 构建更加丰富的页面-习题解析
判断题 1. Tabs组件可以通过接口传入一个TabsController,该TabsController可以控制Tabs组件进行页签切换。T 正确(True) 错误(False) 使用 this.tabsController.changeIndex(this.currentIndex); 可以切换页签 WebviewController提供了变更Web组件显示内容的接口…...
计算机的错误计算(一百四十三)
摘要 探讨 MATLAB 中 附近数的余弦函数的计算精度问题。 例1. 已知 计算 与 直接贴图吧: 另外,16位的正确值分别为 -0.3012758451921695e-7 与 -0.3765996542384011e-10(ISRealsoft 提供)。 容易看出,MATLAB的输…...
大数据之——Window电脑本地配置hadoop系统(100%包避坑!!方便日常测试,不用再去虚拟机那么麻烦)
之前我们的hadoop不管是伪分布式还是分布式,都是配置在虚拟机上,我们有的时候想要运行一些mapreduce、hdfs的操作,又要把文件移到虚拟机,又要上传hdfs,麻烦得要死,那么有的时候我们写的一些java、python的h…...
汽车固态电池深度报告
固态电池符合未来大容量二次电池发展方向,半固态电池已装车,高端长续航车型、e-VTOL 等方向对固态电池需求明确。固态电池理论上具备更高的能量密度、更好的热稳定性、更长的循环寿命等优点,是未来大容量二次电池发展方向。根据中国汽车动力…...
HTB-Cicada 靶机笔记
Cicada 靶机笔记 概述 HTB 的靶机 Cicada 靶机 靶机地址:https://app.hackthebox.com/machines/Cicada 很有意思且简单的 windows 靶机,这台靶机多次利用了信息枚举,利用不同的信息一步一步获得 root 权限 一、nmap 扫描 1)…...
使用DJL和PaddlePaddle的口罩检测详细指南
使用DJL和PaddlePaddle的口罩检测详细指南 完整代码 该项目利用DJL和PaddlePaddle的预训练模型,构建了一个口罩检测应用程序。该应用能够在图片中检测人脸,并将每张人脸分类为“戴口罩”或“未戴口罩”。我们将深入分析代码的每个部分,以便…...
基于stm32的多旋翼无人机(Multi-rotor UAV based on stm32)
在现代无人机技术中,多旋翼无人机因其稳定性和操控性而受到广泛应用。STM32微控制器因其强大的处理能力和丰富的外设接口,成为实现多旋翼无人机控制的理想选择。本文将详细介绍如何基于STM32实现多旋翼无人机的控制,包括硬件设计、软件设计和…...
第二十四章 v-model原理及v-model简化表单类组件封装
目录 一、v-model 原理 二、表单类组件封装 三、v-model简化组件封装代码 一、v-model 原理 原理:v-model本质上是一个语法糖。例如应用在输入框上,就是 value属性 和 input事件 的合写。 作用:提供数据的双向绑定 ① 数据变&#x…...
Java基于SpringBoot 的校园外卖点餐平台微信小程序(附源码,文档)
大家好,我是Java徐师兄,今天为大家带来的是Java基于SpringBoot 的校园外卖点餐平台微信小程序。该系统采用 Java 语言 开发,MySql 作为数据库,系统功能完善 ,实用性强 ,可供大学生实战项目参考使用。 博主介…...
开发者必备:从聊天记录到结构化知识库的自动化工具实践
1. 项目概述:一个面向开发者的轻量级对话记录工具最近在整理几个开源项目的技术讨论记录时,我又一次陷入了混乱。Slack、Discord、Telegram、微信……不同平台的聊天记录散落各处,格式五花八门,想回溯一个关键的技术决策或一个报错…...
GD32C103RBT6 DAC 驱动库详细解析
本文基于GD32C10x 官方固件库 V1.0.0,深度解析 DAC 外设驱动库gd32c10x_dac.c,包含驱动概述、核心函数详解、可直接运行的工程例程,适合 GD32 单片机开发入门与实战。 一、DAC 外设概述 1.1 GD32C10x DAC 基本特性 双通道 12 位数字 / 模拟转换器(DAC0、DAC1) 输出电压范…...
TVA 在宠物混合监护场景中的创新应用(1)
重磅预告:本专栏将独家连载新书《智能体视觉技术与应用》(系列丛书)部分精华内容,该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著,特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。…...
UWB定位标签天线怎么选?PATCH、PIFA、DIPOLE三种方案全对比(含NXP/Qorvo模组适配建议)
UWB定位标签天线选型指南:PATCH、PIFA、DIPOLE三大方案深度解析与工程决策 在物联网定位技术领域,超宽带(UWB)凭借其厘米级精度和强抗干扰能力,已成为工业定位、智能仓储和医疗设备追踪的核心解决方案。而天线作为UWB系统的"感官器官&qu…...
UEFI开发避坑指南:WaitForEvent和CreateEvent的5个实战陷阱与正确用法
UEFI开发避坑指南:WaitForEvent和CreateEvent的5个实战陷阱与正确用法 如果你正在开发UEFI驱动或应用,事件机制(Event)一定是绕不开的核心功能。但看似简单的WaitForEvent和CreateEvent,在实际编码中却暗藏玄机。本文将…...
东南亚1.5亿数字钱包用户如何覆盖?Antom收单解决方案拆解
在东南亚,很多用户第一次完成线上付款可能不是通过信用卡,而是通过自己熟悉的本地电子钱包。从印尼的GoPay、DANA,到菲律宾的GCash,再到泰国的TrueMoney、马来西亚的Touch ‘n Go,电子钱包已经深度融入当地人的日常消费…...
FanControl风扇控制:3分钟掌握专业级Windows散热管理终极指南
FanControl风扇控制:3分钟掌握专业级Windows散热管理终极指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Tren…...
Office RibbonX Editor:免费开源Office界面定制终极指南
Office RibbonX Editor:免费开源Office界面定制终极指南 【免费下载链接】office-ribbonx-editor An overhauled fork of the original Custom UI Editor for Microsoft Office, built with WPF 项目地址: https://gitcode.com/gh_mirrors/of/office-ribbonx-edit…...
PangoDesign Suite与Modelsim协同仿真:从库编译到实战排错全解析
1. 为什么需要PangoDesign Suite与Modelsim协同仿真 第一次接触FPGA仿真时,我也被各种专业术语绕晕了。直到某次项目出现时序问题,才发现仿真工具就像汽车的"安全气囊"——平时感觉不到存在,关键时刻能救命。PangoDesign Suite&…...
学妹问降AI率工具选哪个性价比最高?4款降AI软件1万字花多少过AIGC检测
学妹问降AI率工具选哪个性价比最高?4款降AI软件1万字花多少过AIGC检测 学妹的具体问题 3 月 23 号晚上学妹问我:「学姐我送知网测了 AI 率 65%——市面降 AI 工具一堆我怎么选性价比最高的?预算 300 元以内」。 「性价比最高」是用户最常问…...
