《CUDA高性能并行计算》----3.2 并行化dist_v2

简介: 第一个并行化的距离应用``dist_v1_cuda``不具有充分的代表性,因为它并没有涉及大量输入数据。现在我们已经准备好了并行化第二个距离应用``dist_v2``,这是一个更加典型的例子,涉及对一个输入数组的操作。将一个数组数据传递到GPU的策略并不复杂:

本 节 书 摘 来 自 华 章 出 版 社 《CUDA高性能并行计算》 一 书 中 的 第3章,第3.2节, 作 者 CUDA for Engineers: An Introduction to High-Performance Parallel Computing[美] 杜安·斯托尔蒂(Duane Storti)梅特·尤尔托卢(Mete Yurtoglu) 著,苏统华 项文成 李松泽 姚宇鹏 孙博文 译 , 更 多 章 节 内 容 可 以 访 问 云 栖 社 区 “华 章 计 算 机” 公 众 号 查 看。

3.2 并行化dist_v2

第一个并行化的距离应用dist_v1_cuda不具有充分的代表性,因为它并没有涉及大量输入数据。现在我们已经准备好了并行化第二个距离应用dist_v2,这是一个更加典型的例子,涉及对一个输入数组的操作。将一个数组数据传递到GPU的策略并不复杂:

1.在设备内存(GPU)上创建一个数组,类型和大小与主机内存(CPU)上的输入数组一致。

2.在设备内存上创建一个内存用来存储输出的数据。(你可以选择使用复用输入数组的办法存储输出,但是目前我们先将输入和输出分开考虑。)

3.将主机端的输入数组复制到设备内存上对应的数组上。

4.启动核函数进行计算并将输出值存储在设备内存上的输出数组中。

5.将设备内存中的输出数组复制回主机内存中的对应数组上。

6.释放设备上的数组内存。

上面列出的步骤很适合dist_v2的组织方式,其中包括了一个main.cpp文件(包含了main()函数的代码),一个单独的文件(名为aux_functions.cpp)来包含定义辅助功能的代码,一个头文件(名为aux_functions.h)来包含像distanceArray()函数一样的原型函数,使其可以在其他文件中被“看见”并调用(例如main.cpp文件)。

因为步骤4中涉及CUDA核函数调用,我们将aux_functions.cpp(及其对应的头文件)替换为kernel.cu(及其对应的头文件—kernel.h)。完整的代码在代码清单3.3、代码清单3.4以及代码清单3.5中显示,代码清单3.6是Makefile文件。


9a2c05249f7605e25ca1fb051829dd7ec88b8855

Dist_v2_cuda/main.cpp 的代码与dist_v2/main.cpp几乎一样。不同之处包括把scale()移到main.cpp中,并引用kernel.h来代替原来的aux_functions.h文件。最大的变化发生在kernel.cu文件中新定义的distanceArray()函数中。


c1a6cc5af8d76b5a549525356853b2281a2c75ed

这里需要强调几个要点:
1. distanceKernel()函数与dist_v1_cuda/kernel.cu中的版本有明显的不同。这里,形参包含了一个指针d_in,指向一个已经被构建好的输入数组。

2.对于distanceArray()新的定义执行了上面所列出的全部5个步骤。设备端的输入输出数组在第23~28行代码中定义;输入数据从主机端复制到设备端在第31行执行;从核函数调用并获取GPU并行化的执行结果在第43行;输出的距离值从设备端复制到主机端在第37行;设备端的内存释放在第40行和第41行。

3.函数distanceArray()调用核函数distance-Kernel()。这样的函数被称为封装(warpper)或者启动函数(launcher)。


eced5668df386f81e1da2f44a0f41fb0aa37cac0


7dd5166a76153095bf137455ad1abacb7a180829

