| 选课类别:基础 | 教学类型:理论实验课 |
| 课程类别:研究生课程 | 开课单位:计算机科学与技术系 |
| 课程层次:硕士 | 学分:3.5 |
课程目标:“并行程序设计”是计算机专业研究生的专业课程,同时也是《并行计算:结构-算法-编程》精品课程系列中不可或缺的一环。本课程旨在进一步拓展与巩固并行计算的视野和思维,通过强化并行编程实验,夯实科学计算实践所需的基础知识,基本方法与基本技能。
课程任务:
通过本课程的学习,首先,帮助学生理解软硬件之间的互动:底层并行体系结构特征如何影响上层并行程序设计的模型与方法;上层的并行软件和程序设计如何适配并发挥底层硬件特征。其次,帮助学生掌握并行程序设计基本方法,分析描述并行程序性能的关键因素在相关问题实践中是如何表现的。最后,通过在并行计算机上完成若干典型应用的并行编程实现,掌握并行程序的设计、实现、调试和性能优化技术。
课程内容:
郑启龙老师的《并行程序设计》课程主要讲解依赖关系、OpenMP和MPI编程,其中MPI是重点和难点。课程内容覆盖依赖关系与并行化操作,实验主要涉及OpenMP和MPI的应用。许多学生指出上课内容与本科课程有重叠,有时显得冗长而无趣,教学形式主要是对着PPT照本宣科,资料有来自其他课程的痕迹。
期末考试包含依赖关系分析与OpenMP并行化、MPI基础题目等,往年考试题具有参考价值。考试题目量较大,部分学生提到卷面完成度不高也能取得不错成绩。作业包括一次书面作业和若干MPI、OpenMP相关实验,工作量不小,部分题目取自往年考试题,对复习有帮助,但题目质量参差不齐。助教不提供答案,需要同学相互交流。
郑老师表示课程从未挂过人,大部分学生也反映只要认真参与,就能通过并取得满意成绩,但高分较难实现。调查中,绝大多数同学认为给分较为宽松,即使考试或作业未完全完成仍能获得不错的成绩。
MPI和OpenMP的学习有推荐的在线教程,课程主页列出了参考书目。然而,许多人反映课程PPT质量堪忧,自学难度不小。对于基础薄弱或对并行编程有兴趣的同学,需要额外利用外部资源进行学习。
课程不点名,灵活性较高。对于希望水学分的同学来说是不错的选择,但对于希望深入学习并行编程的同学,还需多自学以获得更深刻的理解。老师为人态度和蔼,有时候会安排同学讲解自己的作业,增加互动性。总体来说,课程适合初学者了解并行编程的基础知识。
【课程主页】
http://staff.ustc.edu.cn/~qlzheng/pp11/
【内容】
依赖关系 + 编程课。依赖关系用于拆循环。编程用的是OMP(多线程),MPI(分布式)。MPI是难点和重点。
郑老师人很nice,还带我们参观了位于东区图书馆的并行计算中心。
【资源】
OMP看下这篇文章 https://zhuanlan.zhihu.com/p/61857547
MPI先通过这个tutorial熟悉 https://mpitutorial.com/tutorials/
这个tutorial主要是非数值模拟。数值问题见课上的Cannon算法,以及各种矩阵计算并行问题。
【作业】
布置了两三次作业,大作业是老师出的题+书上的题+结合研究方向的自选题。
【期末】
今年(2019-2020)的并行期末,题量有点大。虽然只有四大题:
一、给了三个循环,分析依赖关系,用OMP并行。30分
二、MPI统计data[1000]能被3整除的数据项的id,要求两种方法。30分
三、给了个矩阵计算的程序,两层循环,大概是B[i,j] = A[i-1, j] + A[i, j+1] + A[i+1, j-1],要求实现行块划分、棋盘划分两种MPI程序。30分
四、Floyd算法,本质还是矩阵划分MPI,难点是怎么计算dij = min{dij, dik+dkj},考虑dik, dkj不会同时被一个进程拿到。10分
综上,矩阵运算MPI实现考了3题,虽然只占40分,多刷刷这类题,简单矩阵乘行块划分、棋盘划分Cannon算法、Floyd MPI实现等。
【相关课程】
陈国良老师的四本并行书中的《并行算法实践》,研一下还有一门课“并行算法”,对应《并行算法的设计与分析》。
非常适合水学分的课
作业一次,量有点大,只涉及一份PPT内容,一天能写完
大作业114514年没变过,难度低,要写的代码很少,主要是分析加速比
期末只需要复习三份PPT(并行矩阵乘法最好也看看),其中两份分别是mpi和openmp,算是比较基础的并行编程方法,学了没坏处
期末考试题目可参考评课社区往年试卷,差不多的
从来没去过,不知道点不点名
给分不清楚,听说从不挂人。个人正常完成实验,复习一天,看了往年卷,总评90左右
12月左右老师会抽人上去讲作业和实验,好像可以不去,去了有加分
zql教的东西虽然很神秘,但人还是挺好的
课程内容其实也都不是什么新鲜玩意儿了,主要就是依赖关系,依赖关系在组成原理/体系结构中就已经接触过了,无非是粒度之间的差别。也就依赖关系要费点心思,依赖关系学好后剩下的东西水到渠成。
依赖关系是编写并行代码的基础,omp没什么东西的,当分析清楚依赖关系之后,在现成的串行代码上稍微改改就可以了。
MPI编程确实很麻烦,代码得大改,但作为一个通讯协议,熟悉好API,写点代码练练手就能掌握。考试也是MPI考的多,今年考试一半的分数给了分析依赖关系,剩下的一半里有一大半给了MPI,omp只占很少一部分。MPI好好学用处还是很大的,至于omp么,不如去学个cuda编程了。在这里强烈推荐一下微电子学院的GPU并行计算,挺有用的。
老师第一次上课就说过这门课从来没让学生挂过,在考场里也说不用担心分数。
如果有需要的话,无脑选,给分超级无敌好。老师很温柔~
说实话课程不太容易,作业也比较多。
但这课还是比较推荐的,据老师说这个课开课以来没人挂过科。就个人而言,考试有半面都空着没写,最后总评近80,实属水学分利器。