《OpenACC并行程序设计:性能优化实践指南》一 2.1 测试代码:共轭梯度法

2.1 测试代码:共轭梯度法

本章中使用共轭梯度法作为标准测试代码。共轭梯度法是一种迭代算法,常用来逼近一组线性方程组成的大型稀疏系统。由于这种系统通常规模庞大,因此难于使用直接法进行求解。阅读本章不需要理解共轭梯度法的数学含义。提供了共轭梯度法的C和Fortran编码实现供读者参考。简洁起见,本章仅展示了C代码。不过不必担心,C代码的应用方式可以扩展到Fortran代码,两者区别不大。本章使用的代码遵循Apache许可,版本2.0。详情请阅读许可文件。
示例代码包含两种数据结构。第一个是向量结构,结构成员包含指向数组的指针和一个表征数组长度的整型变量。第二个是矩阵,以压缩稀疏行形式存储一个二维稀疏矩阵,该矩阵仅存储各行的非零元素。第二个数据结构还包含一个元数据,用来表示非零元素在原矩阵中的位置。这两种数据结构连同多个用来创建、销毁、操控这些数据结构的函数可以在vector.h和matrix.h头文件中找到。
性能导向开发的第一个任务是开发一套代码并获取它的性能作为基准性能。基准性能被用来作为逐步加速和比较的基础,以考察正确性和性能特性。makefile文件连同测试代码经过预设置以适应PGI编译器进行编译。如果读者使用其他OpenACC编译器,有必要对makefile文件进行适当的修改。

2.1.1 代码编译

提供的makefile文件可以用来编译CPU串行版代码,通过简单的make命令使用PGI编译器完成编译。为了给初始性能研究提供更多的有用信息,对编译器选项进行了一些修改,添加了一些性能调试选项。
-Minfo=all,ccff:该编译器选项告知编译器将它如何对代码进行优化的说明打印出来,并将这些信息植入到生成的可执行文件中。支持常用编译器反馈格式的调试工具能够利用这些信息。
修改后的makefile见图2-1。
这里,得到一个可执行程序(cg.x),该程序将串行执行共轭梯度基准测试。期望的输出见图2-2。可执行程序运行时间与CPU性能密切相关,会有一定出入,但总迭代次数和误差值与展示的求解值是相匹配的。

2.1.2 初始测试

首先使用PGProf性能调试器获取代码的基准CPU性能。这将有助于理解可执行程序的哪部分最为耗时,从而便于重点关注热点函数和循环,在加速后取得最好的效果。安装PGI编译器和OpenACC开发包后,就获得了PGProf性能调试器的使用权。在命令行终端键入pgprof命令可以打开PGProf性能调试器。性能调试器窗口开启后,在File菜单中选择New Session项,打开Create New Session对话框。通过File对话框,点击Browse按钮浏览并选择可执行程序,即cg.x。选中可执行程序后,点击Next按钮和Finish按钮。之后,性能调试器将开始运行可执行程序并以常规采样频率对程序运行状态进行监控,获取性能信息。运行完毕后,选择窗体底部的CPU详情选项卡,可执行程序中最为重要的函数信息将显示出来,如图2-3所示。
此时,双击最为耗时的函数matvec。会弹出一个对话框,请你选择源程序所在的路径。选择路径完毕后,将弹出一个关于matrix_functions.h中的matvec子程序的新选项卡。第33行对应的循环体将在左侧显示一个标记,该标记表明性能调试器可以获取该循环对应的编译器反馈信息。将鼠标停留在这些图形标记上,将弹出一个窗体,该窗体展示编译器能够对此循环附加的优化以及该循环的计算量大小,如图2-4所示。

分析编译器反馈信息是理解编译器可对代码采取何种优化的唯一途径。编译器可能会重新组织代码中的循环体,将循环拆分为更多个可调度的代码块,通过形如SSE和AVX类的向量指令操作将代码并行化,或不采取任何优化,以避免对难以优化和保证正确性的代码部分进行误操作。通常,编程人员对于编译器难以理解的代码有更深入的领悟。编译器对这些代码通常无法进行优化和并行化。本章致力于为编译器提供更多的信息,用以提升编译器的优化和并行化能力。这便是OpenACC编程的首要目标:为编译器提供充足的附加信息,指引它进行并行化编译,并使代码适用于各种类型的硬件设备。
经过对CPU性能表进行分析,发现了三个热点函数:matvec,waxpy和dot。耗时第四多的子程序是allocate_3d_poisson_matrix。但该函数是一个初始化子程序,仅仅运行一次,因此对该函数不做优化。代码显示,matvec子程序包含一个二重嵌套循环,实现了稀疏矩阵/向量乘。其他两个子程序均包含一个单重循环,实现了两种常见的向量操作(aX+bY和点乘)。这就是需要集中精力进行并行化的三个循环体。

时间: 2024-08-30 22:50:45

《OpenACC并行程序设计:性能优化实践指南》一 2.1 测试代码:共轭梯度法的相关文章

《OpenACC并行程序设计:性能优化实践指南》一 1.1 简单的数据并行循环

1.1 简单的数据并行循环 在顺序处理器程序设计中,需要编写计算某个最终结果所需要的任务和数据操作的程序.通过创建OpenACC,编程人员可以插入编译指令给编译器提供信息,而这些编译指令是关于并行机会和数据在加速器与主机间来回传输的信息.结合编译器,程序员使用注记来创建.调试和优化并行代码,使得程序达到高性能. OpenACC帮助程序员编写高效的数据和任务并行软件. 数据并行关注跨多个并发执行线程的分布式数据操作.在计算机科学中,线程是串行执行一段代码的线程的缩写.通过使用多个线程,应用程序可以

