我在论坛上偶然了解到张斌老师的编程课堂。学习的主要内容是用C++复现课程论文里的相关算例。通过半个月的编程练习,我从无到有的掌握了如何开发C++程序,如何消化吸收一个已有程序,当程序出现问题时候如何排查和解决。通过低阶格式到高阶格式,一维到二维程序的编写,打好了编写程序的基础。
在学习过程中发挥核心作用的就是每天晚上的答疑会议,在会议上学习到的编程观念和学习方法让我受益匪浅并沿用至今,以后的学习思路也在相关的方法辅助下变得清晰。经过一段短时间的训练,我的编程能力有了较大提高,同时也变的敢于写程序和看程序。在完成基础学习之后,经过交流,我决定学习并行计算方向。
在首先对组内教学程序进行学习后,我完成的第一个项目是把Fortran的一个求解器移植成C++程序。在程序的书写过程中,我学会了如何简单快速没有笔误的移植程序,精准定位代码的错误,如何高效的和同学们交流并解决问题,以及遇到程序性能瓶颈应该如何优化。这为我后续学习提供了更实际的经验。
我完成的第二个任务是把一个化学反应的八叉树负载平衡自适应网格Python生成程序并行化,并移植在超算上。对空间内分布不均匀的化学反应,结构化网格若想实现负载平衡,八叉树是一个好的管理方式,这项工作本身有较大并行价值。在完成这项任务时候,我获得的经验是对复杂的代码,一定要在结果不变的前提下简化成自己适应的形式,在提炼出计算量的实质之后,再进行对已有并行手段的调研,综合实现难度和效果选择一个最佳选择方案。最后成功实现符合Python CPU并行预期的加速效果。
我完成的第三个任务是基于zoltan和Metis实现自研软件网格部分的分割染色工作。大规模并行问题中,为了解决访存开销等性能瓶颈需要引入共享内存机制,但是共享内存会造成数据竞争,导致计算结果出问题,并且难以排查和修复。科学计算往往以网格为物理背景,对网格进行分类,使得有竞争关系(相邻)的网格不同时更新,是大规模并行的必由之路,Zoltan提供了有效的网格划分和染色工具,但需要方便的接口实现对实际大规模网格的应用。
在张老师团队的短短几个月,我从对并行计算一无所知到初窥门径,到能实际的产生具体效益。离不开张老师的指导和团队学长们的细致辅导,良师益友的全面帮助让我的编程能力有了极大提升,未来我将继续在张老师团队学习科研,为将来在并行计算领域读博奠定基础。
张斌,上海交通大学航空航天学院研究员,从事飞行器设计。拥有15年(2008-至今)传授本科生如何掌握科研编程技能,组织了一个约20人的编程教学研发团队(博士、硕士、本科),主开发了一套适合零基础学生掌握编程能力的教学方法;拥有大量科研项目中积累的实际编程教学案例。
张 斌 研究员 博导
1、学习目标
(1)提供源代码、教学视频和教学资料
(2)Code1:C++ 编写1维标量方程(逆向编程)
(3) Code2:C++ 编写2维标量方程(逆向编程)
(4)Code3:C++编写1维标量方程+UNO 格式+源项(正向编程)
(5)Code4:C++编写2维标量方程+UNO 格式+源项(正向编程)
(6)Code5:C++ 编写2维标量方程+WENO 格式+龙格库塔格式(正向编程)
(7) Code6-10 Fortran把 Code1-5 重写一遍
(8)Code11-15 Python 把 Code1-5 重写一遍
(1)零基础学员具备完成学科类大作业能力
(2)本科毕业设计能力
(1)通过实际问题强化学员的综合编程技能
(2)培养学员团队合作精神和高效沟通能力
格式组:反演 2 维 Euler 方程,编写增加源项程序。
燃烧组:反演氢燃料零维点火程序,编写乙烯燃烧程序。
并行组:反演 2 维标量并行程序,编写 3 维标量并行程序。
优化组:反演 Fortran 遗传算法程序,编写Python遗传算法程序。
图像组:反演圆孔图像特征识别程序,编写圆孔分类识别程序。
建模组:反演蒙特卡洛采样建模程序,编写自适应采样建模程序。
导弹组:反演 3 自由度导弹飞行轨迹程序,复现论文结果。
界面组:反演商飞任务 1 界面,编写商飞任务 2 界面。
烧蚀组:反演 1 维烧蚀传热程序,复现论文结果。
稀薄组:反应 0 维 DSMC 程序,复现论文结果。
注:(1)实际练习的程序会持续更新,且会大于10个。
5、预期效果
用前沿的工程问题或科学问题培养学生创新精神
(1)进入到导师研究生小组,和博士生硕士生一起参与科研项目
(2)每周组会需按照研究生标准介绍科研进展
(6)学员可获得深造和就业相关信息,非常出色的学员可获得推荐出国或读研的机会。
注2:不太适合已经工作的工程师,因为需要投入足够多且连续的时间。
(四)报名咨询和试看
(五)真实案例(持续更新中)
仿真秀读者福利