读者可以用这些现成的代码编译并执行dist_v2_cuda。验证这些距离的值是否被正确计算,并且留意一下所有关键的CUDA代码都包含在kernel.cu文件中。对比distanceArray()函数在dist_v2/aux_functions.h和dist_v2_cuda/kernel.h中的原型。注意这些原型是完全相同的,但是函数的定义却被改变了。用软件开发的术语来说,我们改变了实现但是保持接口不变。这种方式为已有程序开发支持CUDA的版本提供了解决思路。

相关文章
|
6月前
|
数据采集 人工智能 自动驾驶
《突破AI数据标注高成本枷锁,势在必行!》
在人工智能快速发展的背景下,数据标注作为AI模型训练的基础,其高成本问题成为制约行业发展的关键因素。主要体现在人力、时间和管理成本上,尤其是在复杂领域和大规模数据处理中。为解决这一难题,行业探索了多种创新方案:技术层面,自动化标注工具与半监督学习技术显著提升效率;商业模式上,分布式众包和专业平台降低运营成本;人才培养方面,校企合作与激励机制优化标注质量。尽管仍存挑战,但通过多方协同,有望推动AI数据标注行业的高效发展,助力AI技术广泛应用。
329 9
|
10月前
|
人工智能 C++ iOS开发
ollama + qwen2.5-coder + VS Code + Continue 实现本地AI 辅助写代码
本文介绍在Apple M4 MacOS环境下搭建Ollama和qwen2.5-coder模型的过程。首先通过官网或Brew安装Ollama,然后下载qwen2.5-coder模型,可通过终端命令`ollama run qwen2.5-coder`启动模型进行测试。最后,在VS Code中安装Continue插件,并配置qwen2.5-coder模型用于代码开发辅助。
17937 7
|
存储 NoSQL Redis
docker搭建Redis Cluster集群环境
docker搭建Redis Cluster集群环境
342 1
|
人工智能 文字识别 算法
打造全场景、跨领域、多模态的AI工作流 | 开源图像标注工具 X-AnyLabeling v2.4.0 正式发布!
X-AnyLabeling是一款强大的辅助标注工具,集成了AI推理引擎和丰富功能,为图像数据工程师提供一站式解决方案。它支持图像和视频文件的自动标注,提供了包括矩形框、多边形在内的七种标注样式,适应多样化的训练场景需求。X-AnyLabeling内置了多种SOTA级AI模型,如YOLO、SAM系列等,并支持GPU加速和多种数据集格式的导入导出,确保高效的数据处理。此外,它还具备良好的跨平台兼容性,可在多种操作系统上运行,并提供详尽的帮助文档和社区支持,帮助用户轻松上手并解决使用过程中遇到的问题。
1482 2
打造全场景、跨领域、多模态的AI工作流 | 开源图像标注工具 X-AnyLabeling v2.4.0 正式发布!
解决win11开启移动热点共享手机连上后无法上网的问题
本文提供了解决Windows 11开启移动热点后手机无法上网问题的步骤:通过控制面板进入网络和共享中心,在以太网属性中勾选“允许其他网络用户通过此计算机的Internet连接来连接”,然后手机重新连接共享热点即可上网。
|
存储 Kubernetes 负载均衡
在K8S中,kube-proxy ipvs 和 iptables 有何异同?
在K8S中,kube-proxy ipvs 和 iptables 有何异同?
|
存储 算法 数据挖掘
LeetCode 题目 43:字符串相乘 多种算法分析对比 【python】
LeetCode 题目 43:字符串相乘 多种算法分析对比 【python】
|
SQL 存储 Java
Hive教程(06)- Hive SerDe序列化与反序列化
Hive教程(06)- Hive SerDe序列化与反序列化
494 0
|
运维 安全 网络安全
通过Xshell连接有跳板机/堡垒机的服务器
通过Xshell连接有跳板机/堡垒机的服务器
1956 0
|
关系型数据库 MySQL Linux
CentOS7 下使用yum安装MySQL
CentOS7 下使用yum安装MySQL
1136 0