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

相关文章
|
并行计算 PyTorch 算法框架/工具
pytorch在GPU上运行模型实现并行计算
pytorch在GPU上运行模型实现并行计算
154 0
|
机器学习/深度学习 人工智能 TensorFlow
如何实现Tensorflow多机并行线性加速?
tensorflow/core/kernels/http://training_ops.cc中的ApplyXXXOp(ApplyGradientDescentOp,ApplyAdagradOp,ApplyMomentumOp等),将本地的梯度更新修改为 发送 如何实现Tensorflow多机并行线性...
4929 0
|
并行计算 索引
《CUDA高性能并行计算》----第3章 从循环到网格 3.1 并行化 dist_v1
现在我们要使用第2章所学知识将第1章和附录C中的C语言代码进行并行化。回顾我们创建的两个版本的距离计算应用。在``dist_v1``中我们使用一个for循环来计算一个数组的距离值。在``dist_v2``中我们为输出值创建了一个数组然后调用``distanceArray()``方法来计算全部距离值的数组(同样是使用一个for循环串行的计算)。
1596 0
|
并行计算 C++ Windows
《CUDA高性能并行计算》----0.7 本书代码
本书应用程序的代码可以通过www.cudaforengineers.com获取。虽然书中采用了一些代码片断和“骨架”代码(skeleton code),但标记为“代码清单”的代码(包含行号)是真实可运行代码的一部分。
1979 0
|
并行计算
《CUDA高性能并行计算》----1.4 推荐项目
项目1~5是关于运行其他CUDA样例程序的练习。
1347 0
|
并行计算
《CUDA高性能并行计算》----3.6 推荐项目
1.改变距离数组中的元素数目并进行实验。当你将数目N定义成128、1024、63、65的时候是否遇到了一些问题? 2.计算包含4096个距离的距离数组并尝试改变TPB。你可以在系统上运行的最大(和最小)线程块大小是多大?注意,这个问题的答案依赖于你的GPU设备的计算能力。
1335 0
|
Web App开发 并行计算 异构计算
《CUDA高性能并行计算》----2.4 推荐项目
1.去CUDA Zone注册并加入到CUDA开发者中(如果读者还没有这样做的话)。 2.观看 www.nvidia.com/object/nvision08_gpu_v_cpu.html的视频,体会关于并行和串行执行的有趣的对比。
1831 0
|
并行计算
《CUDA高性能并行计算》----1.3 本章小结
在本章,我们运行了一些CUDA样例程序并且获得了GPU并行计算的直观体验。同时我们介绍了两个串行的程序,将在后文作为并行化的实验函数。其中dist_v1提供了一个最简单的并行化实验例子,而dist_v2则描述了一个实用的结构和更典型的数据流。
1169 0
|
并行计算
《CUDA高性能并行计算》----2.3 本章小结
现在你已经掌握了开始创建一个拥有使用了CUDA进行GPU并行计算的优点的应用所必需的工具,我们将在第3章中开始创建CUDA应用。
803 0