CUDA实践指南(十一)

简介:

重叠计算和数据传输:

cudaMemcpyAsync(a_d, a_h, size, cudaMemcpyHostToDevice, 0);
kernel<<<grid, block>>>(a_d);
cpuFunction();

cudaMemcpyAsync()函数的最后一个参数是流ID,在这种情况下,它使用默认流stream 0。内核也使用默认流,直到内存复制完成时才会开始执行; 因此,不需要明确的同步。 由于内存拷贝和内核都立即将控制权交还给主机,因此主机函数cpuFunction()与其执行重叠。
在重叠计算和数据传输中,内存复制和内核执行将按顺序进行。 在能够并发复制和计算的设备上,可以将设备上的内核执行与主机和设备之间的数据传输重叠。 设备是否具有此功能由cudaDeviceProp结构的asyncEngineCount字段指示(或deviceQuery CUDA示例的输出中列出)。 在具有此功能的设备上,重叠再次需要固定主机内存,此外,数据传输和内核必须使用不同的非默认流(具有非零流ID的流)。 此重叠需要非默认流,因为使用默认流的内存副本,内存集函数和内核调用仅在设备上的所有前面的调用(在任何流中)完成之后才开始,并且设备上没有操作(在 任何流)开始直到它们完成。
并发复制并执行:

cudaStreamCreate(&stream1);
cudaStreamCreate(&stream2);
cudaMemcpyAsync(a_d, a_h, size, cudaMemcpyHostToDevice, stream1);
kernel<<<grid, block, 0, stream2>>>(otherData_d);

在此代码中,将创建两个数据流,并将其用于数据传输和内核执行,如cudaMemcpyAsync调用的最后一个参数和内核的执行配置中所指定的。
并发复制和执行演示了如何使用异步数据传输重叠内核执行。 当数据依赖性可以将数据分解为块并以多个阶段进行传输时,可以使用此技术,启动多个内核以在每个块到达时对其进行操作。 顺序复制和执行以及分步并行复制和执行都证明了这一点。 他们产生相同的结果。 第一部分显示了参考顺序实现,它在N个浮点数组(其中N假定可以被nThreads均匀整除)上进行传输和操作。
顺序复制并执行:

cudaMemcpy(a_d, a_h, N*sizeof(float), dir);
kernel<<<N/nThreads, nThreads>>>(a_d);

分步并发复制和执行显示如何将传输和内核执行分解为nStream阶段。 这种方法允许一些数据传输和执行的重叠。
分阶段并发复制和执行:

size = N * sizeof(float) / nStreams;
for (i = 0; i<nStreams; i++) {
    offset = i*N / nStreams;
    cudaMemcpyAsync(a_d + offset, a_h + offset, size, dir, stream[i]);
    kernel << <N / (nThreads*nStreams), nThreads, 0,
        stream[i] >> >(a_d + offset);
}

(在分步并发复制和执行中,假设N可以被nThreads * nStreams均匀整除。)由于流内的执行是按顺序进行的,所以内核将不会启动,直到数据在各自流中传输完成。目前的GPU可以同时处理异步数据传输和执行内核。具有单个副本引擎的GPU可以执行一次异步数据传输并执行内核,而具有两个副本引擎的GPU可以同时执行从主机到设备的一次异步数据传输,从设备到主机的一次异步数据传输以及执行内核。 GPU上的拷贝引擎数量由cudaDeviceProp结构的asyncEngineCount字段给出,该字段也在deviceQuery CUDA Sample的输出中列出。 (应该指出的是,不能将阻塞传输与异步传输重叠,因为阻塞传输发生在默认流中,所以直到所有先前的CUDA调用完成才会开始阻塞传输,它不允许任何其他CUDA调用直到它完成。)描述两个代码段的执行时间线的图如图1所示,而nStreams等于4,用于分步并发复制并在图的下半部分执行。
1

对于这个例子,假设数据传输和内核执行时间是可比的。 在这种情况下,当执行时间($t_{E}$)超过传输时间($t_{T}$)时,对于顺序版本,整体时间的粗略估计是分阶段版本的$t_{E}+t_{T}/nStreams$与$t_{E}+t_{T}$。 如果传输时间超过执行时间,则整体时间的粗略估计为$t_{E}+t_{T}/nStreams$

相关实践学习
自建数据库迁移到云数据库
本场景将引导您将网站的自建数据库平滑迁移至云数据库RDS。通过使用RDS,您可以获得稳定、可靠和安全的企业级数据库服务,可以更加专注于发展核心业务,无需过多担心数据库的管理和维护。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
目录
相关文章
|
数据可视化 虚拟化 图形学
Autocad软件2018版本下载安装教程——全版本安装包获取教程
Autocad软件2018版本下载安装教程——全版本安装包获取教程
1199 0
|
算法
【MATLAB】 SSA奇异谱分析信号分解算法
【MATLAB】 SSA奇异谱分析信号分解算法
1148 0
|
缓存 前端开发 JavaScript
【面试题】金九银十,你准备好面试了吗? (30w字前端面试题总结)( React)
【面试题】金九银十,你准备好面试了吗? (30w字前端面试题总结)( React)
568 0
|
存储 并行计算 算法
CUDA统一内存:简化GPU编程的内存管理
在GPU编程中,内存管理是关键挑战之一。NVIDIA CUDA 6.0引入了统一内存,简化了CPU与GPU之间的数据传输。统一内存允许在单个地址空间内分配可被两者访问的内存,自动迁移数据,从而简化内存管理、提高性能并增强代码可扩展性。本文将详细介绍统一内存的工作原理、优势及其使用方法,帮助开发者更高效地开发CUDA应用程序。
|
存储 人工智能 运维
AI-Native的路要怎么走?一群技术“老炮儿”指明了方向
上世纪70年代,沃兹尼亚克、乔布斯等人成立Homebrew Computer Club,推动个人电脑普及。如今,创原会承袭这一精神,由CNCF执行董事Priyanka Sharma等构建,聚焦云原生和AI技术,汇聚各行业技术骨干,探索前沿科技。2024年创原会年度峰会达成“全面拥抱AI-Native”共识,解决算力与存储瓶颈,推动AI原生应用开发,助力千行万业智能化转型,成为行业创新风向标。
561 8
|
编解码 语音技术
FunASR升级热词定制化问题之热词进行ASR推理如何配置
FunASR升级热词定制化问题之热词进行ASR推理如何配置
1450 1
|
SQL 安全 API
Django的安全性基石:防止SQL注入攻击
【4月更文挑战第15天】Django,Python的流行Web框架,以其内置的安全机制防范SQL注入攻击。通过ORM系统、安全查询API、用户输入验证和CSRF保护,确保应用安全。开发者应遵循最佳实践,如使用ORM、严格验证输入、及时更新库和限制敏感数据访问,以增强安全性。
|
存储 监控 API
史上最全最完整,最详细,软件保护技术-程序脱壳篇-逆向工程学习记录(二)
本文详细介绍了软件保护技术中的程序脱壳过程,包括IAT(导入地址表)的重建、OD(OllyDbg)跟踪输入表、HOOK-API技术以及FSG、UPX和WinUpacx等常见压缩壳的加脱壳方法。文章通过具体实例和详细步骤,帮助读者理解并掌握逆向工程的基本技巧。[原文链接](https://developer.aliyun.com/article/1618653)
995 0
|
API Python
8-16|Python操作3Dmax简单例子
8-16|Python操作3Dmax简单例子

热门文章

最新文章