《CUDA高性能并行计算》----3.2 并行化dist_v2-阿里云开发者社区

开发者社区> 华章出版社> 正文
登录阅读全文

《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的版本提供了解决思路。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享: