并行编程实战——CUDA编程的事件

一、CUDA中的事件

大家可能在别的开发语言中都学习过事件这个概念,其实在CUDA中事件这个概念与它们都类似。不过,在CUDA中事件更贴近于其字面本身的意义,它是类似一种标志,用来密切监视设备进度即同步工具。同时可以通过让应用程序在程序中的任何点异步记录事件并查询这些事件何时完成来执行准确的计时。当事件之前的所有任务(或可选地,给定流中的所有命令)都已完成时,事件即已完成。在所有流中的所有先前任务和命令完成之后,流零(指空或默认流)中的事件也会完成。
也就是说,在CUDA编程中,事件既可以作为同步工具又可以作为精确测量执行时间的工具。

二、CUDA事件主要应用场景

通过上面的说明,大家可以基本明白CUDA事件的定义,那么对事件来说其应用场景是什么呢?

  1. 性能测量
    利用事件既可以进行内核时间的测量,还可以进行流线的操作(计算重叠等)
cudaEventRecord(start,0);for(inti=0;i<2;++i){cudaMemcpyAsync(inputDev+i*size,inputHost+i*size,size,cudaMemcpyHostToDevice,stream[i]);MyKernel<<<100,512,0,stream[i]>>>(outputDev+i*size,inputDev+i*size,size);cudaMemcpyAsync(outputHost+i*size,outputDev+i*size,size,cudaMemcpyDeviceToHost,stream[i]);}cudaEventRecord(stop,0);cudaEventSynchronize(stop);floatelapsedTime;cudaEventElapsedTime(&elapsedTime,start,stop);
  1. 流的同步
    主要用于控制流间的依赖关系,如多流的同步,不同阶段间的计算同步以及多GPU的数据依赖和Graphic,另外还可以进行动态工作流的控制处理。
