CUDA实践指南(十一)

本文涉及的产品
数据传输服务 DTS,同步至DuckDB 3个月
简介:

重叠计算和数据传输:

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版本下载安装教程——全版本安装包获取教程
1018 0
|
人工智能 安全 API
如何在数字世界复刻一个高还原、高拟真的“你”
通过阿里云智能媒体服务IMS完成数字人形象训练、人声克隆定制,并使用Timeline实现视频合成及创作,打造一个“声形俱佳”的数字分身。
727 0
|
Python
Python传参数:传值还是传址?
【2月更文挑战第18天】
686 6
|
算法
【MATLAB】 SSA奇异谱分析信号分解算法
【MATLAB】 SSA奇异谱分析信号分解算法
973 0
|
JSON 数据格式
layui富文本编辑器文档layedit组件的调用和图片上传接口的使用
layui富文本编辑器文档layedit组件的调用和图片上传接口的使用
955 0
|
人工智能 自然语言处理 前端开发
【CodeBuddy】三分钟开发一个实用小功能之:记忆翻牌配对游戏
CodeBuddy 是一款强大的 AI 编程助手,能够将自然语言描述快速转化为可运行的代码。通过记忆翻牌游戏的开发案例,展示了其从需求理解到技术实现的全流程支持:利用 CSS 的 `transform` 和 `grid` 布局实现动态卡片与响应式设计,借助 JavaScript 管理游戏状态和交互逻辑。AI 不仅能自动生成代码框架,还能优化动画效果、处理防抖机制等细节,大幅降低开发门槛。这一工具让开发者专注于创意本身,推动编程从“手动编写”向“思维传递”转变,开启人机协作新篇章。
589 7
【CodeBuddy】三分钟开发一个实用小功能之:记忆翻牌配对游戏
|
存储 并行计算 算法
CUDA统一内存:简化GPU编程的内存管理
在GPU编程中,内存管理是关键挑战之一。NVIDIA CUDA 6.0引入了统一内存,简化了CPU与GPU之间的数据传输。统一内存允许在单个地址空间内分配可被两者访问的内存,自动迁移数据,从而简化内存管理、提高性能并增强代码可扩展性。本文将详细介绍统一内存的工作原理、优势及其使用方法,帮助开发者更高效地开发CUDA应用程序。
|
SQL 安全 API
Django的安全性基石:防止SQL注入攻击
【4月更文挑战第15天】Django,Python的流行Web框架,以其内置的安全机制防范SQL注入攻击。通过ORM系统、安全查询API、用户输入验证和CSRF保护,确保应用安全。开发者应遵循最佳实践,如使用ORM、严格验证输入、及时更新库和限制敏感数据访问,以增强安全性。