查看原文
其他

ASC超算竞赛完整备战指南(ASC18华农队长呕心力作)

ASC超算 2023-08-11

我是周恒,华中农业大学2015级计算机科学与技术专业学生,曾参加ASC17,ASC18 Final(队长),现任华中农业大学信息学院超算俱乐部会长,目前保送至华中科技大学光电国家研究中心。1月21日我将在2019 ASC世界大学生超级计算机竞赛集训营做现场分享,欢迎大家来面基。关于如何备战ASC,整理了一些个人的经验,希望能对大家有所帮助。


其中有一个人是我


·  备  ·  战  ·  经  ·  验  ·


对于大一新生来说,选择哪个方向可能还为时尚早,最重要是打好编程基础,可以通过多刷算法题来提高自己的编程能力。经过一年的编程训练,相信你的编程能力以及突飞猛进,大二上学期对ASC超算竞赛进行入门学习了,可以看看《超算竞赛引导》(科学出版社)的第一篇,里面对超算的一些基本概念和基础知识都有讲解,可能在刚开始看的时候会有许多概念不懂,这些知识可能涉及计算机组成原理、体系结构、操作系统、并行分布式计算等知识,这些不懂的地方可以在网上找到相关的答案,如果还是不懂也没关系,等学习到后面,你就会领悟其中的奥妙。


对于有过参赛经验的老队员来说,自己应该选准方向进行深耕,多参与相关方向的科研项目,提升自己的实战经验,实战经验非常重要。另外,《超算竞赛引导》(科学出版社)的第二篇和第三篇有专门针对ASC超算竞赛的介绍以及往年赛题的题解以及参赛队的经验分享,值得学习和研究。


Part1 超算学习入门


入门之前应该掌握以下基础概念(本入门教程仅供参考,应根据自己的实际情况进行调整):

  • 什么是超算?

  • 什么是并行计算?什么是并行分布式计算?为什么需要并行分布式计算?

  • 什么是线程?什么是进程?


如果你掌握了上面的这些概念,那么恭喜你,可以进行下一步的学习了。接下来可以尝试并行计算方面的学习,注意,这一阶段的重点是并行编程的思想,和你之前刷的ACM算法题有非常大的区别,需要细细体会。首先从最简单的多线程并行开始,也就是OpenMP,这一阶段的目标如下:


  • 什么是OpenMP?有什么作用?

  • 如何使用OpenMP来加速我的代码?在Linux环境下,在Windows环境下如何配置?

  • 我该在哪并行?如何选择并行区域?

  • 什么是数据依赖?什么是数据冲突?如何解决?

  • 什么是原子操作?为什么需要原子操作?

  • 我该选择多少线程来运行呢?线程数量越多越好吗?

  • 我的代码运行正确吗?如何检验优化后代码运行的正确性?

  • 我的代码优化成功了吗?加速比如何计算?

  • OpenMP实战:多线程矩阵乘法,矩阵分块乘法。


OpenMP可以说是并行优化方法中的一种,而MPI可以说是并行分布式计算中不得不提的工具,也是非常重要的工具之一,你可以配合上面所学的OpenMP来学习MPI:


  • 什么是MPI?

  • 进程和线程的区别是什么?

  • 什么是主进程master,什么是从进程slave?

  • 什么是进程间通信?为什么进程间需要通信?如何进行进程间通信?

  • 如何发送数据和接收数据?都有哪些方法?每种方法之间又何不同?

  • 什么是同步?为什么需要同步?

  • 什么是死锁?如何避免死锁?

  • 我该如何编译和运行MPI程序?

  • 为什么我在一个节点上运行这么多进程和我在多个节点上运行这么多进程时间不一样?

  • MPI实战:矩阵乘法,矩阵分块乘法。