__global__voidfoo1(char*A){*A=0x1;}__global__voidfoo2(char*B){printf("%d\n",*B);// *B == *A == 0x1 assuming foo2 waits for foo1// to complete before launching}cudaMemcpyAsync(B,input,size,stream1);// Aliases are allowed at// operation boundariesfoo1<<<1,1,0,stream1>>>(A);// allowing foo1 to access A.cudaEventRecord(event,stream1);cudaStreamWaitEvent(stream2,event);foo2<<<1,1,0,stream2>>>(B);cudaStreamWaitEvent(stream3,event);cudaMemcpyAsync(output,B,size,stream3);// Both launches of foo2 andcudaMemcpy (which both read)// wait for foo1 (which writes) to complete before proceeding

注:上面代码来自CUDA官网

三、流和流同步

虽然事件可以进行流同步,但与流同步还是有一些不同之处,主要有:

  1. 事件的同步机制更灵活,可以多流间控制。而流同步一般是整个流内部
  2. 事件控制比流同步更精确,上文也提到了,事件可以进行点的控制,而流同步一般是整个流
  3. 事件与流同步相比,开销更低
  4. 事件应用比流同步要广泛,除了同步外还可以进行计时等处理

技术概念间互相对比,可以更好的加强学习理解的深刻性。

四、例程

针对上面的说明,可以看下面的例程:

#include"cuda_runtime.h"#include"device_launch_parameters.h"#include<stdio.h>#include<stdlib.h>__global__voidkernelFunc(float*data,intnum,floatfactor){intidx=blockIdx.x*blockDim.x+threadIdx.x;if(idx<num){data[idx]=data[idx]*factor+idx*0.001f;}}intmain(){constintN=1<<20;// 100wconstintnumStreams=4;constintchunkSize=N/numStreams;constsize_tchunkBytes=chunkSize*sizeof(float);constsize_ttotalBytes=N*sizeof(float);printf("mul stream sync test...\n");float*hData=NULL;cudaMallocHost(&hData,totalBytes);for(inti=0;i<N;i++){hData[i]=(float)rand()/RAND_MAX;}float*dData=NULL;cudaMalloc(&dData,totalBytes);cudaStream_tstreams[numStreams];for(inti=0;i<numStreams;i++){cudaStreamCreate(&streams[i]);}//1 cacl timecudaEvent_tstartEvent,stopEvent;cudaEvent_tkernelEvents[numStreams];cudaEventCreate(&startEvent);cudaEventCreate(&stopEvent);for(inti=0;i<numStreams;i++){cudaEventCreateWithFlags(&kernelEvents[i],cudaEventDisableTiming);}cudaEventRecord(startEvent,0);intthreadsPerBlock=256;intblocksPerChunk=(chunkSize+threadsPerBlock-1)/threadsPerBlock;for(inti=0;i<numStreams;i++){intoffset=i*chunkSize;cudaMemcpyAsync(&dData[offset],&hData[offset],chunkBytes,cudaMemcpyHostToDevice,streams[i]);kernelFunc<<<blocksPerChunk,threadsPerBlock,0,streams[i]>>>(&dData[offset],chunkSize,(float)(i+1)*0.5f);cudaGetLastError();cudaEventRecord(kernelEvents[i],streams[i]);cudaMemcpyAsync(&hData[offset],&dData[offset],chunkBytes,cudaMemcpyDeviceToHost,streams[i]);}for(inti=0;i<numStreams;i++){cudaStreamSynchronize(streams[i]);}// record finish timepointcudaEventRecord(stopEvent,0);cudaEventSynchronize(stopEvent);floattotalTime=0.f;cudaEventElapsedTime(&totalTime,startEvent,stopEvent);printf("sum time: %.3f ms\n",totalTime);//2 stream dependedprintf("\n stream sync :\n");cudaEvent_tsyncEvent;cudaEventCreate(&syncEvent);kernelFunc<<<blocksPerChunk,threadsPerBlock,0,streams[0]>>>(dData,chunkSize,2.0f);cudaEventRecord(syncEvent,streams[0]);for(inti=1;i<numStreams;i++){cudaStreamWaitEvent(streams[i],syncEvent,0);kernelFunc<<<blocksPerChunk,threadsPerBlock,0,streams[i]>>>(&dData[i*chunkSize],chunkSize,1.5f);}for(inti=0;i<numStreams;i++){cudaStreamSynchronize(streams[i]);}printf("sync finish \n");printf("\n event query:\n");cudaEvent_tqueryEvent;cudaEventCreate(&queryEvent);kernelFunc<<<blocksPerChunk,threadsPerBlock>>>(dData,chunkSize,1.0f);cudaEventRecord(queryEvent,0);intmaxChecks=100;intcheckCount=0;while(cudaEventQuery(queryEvent)==cudaErrorNotReady){checkCount++;if(checkCount<maxChecks){intdummy=0;for(intj=0;j<1000;j++){dummy+=j;}}else{cudaEventSynchronize(queryEvent);break;}}printf("event query count: %d\n",checkCount);cudaEventDestroy(syncEvent);cudaEventDestroy(queryEvent);cudaEventDestroy(startEvent);cudaEventDestroy(stopEvent);for(inti=0;i<numStreams;i++){cudaEventDestroy(kernelEvents[i]);cudaStreamDestroy(streams[i]);}cudaFree(dData);cudaFreeHost(hData);cudaDeviceReset();printf("\n all finish!\n");return0;}

上面代码的功能主要用于多流间的同步,同时对整体的操作时间进行计算。有前面代码的基础,应该不难。如果有什么不太清楚的,上机运行,增加一些打印日志就明白了。

五、总结

在前面CUDA流的学习中,对CUDA事件进行了顺带的说明。本文则展开事件,对其具体的内容和应用进行阐述。通过实际的例程让大家可以更清楚的明白事件的运行机制。

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

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

相关文章

探寻空间计算服务商公司概况,广东省空间计算科技集团合作案例分享 - 工业品牌热点

本榜单依托全维度市场调研与真实行业口碑,深度筛选出五家空间计算领域标杆企业,为企业选型提供客观依据,助力精准匹配适配的服务伙伴。 TOP1 推荐:广东省空间计算科技集团有限公司 推荐指数:★★★★★ | 口碑评分…

不可篡改环境下的测试新挑战

区块链智能合约的“一次部署、永久运行”特性&#xff0c;使其执行结果验证成为质量保障的核心命脉。本文从测试工程师视角出发&#xff0c;构建覆盖合约全生命周期的可验证性验收框架&#xff0c;涵盖工具链选择、测试策略设计及行业最佳实践。 ‌一、智能合约验证的独特性要求…

vue3+python+django电影影视剧本创作论坛交流系统

目录项目概述技术架构核心功能创新点应用价值开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;项目概述 该系统基于Vue3前端框架与PythonDjango后端技术栈&#xff0c;构建一个专注于电影影视…

vue3+python+django的中草药销售系统的设计与开发

目录 摘要 开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 摘要 中草药销售系统的设计与开发基于现代Web技术栈&#xff0c;采用Vue3作为前端框架、PythonDjango作为后端服务&#xff0c;构…

航空调度系统灾备切换可靠性测试框架‌——面向测试工程师的实战方法论

‌一、灾备测试的战略价值‌ 航空调度系统&#xff08;ATS&#xff09;作为民航神经中枢&#xff0c;其99.999%的高可用要求使灾备体系成为生命线。根据国际航空运输协会&#xff08;IATA&#xff09;标准&#xff0c;核心调度系统故障必须满足&#xff1a; ‌RTO‌&#xff…

vue3+python+django的乡镇中学网上办公自动化系统

目录乡镇中学网上办公自动化系统摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;乡镇中学网上办公自动化系统摘要 该系统基于Vue3前端框架、Python编程语言及Django后端框架开发&#x…

vue3+python+django的典当行抵押信息管理系统的设计与实现

目录典当行抵押信息管理系统的设计与实现摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;典当行抵押信息管理系统的设计与实现摘要 该系统基于Vue3前端框架、Python编程语言及Django后端…

CC教程

CC教程1.Shift+tab 切换模式 accept edits on 不需要确认 plan mode on 计划模式 for shortcuts 提示模式

可信平台成“帮凶”?2025年10月钓鱼与勒索攻击激增,Tycoon 2FA绕过MFA引发新警报

一、当“Google招聘”邮件成为钓鱼入口2025年10月&#xff0c;全球网络安全社区迎来一个令人不安的趋势&#xff1a;钓鱼攻击不仅数量激增&#xff0c;其技术复杂度和隐蔽性也显著升级。据知名网络安全媒体《Cyber Security News》发布的月度威胁报告&#xff0c;该月多起高影响…

Android与iOS跨平台UI一致性验收实战指南:从挑战到自动化避坑

一、跨平台UI一致性核心挑战‌ ‌1.1 设计范式差异‌ ‌Material Design (Android)‌&#xff1a;强调海拔阴影、动态色彩响应&#xff0c;注重深度与交互反馈。‌Human Interface (iOS)‌&#xff1a;注重半透明毛玻璃效果、扁平化层级&#xff0c;追求简洁与直观。‌典型案…

vue3+python+django的农村智慧社区系统设计与开发

目录农村智慧社区系统设计与开发摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;农村智慧社区系统设计与开发摘要 农村智慧社区系统基于Vue3前端框架、Python后端语言及Django框架开发&…

2025年目前知名的节能门窗生产厂家找哪家,智能门窗/被动式窗/别墅装修/家居设计/高端定制门窗源头厂家推荐 - 品牌推荐师

在全球“双碳”目标驱动下,建筑能耗占比超30%的门窗行业迎来转型关键期。据中国建筑金属结构协会数据,2024年节能门窗市场规模突破1200亿元,年复合增长率达15%,但市场仍存在产品同质化严重、技术标准参差不齐、环保…

“MFA已过时?”Tycoon 2FA钓鱼套件掀起会话劫持风暴,全球超6万账户沦陷

2025年10月&#xff0c;一家位于波士顿的医疗科技公司遭遇一场“教科书式”的网络攻击。攻击者并未暴力破解密码&#xff0c;也没有利用零日漏洞&#xff0c;而是通过一封看似普通的会议邀请邮件&#xff0c;附带一个名为“Q3_Investor_Briefing.html”的附件。财务总监Sarah点…

vue3+python+django的流量卡售卖系统的设计与实现

目录 摘要 开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 摘要 该系统基于Vue3前端框架与PythonDjango后端技术栈&#xff0c;设计并实现了一个高效、安全的流量卡在线售卖平台。前端采用…

2026-1-18 humann工作流总结

环境的搭建和激活点击查看代码 conda create --name biobakery3 python=3.7 conda activate biobakery3##### 设置conda的环境 `conda config --add channels defaults conda config --add channels bioconda conda co…

一封“2FA更新”邮件,险些让数亿开发者中招——NPM供应链钓鱼事件揭示开源生态的致命软肋

一、凌晨三点&#xff0c;一个JavaScript包悄悄变了味 2025年9月8日凌晨&#xff0c;全球数百万开发者还在沉睡&#xff0c;而一场针对开源生态的精准打击已悄然完成。攻击者通过一封伪装成“NPM支持团队”的钓鱼邮件&#xff0c;成功窃取了知名开源维护者 Josh Junon&#xf…

揭秘专业的渠道经理吴嘉林怎样拓展渠道,有何独特方法? - 工业品牌热点

2026年AI营销生态持续迭代,专业渠道经理的运营能力已成为企业AI服务落地、市场版图扩张的核心纽带。无论是跨区域渠道招商布局、代理商全周期赋能,还是渠道运营痛点破解,优质渠道团队的专业度直接决定企业AI产品的市…

当“猎头私信”变成钓鱼入口:LinkedIn成企业安全新盲区,AitM攻击绕过MFA引发警报

一、“您好&#xff0c;我们有个高管职位想和您聊聊”2025年秋&#xff0c;欧洲一家中型金融科技公司的CFO收到一条来自LinkedIn的私信&#xff1a;“您好&#xff0c;我是某国际风投的合伙人&#xff0c;看到您的履历非常出色&#xff0c;我们正在为一家快速成长的支付平台物色…

总结2026年宁波镇海实力强的刑事律师事务所,浙杭律师事务所实力雄厚 - 工业品牌热点

2026年法治社会建设持续深化,选择靠谱的刑事律师事务所已成为当事人维护自身合法权益的关键一步。无论是复杂的职务侵占案件辩护、普通刑事纠纷代理,还是企业刑事合规风险防控,优质律所的专业能力直接决定案件的走向…

Django+vue3课程教学作业批改系统 远程在线教育系统

目录摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 该系统基于Django后端框架与Vue3前端框架&#xff0c;构建了一个支持远程在线教育、课程教学与作业批改的综合性平台。通过模块…