其他分享
首页 > 其他分享> > 【心随意动】20-SIST研一秋季上学期课程总结【补】

【心随意动】20-SIST研一秋季上学期课程总结【补】

作者:互联网

呀,自从来到了SIST,每天每夜都要么在写作业,要么就是在去写作业的路上,每天都是它们的deadline呐!好不容易有了一个早上可以睡觉养精神,我也是用来刷手机或发会儿呆。以至于上学期期间完全没有时间写日记或总结,期末结束了也只是想咸鱼瘫(被榨干了)。讲道理,虽然都说信息学院课相对肝一点,但是我同学都应对自如,只有我要死要死。

复盘之后,我发现怪自己同时选了矩阵计算与计算机体系结构。矩阵计算底子太烂了,学得吃力无比,花了70%的时间最终也只是刚好及格;体系结构学的还行,但是Homework、lab、paper reading轰炸以及仅剩下30%的时间与精力,我学的又累又烂。

曾经有一次退课的机会摆在我的面前,我没有珍惜,自大地失去了才追悔莫及...如果再给我一次重来研一上的机会,我一定退课,退的就是你,矩阵计算。( ̄▽ ̄)"

创管学院的课真好,上学期被老师忽悠不让我旁听,害得我选了课又多了一份作业。这学期我一定做个旁听狂魔~

新的学期明天就要开学了,我赶紧吸取教训,同时呢也把上学期瞎写的学期总结发布一下以留纪念( ̄▽ ̄)" (所以下文的“本学期”是发布时间的“上学期”~)

 

0 本学期主要课程

  1. 英语三
  2. C++与数据结构基础
  3. 矩阵计算
  4. 计算机体系结构Ⅱ
  5. 商业模式
  6. 政治(略)

 

1 课程核心内容:

1.1 英语三

课程内容