掌握了OpenMP和MPI之后,到这里我想大二上学期应该结束了吧,如果上面的内容你都掌握地不错,那么恭喜你,可以开始你的ASC超算竞赛之旅了,跟着老队员尽情享受吧。竞赛开始之前,可以认真阅读《超算竞赛引导》的第二篇和第三篇,里面对ASC超算竞赛赛题进行了解读,后面还有往年决赛队的参赛经验,让你对ASC超算竞赛有一个全面的了解。参加ASC超算竞赛,新手当然是从HPL和HPCG的优化开始入手,并且这道题在书中有详细讲解,此外,萌新也需要将所有赛题都运行一遍,在比赛期间,你应该学会如何使用高性能集群(Linux命令行):


  • 如何远程登录(SSH)?节点之间如何做到无密码访问?

  • 集群是怎样运作的?什么是管理节点?什么是计算节点?

  • 为什么所有节点都能看到同样的目录?什么是共享存储?

  • 了解你的集群。集群拓扑结构是怎样的?配置是什么?使用的是什么网络?

  • 什么是环境变量?有什么作用?

  • 什么是程序入口参数?

  • Linux基本命令。如何上传和下载文件?

  • 为什么我不能用apt-get或yum安装软件?什么是Linux权限?

  • 如何从源码编译?什么是软件依赖?什么是动态链接库?什么是动态链接?什么是静态链接?

  • 什么是编译器?什么是编译工具链?什么是make和cmake?如何编写MakeFile和CMakeList?

  • 编译报错怎么办?

  • 系统自带的软件版本太旧怎么办?

  • 如何提交作业?PBS作业调度系统如何使用?

  • 什么是脚本?掌握Shell脚本的使用。


基本上,能独立将所有赛题都编译运行一遍,Linux的基本使用就掌握了,而上面所讲也仅仅是开胃菜,接下来你应该跟着队内的老队员,学习如何进行程序优化,而在优化之前,当然少不了程序性能分析:


  • IntelParallel Studio XE的使用

  • 如何测试程序性能?什么是热点分析?

  • 程序性能分析报告怎么看?

  • 性能优化策略:

    并行度优化

    内存管理优化

    数据传输优化

    存储器访问优化

    向量化优化

    负载均衡优化

    多线程扩展性优化



Part2 提高篇


高性能计算


大二寒假参加了一次ASC超算竞赛的你,接下来就应该进入提高阶段,去挑战自己。这时候你可以接触多种多样的并行优化工具:OpenMP、OpenACC、CUDA。同时可以加入老师的科研项目,因为只有经过实战才能提高自己的并行优化经验。同时也可以阅读一些与并行优化相关的书籍,最好选择有工程开发项目讲解的书籍,从实际问题出发,学习如何划分任务,如何优化程序。除此之外,高性能计算相关领域的文献资料也是非常值得学习的资料,而且范围也更加广泛,能学到许多书本上没有的知识。


目前深度学习能取得如此多的成果,其中离不开GPU计算的发展,如今GPU计算也有着不错的应用前景,如果能使用GPU成果对应用进行优化,其优化效果不容小觑。NVIDIA也提供了许多加速库(CUDA、cuBlas等),方便开发者使用GPU进行加速。如果想深入学习GPU计算,建议阅读相关书籍,深入了解GPU硬件架构以及编程模型。


深度学习


如果你想尝试深度学习领域,同样可以选择自己喜欢的导师进行相关科研方面的工作,也可以选择参加深度学习方面的竞赛,例如Kaggle、AI Challenger、天池竞赛等。至少熟练使用一个深度学习框架,例如Tensorflow、PyTorch等,熟练使用Python也是必不可少的。除此之外,最重要的能力就是复现论文的能力,深度学习领域的论文数量众多,发展很快,能够快速对论文模型进行复现是你需要掌握的基本能力,这也可以为你以后研究生的学习打下基础。最后一条建议就是多读相关领域的文献,学习他人是如何优化神经网络性能的,他们的切入点是什么?他们提出的方法有何优缺点?他们的方法是否合理?




◆ ◆ ◆  ◆ ◆


2019 ASC世界大学生超级计算机竞赛集训营将于1月21日-22日在北京举行!


长按识别二维码来集训营面基“华农兄弟”


用两天的时间大幅提升你的“超”能力。在集训营你将收获来自高效能服务器和存储技术国家重点实验室、浪潮、Intel、Nvidia、Mellanox等单位的HPC及AI专家现场培训,ASC18优秀参赛队代表经验分享,ASC19竞赛规则详细解析……


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存