是时候把我们的目光从CUDA样例程序移开,构建并运行我们自己的程序。在本节我们将给出完成相同功能的两个应用的代码dist_v1和dist_v2。每个应用都计算了从一个参考点到N个在直线上均匀分布的点之间的一组距离。这一任务精心设计,力求简单,但是对于工程师而言仍然具有明确的指导意义。读者也很容易考虑到如何将这里的实现推广到更加通用的场合。
值得注意的是,虽然dist_v1与dist_v2实现的是同一个任务,但是它们通过不同的方法来完成。
dist_v1使用一个for循环,循环内先对循环变量进行归一化得到一个输入位置然后计算并存储该位与参考位置的距离。这里我们建立一个distance()函数计算一个参考位置和某个点间的距离,该函数调用了N次。
dist_v2以建立一个输入位置的数组作为开始,然后将这个数组指针传给distance-Array()函数,该函数在一次调用中计算并存储整个数组距离值。
dist_v1和dist_v2将作为我们在第3章中讲解并行化的初始实验对象。这里给出它们的代码,每个程序的创建、编译以及运行的指南和详细解释参见附录C。这里给出另一个提示:你需要能够编译并运行dist_v1和dist_v2这两个程序。如果你对此有任何问题,请参考附录C来找到解决这些问题的方法。
dist_v1应用只包含一个文件main.cpp,内容如代码清单1.1所示。对应的Linux下的Makefile文件参见代码清单1.2。
dist_v2应用的代码包含了三个文件:main.cpp(参见代码清单1.3)、aux_functions.cpp(参见代码清单1.4)以及头文件aux_functions.h(参见代码清单1.5)。Linux下的Makefile文件参见代码清单1.6。
这里我们到达了本章的最后一个提示:在继续之前,读者需要运行dist_v1和dist_v2并且使用一个调试器证实计算的距离的值从0.5开始(归一化得到的值0与参考点0.5的距离),在接近数组中间的时候递减到0,继续到末尾时增长到0.5(对应于从参考点0.5到归一化值1.0之间的距离)。如果读者遇到了任何问题,请阅读附录C“C语言编程需知”中的相关内容。
相关资源:《GPU高性能计算之CUDA》书中实例源代码