《OpenACC并行程序设计:性能优化实践指南》一 导读

前言 欢迎阅读本书,这是一本由浅入深的书籍,从初学者到高级开发人员,都可以通过本书了解OpenACC的相关知识.本书由世界各地的24位作者共同编著而成,他们在高度并行编程的教学和实践方面分享了自己的专业知识.书中的例子既有时效性又不会过时.每个章节都是自包含的,可用于自学,也可以作为课堂教学的一部分. 这是一本关于并行编程的书,不仅仅介绍OpenACC语法或从文档中收集的信息,更介绍了如何编写实际的.高性能的以及可移植的程序,这些程序可以运行在从CPU到GPU的大量设备上.具体而言,书中演示了使

《OpenACC并行程序设计:性能优化实践指南》一 1.3 Amdahl定律及其扩展

1.3 Amdahl定律及其扩展 绘制任务运行时间,可以看到并行增加应用程序的扩展行为.并行计算的理论性能:运行在有N个处理单元的并行计算机上,理论上可以获得N倍加速.换一句话说,一个程序运行在10核处理器上可能获得10倍加速(对于固定大小的问题),在支持1000个并发执行线程的GPU上获得1000倍加速.开发人员依据Amdahl定律来讨论并行与串行间的加速比. 用计算机架构师Gene Amdahl来命名Amdahl定律.它不是实际上的定律,但是修改串行程序使其并行执行时,它相当接近模型理论加速

《OpenACC并行程序设计:性能优化实践指南》一 2.6 小结

2.6 小结 OpenACC是一种描述型并行编程模型.在本章中,通过一个测试函数的应用,使用了OpenACC的多种特性来描述并行度和数据操控,并针对特定平台对代码进行了优化.尽管使用的是PGI编译器和PGProf性能调试器,但类似的优化流程也是适用于任何支持OpenACC工具包的应用的. 1.获得应用程序的性能分析结果,辨识和挖掘代码中的可并行之处. 2.逐步向编译器描述代码中可挖掘出的并行性.如果主机端和设备端使用各自的存储器,这一步骤后获得的代码很可能会减速. 3.描述应用程序的数据移动.编

《OpenACC并行程序设计:性能优化实践指南》一 2.4 优化循环

2.4 优化循环 此刻,测试代码可以比原始代码加速2倍了.但这是能够获得的性能最好的代码吗?目前添加的导语可以在任何加速器上实现代码的提速,但为了在特定的测试机器上取得最佳性能,需要使用特定目标设备优化技术.万幸的是,OpenACC提供了一种指定devcie_type的优化手段,因此特定的子句仅在编译为指定设备的代码时才会生效.首先从分析目前代码的编译器反馈信息着手,针对matvec子程序,因为它是最为耗时的代码段(见图2-22). 编译器提供了它如何并行化两个矩阵循环(第30和24行)的信息.

《OpenACC并行程序设计:性能优化实践指南》一 2.2 描述并行度

2.2 描述并行度 已经获知了代码最为耗时的部分,接下来开始并行化重要的循环体.通常最好的优化方法是始于最为耗时的子程序,逐步向下探索.加速耗时75%的代码,效果优于加速仅耗时15%的代码.这表明应该首先致力于matvec子程序的加速,然后再对waxpby和dot进行加速.但是,因为这可能是读者的OpenACC处女行,所以从这三个函数中最为简单的一个开始,逐步改进,直至优化最为复杂的子程序.这就是并非首先加速matvec函数的原因. 2.2.1 加速waxpby 从vector_function

《OpenACC并行程序设计:性能优化实践指南》一 第2章 性能导向开发

第2章 性能导向开发 Jeff Larkin 美国加利福尼亚州圣克拉拉县NVIDIA公司 本章的目的是通过一个性能测试应用的加速来初步了解OpenACC编程方法.读者将学习如何添加OpenACC导语以及如何进行代码性能调优,进而逐步提升应用的性能.本章最后,示例程序将从串行代码改进为高性能并行代码.该并行代码可以运行在图形处理器(GPU)加速器和多核处理器(CPU)上. 阅读本章后,读者将会理解以下内容: OpenACC内核指令 OpenACC数据指令和子句 PGProf性能调试器的使用 Ope

《OpenACC并行程序设计:性能优化实践指南》一 3.2 逐步性能提升

3.2 逐步性能提升 本书的示例表明,通过提交更多的活动和优化数据传输,使用性能分析驱动的开发可不断提升OpenACC应用程序的性能.图3-2列出了优化混合应用遵循的模式. 从应用准备开始性能优化周期,然后进行实际的性能测量,并对性能数据进行分析.基于这些数据,编程开发人员尝试减少性能问题,并重新开始整个过程.下面使用Score-P和Vampri讲解性能提升周期里的前三步,以CUDA加速粒子单元模拟为例,其中CUDA部分代码很容易用OpenACC实现代替来获得同样的结果.此外,还引入了各种优化步

《OpenACC并行程序设计:性能优化实践指南》一 1.5 无锁编程

1.5 无锁编程 互斥锁是用于同步进程或线程的常用机制,这些进程或线程需要访问并行程序中的一些共享资源.互斥锁就像它们名字所说的:如果一个线程锁住了资源,另一个线程希望访问它需要等待第一个线程解锁这个资源.一旦资源被解锁,第二个线程在处理这个资源时会一直锁住它.程序的线程必须遵守:一旦使用完共享资源尽快解锁,以保持程序执行流程. 由于OpenACC中没有锁,编程人员需要熟悉无锁编程和数据结构的概念.无锁方法保证至少一个执行该方法的线程的进展.可能存在某些线程可以被延迟的情况,但是保证至少一个线程