前半学期主要学习主题是“英语演讲训练”,期中任务是进行一次英语脱稿演讲;(刚开学时同学之间用英语讲话我都要忍不住爆笑哈哈哈哈,虽然好像没什么好笑的( ̄▽ ̄)"

后半学期主要学习主题是“定性分析的英语写作训练”,期末任务是提交一份自定义主题的简短研究报告。(我选的内容是“大重量与多组数对健身效果的影响”hoho

课程感受

这门课很好的提升了我张口说、使用英语的频率与能力虽然依然好不到哪里去)。较之以往对英语书面、阅读能力的锻炼,这门课更侧重于对英语听说方面进行提升,让我非常不足的英语口语能够克服尴尬癌从“不敢说”迈出了一步!(能与外教沟通了,那真是提高了很多hhh)

每学期的英语课都是我休闲的快乐时光,而一下课我就要回图书馆赶作业,oh真是痛苦。老师上的课很有趣很轻松,然鹅线上的EF作业真是期末写到昏厥了。(学期前都在写矩阵和体系结构的作业!!!

1.2 C++与数据结构基础

课程内容

复习了C++的基本语法、面向对象编程(类、继承、多态、抽象);

复习了基本的数据结构内容:线性表(栈、队列)、二叉树与森林、图的遍历(BFS与DFS)、最短路问题(Dijkstra)与最小生成树问题(Prim与Kruskal)、排序算法(插入排序、冒泡排序、归并排序、插入排序)。课程作业以OJ题目(都是很麻烦的模拟题,头都写秃了还写的臭)与期末Project为主。

我的期末Project是分别解决给出起点与不给出起点的迷宫问题,尝试去求解迷宫的最长简单路径最短路径与任意起点的迷宫策略,最终实现是基于MFC进行图形界面的结果展示,并分别采取Q-Learning Table的简化强化学习算法、BFS、DFS方法对问题进行了解决。

课程感受

由于本门课程内容我在本科阶段有了一定的学习经历(本科学过,但是作业依然恶心),因此本学期此门课程主要起到复习的作用,为下学期的课程做了铺垫。(主要是让我回想起了刷OJ的恐惧,对着屏幕找bug找到奔溃T_T

 

1.3 矩阵计算

课程内容

是本科《线性代数》的进阶;课程习题与考试以证明题为核心,强调对基本定理与性质的证明,期间会加入部分对课程内引入的算法进行编程实现的部分

  1. 围绕问题“如何在时间复杂度上对线性方程(Ax=b)求解的计算过程进行优化”,基于核心思想“对矩阵A进行各式各样的分解”来实现计算性能的加速。在此模块中,我学习了以下内容:

LU分解算法:即“高斯消元”过程的模型矩阵化,对A进行等价变形。使得在同A不同b的线性方程求解问题中,某些模块的求解时间复杂度可以从0(n^3)优化至0(n^2).

LUP分解算法:由于实施LU分解算法是有条件的,于是引入进阶改良的LU分解算法,即LUP分解算法,使得任何方形矩阵都存在LUP分解。

③ 当矩阵A符合某些特殊性质时,其计算性能可以在LUP分解的基础上进一步提升,即后续的LDM分解算法、LDL分解算法以及Cholesky分解

2. 为了使“求解最小二乘问题”的性能时间能得到优化,我们学习了梯度下降法、正规方程法、QR分解法来分别进行性能分析,同时在QR分解部分,我们学习了其基础数学概念,如投影矩阵、旋转矩阵、Householder矩阵等

3. 为了使“求解矩阵的特征值与特征向量”的计算性能得到优化,我们学习了一些迭代算法来进行加速求解过程

4. 后续课程内容对非方形矩阵的伪逆、奇异值进行了讲解与性质分析,并基于它们提出了解决最小二乘问题的新的迭代方法。(主要是这里我已经跟不上了,T_T

 

课程感受

以往对矩阵的运算过程与时间复杂度仅有一些了解而没有较深入地关注过,经过一学期的学习,我不禁感慨数学的汪洋大海——这些矩阵计算的各色优化算法都是皮毛而又年迈的方法了。而矩阵,这个抽象的名词,却又与几何空间的投影、旋转、基变换等概念相对应后就变得具体生动了起来,但没有建立其它们之间的联系时学习过程确实非常晦涩,这时刻提醒着我一个优秀新颖的“理解”对学习过程、创新过程都会带来巨大的帮助与增益

(矩阵计算在选课之初我以为是计算为核心的应用类数学课,后来惊觉居然是证明为核心的数学课,加之底子不够好(本科线代60飘过),所以学起来很吃力,花费的时间也是最多,甚至一定地影响了其他课程的学习。加之矩阵计算对我的研究方向增益不大,所以整个学习过程给我带来最大的感悟反而是下学期选课要慎重。)

1.4 计算机体系结构Ⅱ

课程内容

这门课围绕流水线的核心,以本科的计算机组成原理为基础课程,讲述了基于RISC-V架构为的体系结构概念与内容,具体包括如下:

  1. 乱序执行。在引入data dependency与data hazard之后,对in-order issue/out-of-order issue, in-order execution/out-of-order execution与 in-order commit/out-of-order commit分别进行了优劣分析。对于out-of-order execution,课程主要讲述了 Scoreboard算法与Renaming & Re-order buffer的工作方式,Tomasulo算法没有提太多。本章节期间,课程实验部分要求我们熟悉sniper模拟程序以及其指令输出方式,为后续实验做准备。
  2. 分支预测。我们学习了几种分支预测的办法,例如静态分支预测方法有always taken, always not taken, profile-based, program-based, programmer-based; 动态分支预测方法有基于时间相关性与空间相关性两种。对于实施不同的分支预测算法,引入了Branch History Table数据结构,以及辅助提前获取跳转地址的Branch Target Buffer数据结构。本章节期间,课程实验要求基于参考文献完成‘基于Perceptron’的branch predictor, 并自行设计相关test cases 与sniper内的one-bit branch predictor、pentium predictor进行性能对比。

上完课以后,对Branch History Table数据结构以及Branch Target Buffer数据结构的具体工作机制依然感觉很抽象,但经过此实验部分后确实感觉具体了很多,尤其是branch predictor的运行机制。

  1. 超标量与超长指令字。这一章我认为主要终点是VLIW的几种static scheduling的方式,循循渐进,由loop unrolling 到 Software Pipelining, 实现编译器层对指令issue的加速优化。后续,课程也提到了Trace Scheduling 以及 IA-64 Predicted Execution. 前者是实现基于跳转指令间相互关系而实现更高概率的分支预测,后者是通过给每条指令添加伴随寄存器,将control hazard 转变为了 data hazard.
  2. 多线程。在超标量流水线中,为了更好的提高流水线的利用率,我们学习了几种不同的多线程流水线策略。 FGMT,即时间片轮转调度方式; CGMT, 以事件中断来进行线程切换;SMT,即从利用率优先角度出发,将无data dependency指令装载如流水线来实现最高的流水线利用率。
  3. 向量运算与GPU。Vector模块介绍了向量指令的特点(SIMD)以及其工作的基本特。GPU章节介绍了一些其基本的概念与内部工作关系,如Item、Block、SM之间的关系;还有GPU memory organization,对GPU更快的访问global memory 以及 shared memory的方法进行了分别讨论。最后,课程对CUDA的工作流程进行了简单的介绍。
  4. Cache Coherence. 本章主要讲了Snooping-based的Coherence方法与Directory-based的方法。前者重点介绍了MSI与MSEI的运行机制,对期间出现的False Sharing问题进行了分析与探讨;后续也对Directory-based的方法也进行了简单的讲解。在这部分,我们也有一份实验,是在sniper中设计test case完成对False sharing的观察,以及在不同cache coherence(MSI,MESI,MESIF)下、cache policy(inclusive与non-inclusive)的不同结果对比。由于实验部分没有提供答案,故正确的实验结果依然不确定。
  5. Memory Consistency. 本章主要讲了SC模型与TSO模型的特点、优缺点与工作流程,对比weaker model与stronger model之间的利弊。
  6. 内存同步与内存事务。对于内存同步部分,我们学习了RISC-V的Acquire、Release、Fence的作用、异同与对性能的影响。在事务方面,分别对Data versioning policy、Conflict detection policy的各两种处理算法进行了学习。
  7. 最后我们学习了一些Virtual Machine与I/O相关的基础概念内容,这部分内容没有大的模型与算法块,以碎片的概念为主。

课程感受

体系结构Ⅱ的课程让我收获颇多,其中的Out-of-order Execution与不同的Scheduling 方法让我印象深刻,也因为前期没理解好相互之间的关系而梳理了好些时间。而Scheduling的思想贯穿体系结构,其目的就是让流水线的利用率最大化而减少停顿。课程后半部分,让我难忘的是Cache Coherence部分,可能是此章节有对MSI与MESI的实验任务,所以更加熟悉。而不足之处也有,课程的学习缺少对全局知识深层次的融会贯通,因此我课后还是需要进一步的挖掘充电,才能更好的巩固体系结构的认识。

而来自本课程的警示是,由于体系结构的广度与概念含量,下学期选课时更要注意时间分配问题,不然在每门课的作业、实验、文献阅读的冲击下容易翻车,来不及巩固课后知识。

除去矩阵计算导致的精力翻车问题,这门课的homework、lab、paper reading三线轰炸更让我花容失色。再例如,当课程讲到Dynamic scheduling和Static scheduling,之后又讲到In-order issue和Out-of-order issue,我就该不清楚这俩有什么区别。 老师的Slides里都是概念,但是作业又都是从没有训练过的应用体型,不会呀... 于是我找了伯克利、华盛顿大学、斯坦福的课件才慢慢啃懂,感情老师的slides都是国外slides的阉割版,怪不得我总觉得不连贯! 但转而感到泪目,阉割版我都学得这么吃力,太菜了太菜了。之后在课程学习中我再互相借鉴这三所学校的slides,帮助我解决了很多疑惑!

1.5 商业模式

商业模式的老师以简单的图示、幽默风趣的语言与启发性的头脑风暴,给我们讲解了几种典型的商业盈利模式诸如美剧模式、免费模式、信用卡模式、羊毛出在羊身上、羊毛出在猪身上、羊毛出在猪身上牛买单、游戏+、社交+,以及一些典型的金融获利方式等等,拓宽了我的一些知识面以及思考方式。我认识到理解一款商业模式要从角度去认识、去论述,又有哪些常用的拓展方向可以对一款模式进行延拓。

但是商业模式的作业量也并不轻松,作业是提交一些报告与个人分析。于是我收获的额外经验是,本门课程权当课外充电,以专业课为核心进行学习经历的调配,本类课程辅以调节放松并以旁听的形式更能起到最佳的精力安排。

如果对我的商业模式调研报告感兴趣,可以转入这个链接~:

《趣步App——新型商业模式,还是新型传销?》~

《“基于游戏 IP 的娃娃机” 新模式规划-前期商业模式》~

《“基于游戏 IP 的娃娃机” 新模式规划-中后期商业模式》~

 

 

 

好!下个学期,也要好好奋斗加油!( ̄▽ ̄)"

标签:20,矩阵,学期,学习,算法,课程,SIST,order,研一
来源: https://blog.csdn.net/Hide_in_Code/article/details/113924411