《高性能科学与工程计算》——3.3 案例分析:Jacobi算法

简介:

本节书摘来自华章计算机《高性能科学与工程计算》一书中的第3章,第3.3节,作者:(德)Georg Hager Gerhard Wellein 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.3 案例分析:Jacobi算法

Jacobi算法是数值分析和模拟中许多基于stencil循环方法的原型。在其最简单的形式中,可以用来求解一个标量函数Φ (r→, t)的扩散方程:


6935477fcdbdba688434da563d51a8db1e49f96c

求解一个长方形区域的狄利克雷边界条件。当使用有限差分法时,其微分算子是离散的(在不丧失一般性的前提下,这里我们限定为二维方程。但请分析习题3.4中,二维和三维性能的区别)。

<a href=https://yqfile.alicdn.com/8804c4dad97f4db8d05562192a51a3edce664c51.png" >

在每一个时间步长,Φ在坐标(xi, yi)处的修正值δΦ,由式(3-7)使用其四个邻居点的原值计算获得。当然,Φ的新值必须写回第二个数组中。当所有点都完成更新后,算法进入下一层迭代。代码清单3-1是该内核的一个可能实现。该实现解决了稳定状态的问题但缺乏收敛条件,当然这不是我们考虑的重点(注意交换t0和t1区域不需要逐个元素交换。同该算法的初步实现相比,仅通过交换第三个数组的索引,我们就获得了两倍的性能提升)。
许多优化方法都可能加速这段代码。我们首先使用平衡分析预测这段代码的性能,然后和实测值相比较。图3-5说明了一个二维Jacobi算法的五点更新过程。每次更新需要四次数据加载和一次数据存储操作,但是其“下行邻居”(downstream)phi(i+1, k, t0)在两次迭代之后一定会再次用到(从cache中),所以在计算代码平衡值时,只有三次数据读取操作(共有四次):Bc = 1.0 W/F(如包含写分配,则代码平衡值为1.25 W/F)。然而,如图3-5所示,按行遍历会将k坐标最大(即phi(i,k+1,t0))的元素第一次加载到cache中。这是在内存传输中不可避免的。如果cache足以容纳超过两行的数据元素,那么在cache中三次连续的行遍历会使用这个元素。在这种情况下,我们可以假设加载k和k-1行没有时间消耗,所以代码平衡值降为Bc = 0.5 W/F(如果包含写分配,其值为0.75 W/F)。如果内层维度逐渐变大(如图3-5所示,列变多),必然要增加一个,最终三个额外的数据加载操作导致代码平衡值回到令人不愉快的Bc = 1.0(1.25) W/F。
代码清单3-1 二维Jacobi算法的简单实现

0cab912d181f14bec190f46964b8702897cfa8a2

根据这些平衡因子,我们可以计算出给定硬件架构上代码的lightspeed。3.1.2节已经给出了在英特尔Xeon 5160平台上的STREAM结果。当cache足以容纳两个连续行时,数据传输特点和STREAM COPY以及SCALE相匹配:一次数据加载、一次数据存储,再加上一次强制性写分配。因为Jacobi内核只包含一次乘法操作,而不是三次加法操作,所以理论的机器平衡值Bm = 0.111 W/F不得不进行修改。因此我们使用


<a href=https://yqfile.alicdn.com/f617fc7ea37162fa19d58297b82f576be4380b1b.png
" >

基于这个理论值,并假定写分配不能避免,因此:

<a href=https://yqfile.alicdn.com/ae186818b4f41dee138f36cd03358fb8769fd148.png
" >

其中,修正的理论峰值性能为P+max = 12•4/6GFlop/s = 8 GFlop/s,则预测性能为1.78GFlop/s。然而,基于表3-3列出的STREAM COPY值,该预测性能应再乘以0.38,实际预测性能为675 MFlop/s。随着内层维度的增大,cache已经不能够同时容纳两个甚至一个连续行,代码平衡值第一次上升为Bc = 1.0 W/F,最终为Bc = 1.25 W/F。图3-6 显示了附加各种限制和预测的、不同内层维度的性能对比图(为节省内存,当N较大时(即kmax<图3-6同时也引入一个新的性能指标:更新的区域数目(LUP) /秒。因为它强调“工作完成”而不是MFlop/s,所以更适合stencil算法。在我们的案例分析中,Flop和LUP间有一个简单的1 : 4的对应关系。但在一般情况下,MFlop/s会随着算法优化方法的使用而变化,例如使用不同编译器重新排列代码序列而导致每次更新所要执行的浮点数运算数目不同。然而,用户最感兴趣的是在一定时间内可以完成多少实际工作。LUP/s使得当底层问题相同时,不管采用何种优化方法,所有的性能都具有可比性。例如,许多处理器提供了Fused Multiply-Add(FMA)机器指令执行r = a + b•c操作:一次可执行两次浮点数运算。在这种情况下,因为每次浮点数运算延迟的减少,FMA可大幅提高性能。将代码清单3-1 Jacobi算法代码重写如下:

022d32933ab4af960526cdc57f86afd65cb2a157

这个版本用7次浮点数运算代替了4次浮点数运算;当算法是访存受限时,MLUP/s性能指标并没有发生变化(这留给读者使用平衡分析方法证明),但是MFlop/s却发生了变化。

相关文章
|
3月前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
100 3
|
3月前
|
存储 分布式计算 算法
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
82 0
|
12天前
|
存储 算法 安全
基于哈希表的文件共享平台 C++ 算法实现与分析
在数字化时代,文件共享平台不可或缺。本文探讨哈希表在文件共享中的应用,包括原理、优势及C++实现。哈希表通过键值对快速访问文件元数据(如文件名、大小、位置等),查找时间复杂度为O(1),显著提升查找速度和用户体验。代码示例展示了文件上传和搜索功能,实际应用中需解决哈希冲突、动态扩容和线程安全等问题,以优化性能。
|
21天前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
31 6
|
2月前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
59 1
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
76 1
|
3月前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
3月前
|
存储 算法 搜索推荐
这些算法在实际应用中有哪些具体案例呢
【10月更文挑战第19天】这些算法在实际应用中有哪些具体案例呢
74 1
|
3月前
|
算法
PID算法原理分析
【10月更文挑战第12天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
|
3月前
|
算法
PID算法原理分析及优化
【10月更文挑战第6天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。