[{"data":1,"prerenderedAt":27401},["ShallowReactive",2],{"series:index":3,"content:\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl10-11-parallelism":972,"surround:\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl10-11-parallelism":27398},[4,15,25,35,45,54,64,74,82,91,101,110,120,129,138,147,152,162,172,181,189,194,203,213,223,233,243,253,263,273,283,293,303,313,323,333,339,348,357,366,372,381,391,401,410,420,429,439,448,457,467,476,485,494,504,513,522,531,540,549,559,569,578,587,596,605,610,620,629,638,644,649,658,666,674,679,687,692,700,708,716,724,732,740,749,758,766,774,779,787,796,805,814,823,831,836,845,850,855,863,871,879,887,895,900,905,914,923,931,939,947,955,963],{"stem":5,"path":6,"title":7,"date":8,"collapsed":9,"readingTime":10},"posts\u002F2024\u002FXZZD-Aquire-Score","\u002F2024\u002F10\u002F23\u002FXZZD-Aquire-Score","XZZD_Aquire_Score","2024-10-23 15:08:30",false,{"text":11,"minutes":12,"time":13,"words":14},"3 min read",2.955,177300,591,{"stem":16,"path":17,"title":18,"date":19,"collapsed":9,"readingTime":20},"posts\u002F2024\u002Felec-design-contest-2024","\u002F2024\u002F07\u002F07\u002Felec-design-contest-2024","东四——隐秘的角落","2024-07-07 11:44:32",{"text":21,"minutes":22,"time":23,"words":24},"2 min read",1.74,104400,348,{"stem":26,"path":27,"title":28,"date":29,"collapsed":9,"readingTime":30},"posts\u002F2024\u002Fmechanics","\u002F2024\u002F07\u002F08\u002Fmechanics","about力学","2024-07-08 14:14:07",{"text":31,"minutes":32,"time":33,"words":34},"9 min read",8.54,512400,1708,{"stem":36,"path":37,"title":38,"date":39,"collapsed":9,"readingTime":40},"posts\u002F2025\u002F25GElecDesignContest","\u002F2025\u002F08\u002F26\u002F25GElecDesignContest","纪念最好的大二五组 - Soleil 的 电赛回忆录","2025-08-26 11:06:33",{"text":41,"minutes":42,"time":43,"words":44},"30 min read",29.99,1799400,5998,{"stem":46,"path":47,"title":48,"date":49,"collapsed":9,"readingTime":50},"posts\u002F2025\u002FEngineering-Innovation","\u002F2025\u002F01\u002F20\u002FEngineering-Innovation","工程实践与创新能力大赛","2025-01-20 22:20:59",{"text":21,"minutes":51,"time":52,"words":53},1.365,81900,273,{"stem":55,"path":56,"title":57,"date":58,"collapsed":9,"readingTime":59},"posts\u002F2025\u002FTOP","\u002F2025\u002F01\u002F20\u002FTOP","置顶","3025-01-20 21:53:36",{"text":60,"minutes":61,"time":62,"words":63},"1 min read",0.285,17100,57,{"stem":65,"path":66,"title":67,"date":68,"collapsed":9,"readingTime":69},"posts\u002FUGCourses\u002F1.freshman-spring\u002Fengineering-drawing-notes","\u002F2024\u002F06\u002F30\u002Fengineering-drawing-notes","工程图学期末复习","2024-06-30 21:02:09",{"text":70,"minutes":71,"time":72,"words":73},"15 min read",14.78,886800,2956,{"stem":75,"path":76,"title":77,"date":78,"collapsed":9,"readingTime":79},"posts\u002FUGCourses\u002F1.freshman-spring\u002Findex","\u002Fugcourses\u002Ffreshman-spring","大一春夏","2024-06-30 19:15:28",{"text":80,"minutes":81,"time":81,"words":81},"0 min read",0,{"stem":83,"path":84,"title":85,"date":86,"collapsed":9,"readingTime":87},"posts\u002FUGCourses\u002F2.sophomore-autumn\u002FComplex-Analysis","\u002F2025\u002F01\u002F21\u002FComplex-Analysis","复变函数与积分变换","2025-01-21 13:23:59",{"text":11,"minutes":88,"time":89,"words":90},2.855,171300,571,{"stem":92,"path":93,"title":94,"date":95,"collapsed":9,"readingTime":96},"posts\u002FUGCourses\u002F2.sophomore-autumn\u002FFundamentalsMarxism","\u002F2025\u002F06\u002F06\u002FFundamentalsMarxism","马克思主义基本原理","2025-06-06 00:22:45",{"text":97,"minutes":98,"time":99,"words":100},"6 min read",5.54,332400,1108,{"stem":102,"path":103,"title":104,"date":105,"collapsed":9,"readingTime":106},"posts\u002FUGCourses\u002F2.sophomore-autumn\u002FMathematical-Modeling","\u002F2024\u002F09\u002F22\u002FMathematical-Modeling","数学建模（课程）","2024-09-22 19:07:42",{"text":11,"minutes":107,"time":108,"words":109},2.475,148500,495,{"stem":111,"path":112,"title":113,"date":114,"collapsed":9,"readingTime":115},"posts\u002FUGCourses\u002F2.sophomore-autumn\u002FMicroelectronic-Circuits","\u002F2025\u002F01\u002F20\u002FMicroelectronic-Circuits","电基小子","2025-01-20 23:02:49",{"text":116,"minutes":117,"time":118,"words":119},"5 min read",4.225,253500,845,{"stem":121,"path":122,"title":123,"date":124,"collapsed":9,"readingTime":125},"posts\u002FUGCourses\u002F2.sophomore-autumn\u002FMumerical-Analysis","\u002F2024\u002F09\u002F19\u002FMumerical-Analysis","数值分析方法","2024-09-19 17:12:56",{"text":11,"minutes":126,"time":127,"words":128},2.1,126000,420,{"stem":130,"path":131,"title":132,"date":133,"collapsed":9,"readingTime":134},"posts\u002FUGCourses\u002F2.sophomore-autumn\u002FProbability-Theory","\u002F2025\u002F01\u002F21\u002FProbability-Theory","概率论与数理统计","2025-01-21 12:52:11",{"text":11,"minutes":135,"time":136,"words":137},2.205,132300,441,{"stem":139,"path":140,"title":141,"date":142,"collapsed":9,"readingTime":143},"posts\u002FUGCourses\u002F2.sophomore-autumn\u002Fengineering-training","\u002F2024\u002F09\u002F17\u002Fengineering-training","工程训练","2024-09-17 21:40:26",{"text":11,"minutes":144,"time":145,"words":146},2.385,143100,477,{"stem":148,"path":149,"title":150,"date":78,"collapsed":9,"readingTime":151},"posts\u002FUGCourses\u002F2.sophomore-autumn\u002Findex","\u002Fugcourses\u002Fsophomore-autumn","大二秋冬",{"text":80,"minutes":81,"time":81,"words":81},{"stem":153,"path":154,"title":155,"date":156,"collapsed":9,"readingTime":157},"posts\u002FUGCourses\u002F2.sophomore-autumn\u002Fsolid-state-physics","\u002F2024\u002F09\u002F11\u002Fsolid-state-physics","固体物理基础","2024-09-11 19:15:26",{"text":158,"minutes":159,"time":160,"words":161},"4 min read",3.21,192600,642,{"stem":163,"path":164,"title":165,"date":166,"collapsed":9,"readingTime":167},"posts\u002FUGCourses\u002F3.sophomore-spring\u002FAIFrontier","\u002Fugcourses\u002Fsophomore-spring\u002Faifrontier","人工智能前沿","2025-06-12 14:58:16",{"text":168,"minutes":169,"time":170,"words":171},"25 min read",24.02,1441200,4804,{"stem":173,"path":174,"title":175,"date":166,"collapsed":9,"readingTime":176},"posts\u002FUGCourses\u002F3.sophomore-spring\u002FDigitalSys","\u002Fugcourses\u002Fsophomore-spring\u002Fdigitalsys","数字系统设计",{"text":177,"minutes":178,"time":179,"words":180},"45 min read",44.87,2692200,8974,{"stem":182,"path":183,"title":184,"date":166,"collapsed":9,"readingTime":185},"posts\u002FUGCourses\u002F3.sophomore-spring\u002FMaoTheory","\u002F2025\u002F06\u002F12\u002FMaoTheory","毛概",{"text":70,"minutes":186,"time":187,"words":188},14.63,877800,2926,{"stem":190,"path":191,"title":192,"date":78,"collapsed":9,"readingTime":193},"posts\u002FUGCourses\u002F3.sophomore-spring\u002Findex","\u002Fugcourses\u002Fsophomore-spring","大二春夏",{"text":80,"minutes":81,"time":81,"words":81},{"stem":195,"path":196,"title":197,"date":198,"collapsed":9,"readingTime":199},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FLecture1","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Flecture1","Lecture 1：摩尔定律与 CMOS","2026-09-09 19:39:00",{"text":60,"minutes":200,"time":201,"words":202},0.535,32100,107,{"stem":204,"path":205,"title":206,"date":207,"collapsed":9,"readingTime":208},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FLecture10","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Flecture10","Lecture 10：从 MOS 电容到 MOSFET","2026-09-10 00:10:00",{"text":209,"minutes":210,"time":211,"words":212},"18 min read",17.615,1056900,3523,{"stem":214,"path":215,"title":216,"date":217,"collapsed":9,"readingTime":218},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FLecture11","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Flecture11","Lecture 11：亚阈值效应与 MOSFET 尺寸缩放","2026-09-10 00:20:00",{"text":219,"minutes":220,"time":221,"words":222},"23 min read",22.35,1341000,4470,{"stem":224,"path":225,"title":226,"date":227,"collapsed":9,"readingTime":228},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FLecture12","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Flecture12","Lecture 12：MOSFET 尺寸缩微","2026-09-10 00:30:00",{"text":229,"minutes":230,"time":231,"words":232},"35 min read",34.225,2053500,6845,{"stem":234,"path":235,"title":236,"date":237,"collapsed":9,"readingTime":238},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FLecture13","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Flecture13","Lecture 13：MOS 新范式","2026-09-10 00:40:00",{"text":239,"minutes":240,"time":241,"words":242},"24 min read",23.25,1395000,4650,{"stem":244,"path":245,"title":246,"date":247,"collapsed":9,"readingTime":248},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FLecture2","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Flecture2","Lecture 2：半导体基础","2026-09-09 19:39:31",{"text":249,"minutes":250,"time":251,"words":252},"7 min read",6.02,361200,1204,{"stem":254,"path":255,"title":256,"date":257,"collapsed":9,"readingTime":258},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FLecture3","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Flecture3","Lecture 3：费米能级、载流子散射与迁移率","2026-09-09 21:00:00",{"text":259,"minutes":260,"time":261,"words":262},"13 min read",12.565,753900,2513,{"stem":264,"path":265,"title":266,"date":267,"collapsed":9,"readingTime":268},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FLecture4","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Flecture4","Lecture 4：漂移电流、扩散电流与产生复合","2026-09-09 23:00:00",{"text":269,"minutes":270,"time":271,"words":272},"10 min read",9.22,553200,1844,{"stem":274,"path":275,"title":276,"date":277,"collapsed":9,"readingTime":278},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FLecture5","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Flecture5","Lecture 5：PN 结与耗尽区","2026-09-09 23:10:00",{"text":279,"minutes":280,"time":281,"words":282},"14 min read",13.515,810900,2703,{"stem":284,"path":285,"title":286,"date":287,"collapsed":9,"readingTime":288},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FLecture6","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Flecture6","Lecture 6：正向偏置 PN 结与理想二极管方程","2026-09-09 23:20:00",{"text":289,"minutes":290,"time":291,"words":292},"20 min read",19.095,1145700,3819,{"stem":294,"path":295,"title":296,"date":297,"collapsed":9,"readingTime":298},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FLecture7","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Flecture7","Lecture 7：金半接触","2026-09-09 23:40:00",{"text":299,"minutes":300,"time":301,"words":302},"16 min read",15.195,911700,3039,{"stem":304,"path":305,"title":306,"date":307,"collapsed":9,"readingTime":308},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FLecture8","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Flecture8","Lecture 8：PN 结在光电领域的应用","2026-09-09 23:50:00",{"text":309,"minutes":310,"time":311,"words":312},"54 min read",53.955,3237300,10791,{"stem":314,"path":315,"title":316,"date":317,"collapsed":9,"readingTime":318},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FLecture9","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Flecture9","Lecture 9：MOS 电容","2026-09-10 00:00:00",{"text":319,"minutes":320,"time":321,"words":322},"21 min read",20.355,1221300,4071,{"stem":324,"path":325,"title":326,"date":327,"collapsed":9,"readingTime":328},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FMidtermExam","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Fmidtermexam","期中复习题","2026-09-09 23:30:00",{"text":329,"minutes":330,"time":331,"words":332},"8 min read",7.595,455700,1519,{"stem":334,"path":335,"title":336,"date":337,"collapsed":9,"readingTime":338},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FMockExam","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Fmockexam","押题密卷","2026-09-10 00:50:00",{"text":21,"minutes":51,"time":52,"words":53},{"stem":340,"path":341,"title":342,"date":198,"collapsed":343,"readingTime":344},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002Findex","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices","微电子器件",true,{"text":158,"minutes":345,"time":346,"words":347},3.055,183300,611,{"stem":349,"path":350,"title":351,"date":352,"collapsed":9,"readingTime":353},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F1.HistoryMetaCharacters","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fhistorymetacharacters","History & Meta Characters","2026-09-10 20:25:44",{"text":269,"minutes":354,"time":355,"words":356},9.36,561600,1872,{"stem":358,"path":359,"title":360,"date":361,"collapsed":9,"readingTime":362},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F10.PastExams\u002F1.ExamAutumn2223","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fpastexams\u002Fexamautumn2223","22-23 秋冬历年卷","2026-09-10 20:26:49",{"text":319,"minutes":363,"time":364,"words":365},20.295,1217700,4059,{"stem":367,"path":368,"title":369,"date":370,"collapsed":9,"readingTime":371},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F10.PastExams\u002F2.Exam2021","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fpastexams\u002Fexam2021","20-21 历年卷","2026-09-10 20:26:50",{"text":289,"minutes":290,"time":291,"words":292},{"stem":373,"path":374,"title":375,"date":376,"collapsed":9,"readingTime":377},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F10.PastExams\u002F3.ExamRecall1","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fpastexams\u002Fexamrecall1","不知名回忆卷 1","2026-09-10 20:26:51",{"text":116,"minutes":378,"time":379,"words":380},4.215,252900,843,{"stem":382,"path":383,"title":384,"date":385,"collapsed":9,"readingTime":386},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F10.PastExams\u002F4.ExamRecall23","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fpastexams\u002Fexamrecall23","不知名回忆卷 2\u002F3","2026-09-10 20:26:52",{"text":387,"minutes":388,"time":389,"words":390},"12 min read",11.235,674100,2247,{"stem":392,"path":393,"title":394,"date":395,"collapsed":9,"readingTime":396},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F11.Detailed\u002F1.Chapter1-Introduction","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fdetailed\u002Fchapter1-introduction","Chapter 1：Introduction","2026-09-10 20:27:26",{"text":397,"minutes":398,"time":399,"words":400},"19 min read",18.435,1106100,3687,{"stem":402,"path":403,"title":404,"date":405,"collapsed":9,"readingTime":406},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F11.Detailed\u002F2.Chapter2-IntroductionToUnix","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fdetailed\u002Fchapter2-introductiontounix","Chapter 2：Introduction to Unix","2026-09-10 20:27:40",{"text":168,"minutes":407,"time":408,"words":409},24.895,1493700,4979,{"stem":411,"path":412,"title":413,"date":414,"collapsed":9,"readingTime":415},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F11.Detailed\u002F3.Chapter3-ViAndShell","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fdetailed\u002Fchapter3-viandshell","Chapter 3：Vi and Shell","2026-09-10 20:27:41",{"text":416,"minutes":417,"time":418,"words":419},"32 min read",31.035,1862100,6207,{"stem":421,"path":422,"title":423,"date":424,"collapsed":9,"readingTime":425},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F11.Detailed\u002F4.Chapter4-Network","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fdetailed\u002Fchapter4-network","Chapter 4：Network","2026-09-10 20:27:49",{"text":239,"minutes":426,"time":427,"words":428},23.975,1438500,4795,{"stem":430,"path":431,"title":432,"date":433,"collapsed":9,"readingTime":434},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F11.Detailed\u002F5.Chapter5-Administration","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fdetailed\u002Fchapter5-administration","Chapter 5：Administration","2026-09-10 20:27:51",{"text":435,"minutes":436,"time":437,"words":438},"36 min read",35.41,2124600,7082,{"stem":440,"path":441,"title":442,"date":443,"collapsed":9,"readingTime":444},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F11.Detailed\u002F6.Chapter6-Xwindow","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fdetailed\u002Fchapter6-xwindow","Chapter 6：Xwindow","2026-09-10 20:27:53",{"text":319,"minutes":445,"time":446,"words":447},20.235,1214100,4047,{"stem":449,"path":450,"title":451,"date":452,"collapsed":9,"readingTime":453},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F11.Detailed\u002F7.Chapter7-SoftwareDevelopmentTools","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fdetailed\u002Fchapter7-softwaredevelopmenttools","Chapter 7：Software Development Tools","2026-09-10 20:27:54",{"text":209,"minutes":454,"time":455,"words":456},17.85,1071000,3570,{"stem":458,"path":459,"title":460,"date":461,"collapsed":9,"readingTime":462},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F11.Detailed\u002F8.Chapter8-CProgrammingInUnix","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fdetailed\u002Fchapter8-cprogramminginunix","Chapter 8：C Programming in Unix","2026-09-10 20:27:57",{"text":463,"minutes":464,"time":465,"words":466},"17 min read",16.855,1011300,3371,{"stem":468,"path":469,"title":470,"date":471,"collapsed":9,"readingTime":472},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F2.LinuxUnix","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Flinuxunix","Linux & Unix","2026-09-10 20:25:46",{"text":41,"minutes":473,"time":474,"words":475},29.33,1759800,5866,{"stem":477,"path":478,"title":479,"date":480,"collapsed":9,"readingTime":481},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F3.Vi","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fvi","Vi","2026-09-10 20:25:47",{"text":329,"minutes":482,"time":483,"words":484},7.95,477000,1590,{"stem":486,"path":487,"title":488,"date":489,"collapsed":9,"readingTime":490},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F4.ViCopy","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fvicopy","Vi（详细版）","2026-09-10 20:25:49",{"text":279,"minutes":491,"time":492,"words":493},13.785,827100,2757,{"stem":495,"path":496,"title":497,"date":498,"collapsed":9,"readingTime":499},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F5.Shells","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fshells","Shells","2026-09-10 20:25:51",{"text":500,"minutes":501,"time":502,"words":503},"22 min read",21.21,1272600,4242,{"stem":505,"path":506,"title":507,"date":508,"collapsed":9,"readingTime":509},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F6.Network","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fnetwork","Network","2026-09-10 20:25:54",{"text":319,"minutes":510,"time":511,"words":512},20.595,1235700,4119,{"stem":514,"path":515,"title":516,"date":517,"collapsed":9,"readingTime":518},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F7.SystemAdministration","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fsystemadministration","System Administration","2026-09-10 20:26:44",{"text":329,"minutes":519,"time":520,"words":521},7.12,427200,1424,{"stem":523,"path":524,"title":525,"date":526,"collapsed":9,"readingTime":527},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F8.XWindow","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fxwindow","XWindow","2026-09-10 20:26:45",{"text":97,"minutes":528,"time":529,"words":530},5.105,306300,1021,{"stem":532,"path":533,"title":534,"date":535,"collapsed":9,"readingTime":536},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F9.SystemDevelopmentTools","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fsystemdevelopmenttools","System Development Tools","2026-09-10 20:26:47",{"text":387,"minutes":537,"time":538,"words":539},11.35,681000,2270,{"stem":541,"path":542,"title":543,"date":544,"collapsed":343,"readingTime":545},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002Findex","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad","面向 ICCAD 的软件基础技术","2026-09-10 12:37:00",{"text":60,"minutes":546,"time":547,"words":548},0.185,11100,37,{"stem":550,"path":551,"title":552,"date":553,"collapsed":9,"readingTime":554},"posts\u002FUGCourses\u002F4.junior-autumn\u002F3.HDL\u002FFeiQilai1","\u002Fugcourses\u002Fjunior-autumn\u002Fhdl\u002Ffeiqilai1","飞起来1.0","2026-09-10 12:51:49",{"text":555,"minutes":556,"time":557,"words":558},"105 min read",104.655,6279300,20931,{"stem":560,"path":561,"title":562,"date":563,"collapsed":9,"readingTime":564},"posts\u002FUGCourses\u002F4.junior-autumn\u002F3.HDL\u002FFeiQilai2","\u002Fugcourses\u002Fjunior-autumn\u002Fhdl\u002Ffeiqilai2","飞起来2.0","2026-09-10 12:52:06",{"text":565,"minutes":566,"time":567,"words":568},"29 min read",28.755,1725300,5751,{"stem":570,"path":571,"title":572,"date":573,"collapsed":9,"readingTime":574},"posts\u002FUGCourses\u002F4.junior-autumn\u002F3.HDL\u002FFeiQilai3","\u002Fugcourses\u002Fjunior-autumn\u002Fhdl\u002Ffeiqilai3","飞起来3.0","2026-09-10 12:52:12",{"text":116,"minutes":575,"time":576,"words":577},4.49,269400,898,{"stem":579,"path":580,"title":581,"date":582,"collapsed":9,"readingTime":583},"posts\u002FUGCourses\u002F4.junior-autumn\u002F3.HDL\u002FLecture13","\u002Fugcourses\u002Fjunior-autumn\u002Fhdl\u002Flecture13","Lecture 13：浮点数标准","2026-09-10 12:51:27",{"text":11,"minutes":584,"time":585,"words":586},2.575,154500,515,{"stem":588,"path":589,"title":590,"date":591,"collapsed":9,"readingTime":592},"posts\u002FUGCourses\u002F4.junior-autumn\u002F3.HDL\u002FLecture6","\u002Fugcourses\u002Fjunior-autumn\u002Fhdl\u002Flecture6","Lecture 6：Behavioral Modeling，非阻塞赋值","2026-09-10 12:51:12",{"text":97,"minutes":593,"time":594,"words":595},5.34,320400,1068,{"stem":597,"path":598,"title":599,"date":600,"collapsed":9,"readingTime":601},"posts\u002FUGCourses\u002F4.junior-autumn\u002F3.HDL\u002FPPTCorrespondence","\u002Fugcourses\u002Fjunior-autumn\u002Fhdl\u002Fpptcorrespondence","与PPT的对应","2026-09-10 12:52:18",{"text":269,"minutes":602,"time":603,"words":604},9.275,556500,1855,{"stem":606,"path":607,"title":608,"date":544,"collapsed":343,"readingTime":609},"posts\u002FUGCourses\u002F4.junior-autumn\u002F3.HDL\u002Findex","\u002Fugcourses\u002Fjunior-autumn\u002Fhdl","硬件描述语言原理与应用",{"text":60,"minutes":61,"time":62,"words":63},{"stem":611,"path":612,"title":613,"date":614,"collapsed":9,"readingTime":615},"posts\u002FUGCourses\u002F4.junior-autumn\u002F4.analogICDesign\u002F1.BeforeMidterm","\u002Fugcourses\u002Fjunior-autumn\u002Fanalogicdesign\u002Fbeforemidterm","期中前","2026-09-10 20:28:52",{"text":616,"minutes":617,"time":618,"words":619},"11 min read",10.835,650100,2167,{"stem":621,"path":622,"title":623,"date":624,"collapsed":9,"readingTime":625},"posts\u002FUGCourses\u002F4.junior-autumn\u002F4.analogICDesign\u002F2.MidtermExam2425","\u002Fugcourses\u002Fjunior-autumn\u002Fanalogicdesign\u002Fmidtermexam2425","24-25 期中","2026-09-10 20:29:00",{"text":21,"minutes":626,"time":627,"words":628},1.22,73200,244,{"stem":630,"path":631,"title":632,"date":633,"collapsed":9,"readingTime":634},"posts\u002FUGCourses\u002F4.junior-autumn\u002F4.analogICDesign\u002F3.FinalExamReview","\u002Fugcourses\u002Fjunior-autumn\u002Fanalogicdesign\u002Ffinalexamreview","期末考试整理","2026-09-10 20:29:09",{"text":387,"minutes":635,"time":636,"words":637},11.36,681600,2272,{"stem":639,"path":640,"title":641,"date":642,"collapsed":343,"readingTime":643},"posts\u002FUGCourses\u002F4.junior-autumn\u002F4.analogICDesign\u002Findex","\u002Fugcourses\u002Fjunior-autumn\u002Fanalogicdesign","模拟集成电路设计","2026-09-10 20:00:00",{"text":80,"minutes":81,"time":81,"words":81},{"stem":645,"path":646,"title":647,"date":78,"collapsed":9,"readingTime":648},"posts\u002FUGCourses\u002F4.junior-autumn\u002Findex","\u002Fugcourses\u002Fjunior-autumn","大三秋冬",{"text":80,"minutes":81,"time":81,"words":81},{"stem":650,"path":651,"title":652,"date":653,"collapsed":9,"readingTime":654},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F1.Chapter3-Device","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fchapter3-device","Chapter 3：器件 Device","2026-09-10 21:14:41",{"text":249,"minutes":655,"time":656,"words":657},6.055,363300,1211,{"stem":659,"path":660,"title":661,"date":653,"collapsed":9,"readingTime":662},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F10.Chapter12-Arithmetic","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fchapter12-arithmetic","Chapter 12：算术运算电路 Arithmetic",{"text":168,"minutes":663,"time":664,"words":665},24.245,1454700,4849,{"stem":667,"path":668,"title":669,"date":653,"collapsed":9,"readingTime":670},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F11.Chapter13-Memory","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fchapter13-memory","Chapter 13：存储器 Memory",{"text":229,"minutes":671,"time":672,"words":673},34.235,2054100,6847,{"stem":675,"path":676,"title":677,"date":653,"collapsed":9,"readingTime":678},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F12.Chapter14","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fchapter14","Chapter 14",{"text":80,"minutes":81,"time":81,"words":81},{"stem":680,"path":681,"title":682,"date":653,"collapsed":9,"readingTime":683},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F13.PastExams\u002F1.Midterm2022","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fpastexams\u002Fmidterm2022","2022 期中试题",{"text":60,"minutes":684,"time":685,"words":686},0.075,4500,15,{"stem":688,"path":689,"title":690,"date":653,"collapsed":9,"readingTime":691},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F13.PastExams\u002F2.Midterm2023","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fpastexams\u002Fmidterm2023","2023 期中试题",{"text":80,"minutes":81,"time":81,"words":81},{"stem":693,"path":694,"title":695,"date":653,"collapsed":9,"readingTime":696},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F13.PastExams\u002F3.FinalPolished","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fpastexams\u002Ffinalpolished","期末历年卷（AI 润色版）",{"text":21,"minutes":697,"time":698,"words":699},1.575,94500,315,{"stem":701,"path":702,"title":703,"date":653,"collapsed":9,"readingTime":704},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F14.ExamRecall2026","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fexamrecall2026","数字集成电路回忆 2026",{"text":60,"minutes":705,"time":706,"words":707},0.49,29400,98,{"stem":709,"path":710,"title":711,"date":653,"collapsed":9,"readingTime":712},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F2.Chapter4-Wire","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fchapter4-wire","Chapter 4：导线 Wire",{"text":397,"minutes":713,"time":714,"words":715},18.65,1119000,3730,{"stem":717,"path":718,"title":719,"date":653,"collapsed":9,"readingTime":720},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F3.Chapter5-Inverter","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fchapter5-inverter","Chapter 5：CMOS 反相器 Inverter",{"text":269,"minutes":721,"time":722,"words":723},9.385,563100,1877,{"stem":725,"path":726,"title":727,"date":653,"collapsed":9,"readingTime":728},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F4.Chapter6-LogicGate","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fchapter6-logicgate","Chapter 6：逻辑门 Logic Gate",{"text":31,"minutes":729,"time":730,"words":731},8.635,518100,1727,{"stem":733,"path":734,"title":735,"date":653,"collapsed":9,"readingTime":736},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F5.Chapter7-SequentialLogic","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fchapter7-sequentiallogic","Chapter 7：时序逻辑 Sequential Logic",{"text":463,"minutes":737,"time":738,"words":739},16.645,998700,3329,{"stem":741,"path":742,"title":743,"date":653,"collapsed":9,"readingTime":744},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F6.Chapter8-Speed","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fchapter8-speed","Chapter 8：延迟与速度 Speed",{"text":745,"minutes":746,"time":747,"words":748},"33 min read",32.885,1973100,6577,{"stem":750,"path":751,"title":752,"date":653,"collapsed":9,"readingTime":753},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F7.Chapter9-Power","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fchapter9-power","Chapter 9：功耗 Power",{"text":754,"minutes":755,"time":756,"words":757},"31 min read",31.005,1860300,6201,{"stem":759,"path":760,"title":761,"date":653,"collapsed":9,"readingTime":762},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F8.Chapter10-Interconnect","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fchapter10-interconnect","Chapter 10：互连 Interconnect",{"text":463,"minutes":763,"time":764,"words":765},16.32,979200,3264,{"stem":767,"path":768,"title":769,"date":653,"collapsed":9,"readingTime":770},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F9.Chapter11-Timing","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fchapter11-timing","Chapter 11：时序 Timing",{"text":289,"minutes":771,"time":772,"words":773},19.68,1180800,3936,{"stem":775,"path":776,"title":777,"date":653,"collapsed":343,"readingTime":778},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002Findex","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign","数字集成电路设计",{"text":80,"minutes":81,"time":81,"words":81},{"stem":780,"path":781,"title":782,"date":653,"collapsed":9,"readingTime":783},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002F1.L1-Intro","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl1-intro","L1：计算机发展史与体系结构导论",{"text":397,"minutes":784,"time":785,"words":786},18.695,1121700,3739,{"stem":788,"path":789,"title":790,"date":653,"collapsed":9,"readingTime":791},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002F10.L8-9-Memory","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl8-9-memory","L8-9：存储器层次结构",{"text":792,"minutes":793,"time":794,"words":795},"128 min read",127.1,7626000,25420,{"stem":797,"path":798,"title":799,"date":653,"collapsed":9,"readingTime":800},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002F11.L10-11-Parallelism","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl10-11-parallelism","L10-11：并行性",{"text":801,"minutes":802,"time":803,"words":804},"159 min read",158.86,9531600,31772,{"stem":806,"path":807,"title":808,"date":653,"collapsed":9,"readingTime":809},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002F12.L12-CacheCoherence","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl12-cachecoherence","L12：缓存一致性 Cache Coherence",{"text":810,"minutes":811,"time":812,"words":813},"76 min read",75.395,4523700,15079,{"stem":815,"path":816,"title":817,"date":653,"collapsed":9,"readingTime":818},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002F13.L13-14-ComplexPipeline","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl13-14-complexpipeline","L13-14：复杂流水线（衔接 L7）",{"text":819,"minutes":820,"time":821,"words":822},"44 min read",43.985,2639100,8797,{"stem":824,"path":825,"title":826,"date":653,"collapsed":9,"readingTime":827},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002F14.L15","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl15","L15：期末复习问答",{"text":269,"minutes":828,"time":829,"words":830},9.105,546300,1821,{"stem":832,"path":833,"title":834,"date":653,"collapsed":9,"readingTime":835},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002F2.L2-Binary","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl2-binary","L2：二进制数制",{"text":80,"minutes":81,"time":81,"words":81},{"stem":837,"path":838,"title":839,"date":653,"collapsed":9,"readingTime":840},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002F3.L3-CMemory","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl3-cmemory","L3：C 语言与内存模型",{"text":841,"minutes":842,"time":843,"words":844},"98 min read",97.32,5839200,19464,{"stem":846,"path":847,"title":848,"date":653,"collapsed":9,"readingTime":849},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002F4.L4a-wbx","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl4a-wbx","L4a：wbx",{"text":80,"minutes":81,"time":81,"words":81},{"stem":851,"path":852,"title":853,"date":653,"collapsed":9,"readingTime":854},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002F5.L4b-MachineCode","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl4b-machinecode","L4b：机器码 Machine Code",{"text":80,"minutes":81,"time":81,"words":81},{"stem":856,"path":857,"title":858,"date":653,"collapsed":9,"readingTime":859},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002F6.L5-DSD","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl5-dsd","L5：数字系统设计 Digital System Design",{"text":269,"minutes":860,"time":861,"words":862},9.955,597300,1991,{"stem":864,"path":865,"title":866,"date":653,"collapsed":9,"readingTime":867},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002F7.L6a-SingleCycle","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl6a-singlecycle","L6a：单周期处理器设计",{"text":219,"minutes":868,"time":869,"words":870},22.125,1327500,4425,{"stem":872,"path":873,"title":874,"date":653,"collapsed":9,"readingTime":875},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002F8.L6b-Microcode","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl6b-microcode","L6b：微码处理器架构",{"text":387,"minutes":876,"time":877,"words":878},11.86,711600,2372,{"stem":880,"path":881,"title":882,"date":653,"collapsed":9,"readingTime":883},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002F9.L7-Pipeline","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl7-pipeline","L7：流水线处理器",{"text":177,"minutes":884,"time":885,"words":886},44.505,2670300,8901,{"stem":888,"path":889,"title":890,"date":653,"collapsed":343,"readingTime":891},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002Findex","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization","计算机组成与系统结构",{"text":60,"minutes":892,"time":893,"words":894},0.12,7200,24,{"stem":896,"path":897,"title":898,"date":78,"collapsed":9,"readingTime":899},"posts\u002FUGCourses\u002F5.junior-spring\u002Findex","\u002Fugcourses\u002Fjunior-spring","大三春夏",{"text":80,"minutes":81,"time":81,"words":81},{"stem":901,"path":902,"title":903,"date":78,"collapsed":9,"readingTime":904},"posts\u002FUGCourses\u002Findex","\u002Fugcourses","本科课程",{"text":80,"minutes":81,"time":81,"words":81},{"stem":906,"path":907,"title":908,"date":909,"collapsed":9,"readingTime":910},"posts\u002Fubuntu\u002F1.config","\u002Fubuntu\u002Fconfig","ubuntu 系统配置","2025-08-26 19:38:06",{"text":158,"minutes":911,"time":912,"words":913},3.815,228900,763,{"stem":915,"path":916,"title":917,"date":918,"collapsed":9,"readingTime":919},"posts\u002Fubuntu\u002F2.cadence\u002F1.mmsim","\u002Fubuntu\u002Fcadence\u002Fmmsim","在 Ubuntu 24.04 上安装 Cadence MMSIM 15.1 的兼容性问题","2026-09-09 14:06:40",{"text":158,"minutes":920,"time":921,"words":922},3.5,210000,700,{"stem":924,"path":925,"title":926,"date":918,"collapsed":9,"readingTime":927},"posts\u002Fubuntu\u002F2.cadence\u002F2.innovus","\u002Fubuntu\u002Fcadence\u002Finnovus","Innovus安装",{"text":11,"minutes":928,"time":929,"words":930},2.08,124800,416,{"stem":932,"path":933,"title":934,"date":918,"collapsed":9,"readingTime":935},"posts\u002Fubuntu\u002F2.cadence\u002Findex","\u002Fubuntu\u002Fcadence","Ubuntu24.04安装Cadence 系列软件",{"text":269,"minutes":936,"time":937,"words":938},9.98,598800,1996,{"stem":940,"path":941,"title":942,"date":918,"collapsed":9,"readingTime":943},"posts\u002Fubuntu\u002F3.synopsys","\u002Fubuntu\u002Fsynopsys","Ubuntu 24.04 安装 Synopsys",{"text":269,"minutes":944,"time":945,"words":946},9.555,573300,1911,{"stem":948,"path":949,"title":950,"date":918,"collapsed":9,"readingTime":951},"posts\u002Fubuntu\u002F4.vivado","\u002Fubuntu\u002Fvivado","Ubuntu 24.04 安装 Vivado 2020.1",{"text":60,"minutes":952,"time":953,"words":954},0.62,37200,124,{"stem":956,"path":957,"title":958,"date":918,"collapsed":9,"readingTime":959},"posts\u002Fubuntu\u002F5.migrate","\u002Fubuntu\u002Fmigrate","硬盘迁移系统",{"text":60,"minutes":960,"time":961,"words":962},0.64,38400,128,{"stem":964,"path":965,"title":966,"date":967,"collapsed":9,"readingTime":968},"posts\u002Fubuntu\u002Findex","\u002Fubuntu","Ubuntu装进移动硬盘","2025-08-25 19:38:06",{"text":269,"minutes":969,"time":970,"words":971},9.26,555600,1852,{"id":973,"title":799,"body":974,"categories":27336,"collapsed":9,"date":653,"description":27337,"draft":9,"extension":27338,"hideInArchive":343,"hideInList":343,"image":27339,"meta":27340,"navigation":343,"path":798,"permalink":27339,"published":27339,"readingTime":27342,"recommend":27339,"references":27339,"seo":27343,"sitemap":27344,"stem":797,"tags":27393,"type":27396,"updated":653,"__hash__":27397},"content\u002Fposts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002F11.L10-11-Parallelism.md",{"type":975,"value":976,"toc":27089},"minimark",[977,981,1086,1091,1096,1108,1111,1194,1201,1205,1208,1230,1233,1237,1239,1243,1249,1256,1263,1265,1269,1272,1276,1279,1294,1298,1303,1412,1415,1733,1739,1917,1987,1990,2251,2255,2258,2268,2273,2280,2283,2494,2497,2750,2753,2757,2760,2763,2771,2778,2785,3102,3106,3111,3125,3128,3142,3153,3155,3159,3165,3168,3171,3174,3213,3219,3222,3224,3228,3231,3235,3238,3241,3412,3661,3837,3974,3977,4079,4082,4086,4089,4092,4234,4237,4430,4560,4671,4718,4725,4731,4735,4738,4836,4839,4944,4947,5139,5142,5354,5357,5360,5487,5490,5667,5670,5875,5878,6062,6069,6074,6082,6088,6098,6154,6163,6166,6172,6183,6187,6190,6192,6315,6318,6528,6531,6715,6718,6842,6844,6946,6949,7044,7051,7261,7264,7266,7270,7273,7278,7311,7316,7330,7333,7371,7374,7376,7380,7383,7391,7394,7419,7439,7512,7516,7519,7522,7526,7532,7535,7546,7549,8053,8058,8062,8065,8067,8078,8086,8090,8093,8097,8105,8108,8116,8122,8128,8133,8136,8139,8141,8145,8148,8152,8159,8173,8179,8187,8192,8206,8211,8215,8220,8237,8242,8245,8282,8288,8297,8299,8303,8310,8315,8317,8321,8325,8328,8374,8377,8388,8396,8398,8402,8405,8412,8417,8423,8425,8429,8432,8436,8439,8444,8464,8467,8470,8476,8484,8546,8552,8555,8616,8622,8625,8627,8631,8634,8639,8642,8662,8665,8673,8676,8736,8739,8742,8787,8789,8793,8803,8808,8811,8865,8868,8871,9280,9283,9679,9684,9691,9696,9698,9702,9706,9709,9726,9729,9732,9737,9742,9744,9748,9751,9813,9816,9822,9827,9830,9832,9836,9839,9912,9914,9920,9923,9947,9953,9962,10229,10496,10498,11133,11148,11150,11154,11157,11204,11207,11418,11421,11485,11492,11494,11498,11501,11505,11588,11593,11596,11602,11605,11608,11933,11936,11939,11945,11948,12011,12014,12339,12342,12430,12433,12738,12741,13031,13036,13039,13041,13045,13048,13105,13108,13117,13123,13128,13146,13148,13152,13156,13159,13162,13170,13192,13195,13221,13230,13233,13239,13257,13259,13266,13271,13274,13282,13289,13295,13300,13303,13309,13312,13318,13331,13334,13339,13342,13344,13348,13351,13412,13419,13426,13441,13443,13447,13453,13457,13460,13463,13552,13555,13562,13652,13655,14025,14028,14031,14033,14037,14040,14046,14049,14057,14059,14145,14260,14265,14267,14271,14274,14279,14339,14342,14347,14350,14352,14356,14359,14364,14367,14373,14379,14385,14391,14393,14397,14399,14470,14473,14488,14491,14718,14721,14758,14760,14764,14771,14775,14778,14783,14786,14887,14890,14893,14898,14900,14904,14907,14912,14926,14929,14934,14979,14984,14987,14989,14993,15208,15268,15273,15276,15278,15282,15285,15423,15427,15430,15772,15775,15853,15856,15992,15995,16225,16228,16230,16367,16421,16426,16429,16599,16602,16908,16911,17411,17485,17774,17933,18102,18105,18108,18113,18118,18121,18126,18128,18132,18137,18140,18145,18147,18151,18155,18161,18170,18172,18176,18181,18184,18187,18226,18229,18236,18239,18244,18246,18250,18253,18258,18263,18266,18280,18283,18293,18295,18299,18303,18310,18313,18318,18321,18324,18394,18397,18405,18407,18411,18414,18425,18428,18435,18437,18441,18444,18458,18464,18467,18472,18474,18478,18481,18485,18488,18494,18497,18505,18508,18589,18592,18595,18597,18601,18604,18607,18612,18615,18621,18627,18632,18635,18637,18641,18644,18649,18652,18655,18736,18739,18793,18796,18799,18813,18816,18821,18824,18829,18831,18835,18838,18841,18847,18850,18856,18859,18870,18878,18881,18959,18962,19021,19024,19026,19030,19033,19038,19041,19046,19053,19056,19094,19097,19099,19103,19107,19114,19117,19122,19127,19130,19132,19136,19158,19161,19166,19169,19177,19180,19183,19188,19192,19195,19217,19220,19234,19236,19243,19246,19249,19253,19256,19259,19263,19269,19272,19276,19279,19282,19286,19289,19293,19296,19298,19302,19305,19308,19319,19322,19327,19329,19333,19336,19340,19343,19346,19395,19398,19401,19415,19421,19423,19427,19430,19444,19454,19457,19462,19465,19470,19473,19480,19482,19486,19489,19493,19496,19501,19507,19510,19513,19519,19532,19535,19538,19546,19548,19552,19554,19559,19562,19565,19571,19585,19588,19590,19594,19596,19601,19603,19609,19619,19622,19625,19630,19633,19635,19639,19642,19645,19659,19666,19669,19674,19677,19682,19684,19687,19690,19695,19698,19710,19717,19720,19736,19739,19753,19756,19773,19776,19781,19783,19787,19792,19795,19817,19823,19825,19829,19834,19837,19842,19848,19850,19854,19857,20141,20144,20239,20242,20253,20258,20261,20266,20268,20272,20275,20278,20323,20326,20331,20334,20336,20340,20345,20348,20353,20356,20359,20388,20390,20394,20397,20406,20409,20426,20429,20431,20435,20444,20447,20455,20458,20466,20469,20472,20477,20480,20482,20486,20489,20494,20508,20511,20517,20519,20523,20526,20531,20536,20539,20544,20547,20552,20555,20569,20572,20574,20578,20581,20584,20595,20598,20758,20760,20764,20767,20770,20875,20880,20888,20891,20898,20900,20904,20907,20912,20917,20920,20934,20937,20939,20943,20948,20953,20956,20967,20970,21119,21130,21138,21140,21144,21147,21154,21171,21174,21182,21187,21190,21193,21195,21199,21202,21205,21210,21217,21224,21227,21238,21240,21244,21247,21250,21261,21264,21269,21281,21284,21287,21290,21292,21296,21299,21302,21319,21324,21326,21330,21333,21338,21345,21348,21351,21362,21369,21374,21377,21405,21424,21426,21430,21433,21436,21444,21447,21455,21458,21469,21474,21477,21479,21483,21486,21490,21493,21499,21502,21505,21509,21512,21517,21520,21524,21527,21530,21532,21536,21539,21553,21555,21559,21566,21572,21577,21580,21585,21588,21593,21599,21601,21605,21608,21613,21627,21632,21635,21637,21641,21644,21649,21652,21658,21661,21666,21672,21675,21677,21681,21684,21689,21694,21697,21708,21711,21713,21724,21726,21730,21735,21738,21743,21746,21752,21755,21760,21763,21765,21769,21772,21777,21782,21785,21811,21814,21822,21827,21833,21835,21839,21842,21847,21899,21926,21934,21937,21954,21957,21962,21964,21968,21971,21973,21990,21995,21998,22000,22004,22010,22014,22017,22021,22024,22026,22040,22044,22047,22049,22054,22057,22062,22064,22068,22071,22076,22079,22086,22089,22102,22105,22110,22113,22115,22119,22122,22126,22129,22136,22140,22143,22146,22150,22155,22157,22204,22215,22217,22221,22224,22232,22235,22258,22263,22266,22269,22271,22275,22278,22295,22298,22301,22304,22318,22321,22323,22327,22330,22332,22337,22340,22348,22353,22358,22363,22368,22373,22378,22380,22384,22396,22403,22405,22409,22412,22434,22437,22483,22485,22489,22492,22495,22498,22501,22504,22506,22510,22513,22516,22522,22525,22531,22534,22540,22543,22548,22551,22557,22564,22567,22573,22579,22581,22585,22588,22590,22596,22599,22604,22610,22618,22621,22641,22646,22652,22655,22657,22661,22664,22670,22676,22678,22682,22687,22694,22699,22702,22704,22708,22711,22739,22744,22750,22753,22758,22764,22767,22769,22773,22776,22779,22785,22792,22818,22821,22825,22837,22842,22847,22851,22854,22860,22871,22875,22878,22880,22886,22893,22898,22901,22903,22907,22912,22918,22925,22939,22942,22947,22950,22957,22959,22963,22966,22968,22972,22975,22978,23224,23231,23234,23239,23242,23248,23254,23256,23260,23265,23268,23274,23281,23286,23294,23296,23300,23303,23311,23316,23319,23325,23328,23334,23337,23342,23345,23347,23351,23354,23359,23362,23368,23371,23377,23382,23384,23388,23391,23397,23403,23410,23413,23418,23421,23423,23427,23433,23439,23442,23447,23450,23452,23456,23462,23465,23471,23474,23480,23483,23493,23498,23501,23503,23507,23510,23516,23519,23522,23528,23531,23548,23550,23554,23560,23567,23570,23576,23579,23582,23585,23587,23591,23596,23602,23605,23611,23614,23620,23623,23626,23633,23635,23639,23642,23648,23651,23657,23660,23666,23669,23675,23678,23684,23687,23694,23700,23703,23709,23716,23722,23725,23731,23737,23739,23743,23746,23752,23755,23761,23764,23770,23776,23781,23787,23790,23796,23798,23801,23809,23817,23822,23827,23835,23843,23845,23849,23855,23863,23869,23871,23875,23880,23883,23889,23892,23898,23901,23903,23907,23912,23915,23917,23921,23924,23929,23934,23936,23941,23944,23946,23950,23953,23956,23962,23967,23969,23973,23976,23982,23985,23991,23994,24000,24009,24012,24014,24018,24021,24027,24030,24036,24039,24042,24045,24050,24056,24058,24062,24068,24071,24076,24079,24085,24088,24091,24105,24108,24111,24114,24116,24120,24126,24129,24135,24138,24144,24147,24169,24176,24179,24185,24195,24198,24231,24233,24238,24241,24243,24247,24250,24253,24277,24279,24285,24288,24294,24301,24307,24310,24316,24319,24322,24328,24331,24334,24337,24343,24357,24360,24365,24368,24370,24374,24377,24380,24386,24389,24392,24398,24401,24406,24417,24420,24422,24426,24429,24432,24438,24441,24505,24508,24525,24527,24535,24538,24540,24544,24547,24553,24556,24559,24613,24616,24622,24625,24631,24634,24640,24643,24649,24651,24655,24658,24664,24670,24675,24681,24687,24692,24694,24699,24702,24709,24712,24718,24721,24774,24776,24780,24783,24786,24792,24794,24800,24803,24805,24810,24813,24816,24819,24821,24825,24828,24833,24839,24842,24862,24865,24871,24874,24877,24922,24925,24928,24954,24957,24959,24963,24966,24972,24978,24983,24989,24999,25002,25007,25010,25016,25043,25045,25049,25052,25084,25086,25091,25094,25100,25103,25394,25397,25399,25403,25406,25447,25450,25455,25457,25460,25572,25574,25577,25582,25587,25592,25597,25604,25609,25614,25619,25621,25624,25627,25634,25637,25644,25646,25650,25653,25772,25775,25794,25797,25808,25811,25818,25824,25827,25829,25833,25839,25842,25845,25848,25868,25871,25874,25920,25923,25926,25933,25935,25939,25942,25947,25949,25955,25961,25964,25971,25974,25977,25982,25985,25999,26002,26250,26253,26260,26262,26266,26269,26274,26276,26282,26285,26291,26294,26297,26304,26307,26340,26343,26346,26349,26366,26369,26515,26518,26525,26528,26530,26534,26537,26542,26545,26548,26552,26555,26562,26565,26569,26572,26579,26582,26585,26631,26634,26637,26644,26647,26650,26652,26656,26659,26666,26669,26674,26676,26682,26685,26702,26711,26714,26752,26755,26758,26765,26768,26770,26774,26777,26780,26787,26790,26795,26798,26801,26839,26842,26845,26848,26855,26858,26860,26864,26867,26873,26876,26902,26904,26908,26911,26915,26918,26921,26926,26929,26933,26936,26953,26956,26960,26963,26969,26972,26978,26981,26988,26992,26995,27056,27059,27061,27065,27068,27075,27078,27084,27087],[978,979,980],"h4",{"id":980},"建议拆分",[982,983,984,1000],"table",{},[985,986,987],"thead",{},[988,989,990,994,997],"tr",{},[991,992,993],"th",{},"模块",[991,995,996],{},"页码",[991,998,999],{},"学习目标",[1001,1002,1003,1015,1026,1037,1048,1059,1075],"tbody",{},[988,1004,1005,1009,1012],{},[1006,1007,1008],"td",{},"0. 总览",[1006,1010,1011],{},"1–3",[1006,1013,1014],{},"先知道这节课讲什么：并行的几种层次",[988,1016,1017,1020,1023],{},[1006,1018,1019],{},"1. 并行处理基础",[1006,1021,1022],{},"4–29",[1006,1024,1025],{},"搞懂为什么需要并行、矩阵乘法例子、Amdahl 定律、SISD\u002FSIMD\u002FMIMD\u002FMISD",[988,1027,1028,1031,1034],{},[1006,1029,1030],{},"2. 数据级并行 DLP \u002F SIMD",[1006,1032,1033],{},"30–60",[1006,1035,1036],{},"重点看 SIMD、AVX、intrinsics、向量化矩阵乘法、loop unrolling、blocking、GEMM",[988,1038,1039,1042,1045],{},[1006,1040,1041],{},"3. 指令级并行 ILP",[1006,1043,1044],{},"61–89",[1006,1046,1047],{},"看 VLIW、循环展开、软件流水线、trace scheduling、Itanium\u002FIA-64",[988,1049,1050,1053,1056],{},[1006,1051,1052],{},"4. 线程级并行 TLP",[1006,1054,1055],{},"90–125",[1006,1057,1058],{},"看多核、多线程、SMT\u002F超线程、操作系统线程和硬件线程区别",[988,1060,1061,1064,1067],{},[1006,1062,1063],{},"5. 并行编程语言 \u002F OpenMP",[1006,1065,1066],{},"126–149",[1006,1068,1069,1070,1074],{},"会读 OpenMP 的 ",[1071,1072,1073],"code",{"code":1073},"parallel for","、fork-join、reduction",[988,1076,1077,1080,1083],{},[1006,1078,1079],{},"6. 并行同步",[1006,1081,1082],{},"150–167",[1006,1084,1085],{},"重点理解 data race、lock、atomic、AMO、critical section、deadlock",[1087,1088,1090],"h2",{"id":1089},"第-0-模块总览13-页","第 0 模块：总览，1–3 页",[1092,1093,1095],"h3",{"id":1094},"第-2-页整门课从顺序机器走向并行机器","第 2 页：整门课从“顺序机器”走向“并行机器”",[1097,1098,1099,1100,1107],"p",{},"这一页其实是在告诉你：以前学的单周期、多周期、流水线、cache 等，都还偏“单个处理器内部怎么跑得快”；现在要看更复杂的机器结构，也就是",[1101,1102,1103],"mark",{},[1104,1105,1106],"strong",{},"利用并行性来实现高性能","。",[1097,1109,1110],{},"课件列了几个层次：",[982,1112,1113,1126],{},[985,1114,1115],{},[988,1116,1117,1120,1123],{},[991,1118,1119],{},"并行层次",[991,1121,1122],{},"例子",[991,1124,1125],{},"大概对应",[1001,1127,1128,1139,1150,1161,1172,1183],{},[988,1129,1130,1133,1136],{},[1006,1131,1132],{},"并行请求",[1006,1134,1135],{},"搜索引擎同时处理很多搜索请求",[1006,1137,1138],{},"数据中心 \u002F 仓库级计算机",[988,1140,1141,1144,1147],{},[1006,1142,1143],{},"并行线程",[1006,1145,1146],{},"一个程序分成多个线程，分配到多个核心",[1006,1148,1149],{},"多核 CPU",[988,1151,1152,1155,1158],{},[1006,1153,1154],{},"并行指令",[1006,1156,1157],{},"同一时刻多条指令在流水线中",[1006,1159,1160],{},"ILP，指令级并行",[988,1162,1163,1166,1169],{},[1006,1164,1165],{},"并行数据",[1006,1167,1168],{},"一条指令同时处理多个数据",[1006,1170,1171],{},"SIMD \u002F 向量指令 \u002F DLP",[988,1173,1174,1177,1180],{},[1006,1175,1176],{},"硬件描述",[1006,1178,1179],{},"所有门电路同时工作",[1006,1181,1182],{},"数字电路天然并行",[988,1184,1185,1188,1191],{},[1006,1186,1187],{},"编程语言",[1006,1189,1190],{},"用语言表达并行",[1006,1192,1193],{},"OpenMP 等",[1097,1195,1196,1197,1200],{},"这一页的核心不是背图，而是建立一个总框架：",[1104,1198,1199],{},"并行不是只有多核，它可以发生在请求、线程、指令、数据、硬件门级等多个层次。","后面模块会依次展开这些层次。",[1092,1202,1204],{"id":1203},"第-3-页目录","第 3 页：目录",[1097,1206,1207],{},"目录给出这份课件的主线：",[1209,1210,1211,1215,1218,1221,1224,1227],"ol",{},[1212,1213,1214],"li",{},"并行处理",[1212,1216,1217],{},"数据级并行 DLP",[1212,1219,1220],{},"指令级并行 ILP",[1212,1222,1223],{},"线程级并行 TLP",[1212,1225,1226],{},"并行编程语言",[1212,1228,1229],{},"并行同步",[1231,1232],"hr",{},[1087,1234,1236],{"id":1235},"第-1-模块并行处理429-页","第 1 模块：并行处理，4–29 页",[1231,1238],{},[1092,1240,1242],{"id":1241},"第-5-页从单核计算机开始了解背景即可","第 5 页：从单核计算机开始，了解背景即可",[1097,1244,1245],{},[1246,1247],"img",{"alt":1246,"src":1248},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-01.png",[1097,1250,1251,1252,1255],{},"第 5 页回顾了一个",[1104,1253,1254],{},"单核计算机","：处理器里有控制器、数据通路、PC、寄存器、ALU；外面有 cache、memory、I\u002FO。课件特别强调“无 FPU, SIMD”，也就是这是一个比较朴素的单核处理器模型。",[1097,1257,1258,1259,1262],{},"这页的作用是：先让你记住原始状态是",[1104,1260,1261],{},"一个处理器按顺序处理字和字节","，内存\u002Fcache 按块组织。后面讲 SIMD、多核、线程时，本质上都是在突破这个“一个 ALU 一次算一个东西”的限制。",[1231,1264],{},[1092,1266,1268],{"id":1267},"第-613-页矩阵乘法作为性能例子","第 6–13 页：矩阵乘法作为性能例子",[1097,1270,1271],{},"用矩阵乘法说明：同一个算法，用不同语言和不同底层实现，性能可能差很多。",[978,1273,1275],{"id":1274},"第-67-页为什么选矩阵乘法","第 6–7 页：为什么选矩阵乘法",[1097,1277,1278],{},"矩阵乘法是工程、图像处理、数据处理里的基础操作，比如图像滤波、降噪等。课件还提到深度学习应用，比如图像分类、目标检测、机器翻译、指纹验证、视频生成等。这些应用底层都离不开大量矩阵或向量计算。",[1097,1280,1281,1282,1285,1286,1291],{},"这里出现的 ",[1104,1283,1284],{},"dgemm"," 要记一下：\n",[1101,1287,1288],{},[1104,1289,1290],{},"dgemm = double-precision general matrix multiplication",[1101,1292,1293],{},"，也就是双精度浮点矩阵乘法。",[978,1295,1297],{"id":1296},"第-89-页矩阵乘法公式","第 8–9 页：矩阵乘法公式",[1097,1299,1300],{},[1246,1301],{"alt":1246,"src":1302},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-02.png",[1304,1305,1308],"span",{"className":1306},[1307],"katex-display",[1304,1309,1312,1349],{"className":1310},[1311],"katex",[1304,1313,1316],{"className":1314},[1315],"katex-mathml",[1317,1318,1321],"math",{"xmlns":1319,"display":1320},"http:\u002F\u002Fwww.w3.org\u002F1998\u002FMath\u002FMathML","block",[1322,1323,1324,1344],"semantics",{},[1325,1326,1327,1331,1335,1338,1341],"mrow",{},[1328,1329,1330],"mi",{},"C",[1332,1333,1334],"mo",{},"=",[1328,1336,1337],{},"A",[1332,1339,1340],{},"×",[1328,1342,1343],{},"B",[1345,1346,1348],"annotation",{"encoding":1347},"application\u002Fx-tex","C = A \\times B",[1304,1350,1354,1381,1402],{"className":1351,"ariaHidden":1353},[1352],"katex-html","true",[1304,1355,1358,1363,1369,1374,1378],{"className":1356},[1357],"base",[1304,1359],{"className":1360,"style":1362},[1361],"strut","height:0.6833em;",[1304,1364,1330],{"className":1365,"style":1368},[1366,1367],"mord","mathnormal","margin-right:0.0715em;",[1304,1370],{"className":1371,"style":1373},[1372],"mspace","margin-right:0.2778em;",[1304,1375,1334],{"className":1376},[1377],"mrel",[1304,1379],{"className":1380,"style":1373},[1372],[1304,1382,1384,1388,1391,1395,1399],{"className":1383},[1357],[1304,1385],{"className":1386,"style":1387},[1361],"height:0.7667em;vertical-align:-0.0833em;",[1304,1389,1337],{"className":1390},[1366,1367],[1304,1392],{"className":1393,"style":1394},[1372],"margin-right:0.2222em;",[1304,1396,1340],{"className":1397},[1398],"mbin",[1304,1400],{"className":1401,"style":1394},[1372],[1304,1403,1405,1408],{"className":1404},[1357],[1304,1406],{"className":1407,"style":1362},[1361],[1304,1409,1343],{"className":1410,"style":1411},[1366,1367],"margin-right:0.0502em;",[1097,1413,1414],{},"其中：",[1304,1416,1418],{"className":1417},[1307],[1304,1419,1421,1479],{"className":1420},[1311],[1304,1422,1424],{"className":1423},[1315],[1317,1425,1426],{"xmlns":1319,"display":1320},[1322,1427,1428,1476],{},[1325,1429,1430,1443,1445,1454,1464,1466],{},[1431,1432,1433,1435],"msub",{},[1328,1434,1330],{},[1325,1436,1437,1440],{},[1328,1438,1439],{},"i",[1328,1441,1442],{},"j",[1332,1444,1334],{},[1446,1447,1448,1451],"munder",{},[1332,1449,1450],{},"∑",[1328,1452,1453],{},"k",[1431,1455,1456,1458],{},[1328,1457,1337],{},[1325,1459,1460,1462],{},[1328,1461,1439],{},[1328,1463,1453],{},[1332,1465,1340],{},[1431,1467,1468,1470],{},[1328,1469,1343],{},[1325,1471,1472,1474],{},[1328,1473,1453],{},[1328,1475,1442],{},[1345,1477,1478],{"encoding":1347},"C_{ij} = \\sum_k A_{ik} \\times B_{kj}",[1304,1480,1482,1559,1680],{"className":1481,"ariaHidden":1353},[1352],[1304,1483,1485,1489,1550,1553,1556],{"className":1484},[1357],[1304,1486],{"className":1487,"style":1488},[1361],"height:0.9694em;vertical-align:-0.2861em;",[1304,1490,1492,1495],{"className":1491},[1366],[1304,1493,1330],{"className":1494,"style":1368},[1366,1367],[1304,1496,1499],{"className":1497},[1498],"msupsub",[1304,1500,1504,1541],{"className":1501},[1502,1503],"vlist-t","vlist-t2",[1304,1505,1508,1536],{"className":1506},[1507],"vlist-r",[1304,1509,1513],{"className":1510,"style":1512},[1511],"vlist","height:0.3117em;",[1304,1514,1516,1521],{"style":1515},"top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;",[1304,1517],{"className":1518,"style":1520},[1519],"pstrut","height:2.7em;",[1304,1522,1528],{"className":1523},[1524,1525,1526,1527],"sizing","reset-size6","size3","mtight",[1304,1529,1531],{"className":1530},[1366,1527],[1304,1532,1535],{"className":1533,"style":1534},[1366,1367,1527],"margin-right:0.0572em;","ij",[1304,1537,1540],{"className":1538},[1539],"vlist-s","​",[1304,1542,1544],{"className":1543},[1507],[1304,1545,1548],{"className":1546,"style":1547},[1511],"height:0.2861em;",[1304,1549],{},[1304,1551],{"className":1552,"style":1373},[1372],[1304,1554,1334],{"className":1555},[1377],[1304,1557],{"className":1558,"style":1373},[1372],[1304,1560,1562,1566,1620,1624,1671,1674,1677],{"className":1561},[1357],[1304,1563],{"className":1564,"style":1565},[1361],"height:2.3521em;vertical-align:-1.3021em;",[1304,1567,1571],{"className":1568},[1569,1570],"mop","op-limits",[1304,1572,1574,1611],{"className":1573},[1502,1503],[1304,1575,1577,1608],{"className":1576},[1507],[1304,1578,1581,1595],{"className":1579,"style":1580},[1511],"height:1.05em;",[1304,1582,1584,1588],{"style":1583},"top:-1.8479em;margin-left:0em;",[1304,1585],{"className":1586,"style":1587},[1519],"height:3.05em;",[1304,1589,1591],{"className":1590},[1524,1525,1526,1527],[1304,1592,1453],{"className":1593,"style":1594},[1366,1367,1527],"margin-right:0.0315em;",[1304,1596,1598,1601],{"style":1597},"top:-3.05em;",[1304,1599],{"className":1600,"style":1587},[1519],[1304,1602,1603],{},[1304,1604,1450],{"className":1605},[1569,1606,1607],"op-symbol","large-op",[1304,1609,1540],{"className":1610},[1539],[1304,1612,1614],{"className":1613},[1507],[1304,1615,1618],{"className":1616,"style":1617},[1511],"height:1.3021em;",[1304,1619],{},[1304,1621],{"className":1622,"style":1623},[1372],"margin-right:0.1667em;",[1304,1625,1627,1630],{"className":1626},[1366],[1304,1628,1337],{"className":1629},[1366,1367],[1304,1631,1633],{"className":1632},[1498],[1304,1634,1636,1662],{"className":1635},[1502,1503],[1304,1637,1639,1659],{"className":1638},[1507],[1304,1640,1643],{"className":1641,"style":1642},[1511],"height:0.3361em;",[1304,1644,1646,1649],{"style":1645},"top:-2.55em;margin-left:0em;margin-right:0.05em;",[1304,1647],{"className":1648,"style":1520},[1519],[1304,1650,1652],{"className":1651},[1524,1525,1526,1527],[1304,1653,1655],{"className":1654},[1366,1527],[1304,1656,1658],{"className":1657,"style":1594},[1366,1367,1527],"ik",[1304,1660,1540],{"className":1661},[1539],[1304,1663,1665],{"className":1664},[1507],[1304,1666,1669],{"className":1667,"style":1668},[1511],"height:0.15em;",[1304,1670],{},[1304,1672],{"className":1673,"style":1394},[1372],[1304,1675,1340],{"className":1676},[1398],[1304,1678],{"className":1679,"style":1394},[1372],[1304,1681,1683,1686],{"className":1682},[1357],[1304,1684],{"className":1685,"style":1488},[1361],[1304,1687,1689,1692],{"className":1688},[1366],[1304,1690,1343],{"className":1691,"style":1411},[1366,1367],[1304,1693,1695],{"className":1694},[1498],[1304,1696,1698,1725],{"className":1697},[1502,1503],[1304,1699,1701,1722],{"className":1700},[1507],[1304,1702,1704],{"className":1703,"style":1642},[1511],[1304,1705,1707,1710],{"style":1706},"top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;",[1304,1708],{"className":1709,"style":1520},[1519],[1304,1711,1713],{"className":1712},[1524,1525,1526,1527],[1304,1714,1716,1719],{"className":1715},[1366,1527],[1304,1717,1453],{"className":1718,"style":1594},[1366,1367,1527],[1304,1720,1442],{"className":1721,"style":1534},[1366,1367,1527],[1304,1723,1540],{"className":1724},[1539],[1304,1726,1728],{"className":1727},[1507],[1304,1729,1731],{"className":1730,"style":1547},[1511],[1304,1732],{},[1097,1734,1735,1736],{},"这句话要真正理解：\n",[1104,1737,1738],{},"C 的第 i 行第 j 列元素，是 A 的第 i 行和 B 的第 j 列做点积。",[1097,1740,1741,1742,1819,1820,1849,1850,1916],{},"也就是说，要算一个 (",[1304,1743,1745,1767],{"className":1744},[1311],[1304,1746,1748],{"className":1747},[1315],[1317,1749,1750],{"xmlns":1319},[1322,1751,1752,1764],{},[1325,1753,1754],{},[1431,1755,1756,1758],{},[1328,1757,1330],{},[1325,1759,1760,1762],{},[1328,1761,1439],{},[1328,1763,1442],{},[1345,1765,1766],{"encoding":1347},"C_{ij}",[1304,1768,1770],{"className":1769,"ariaHidden":1353},[1352],[1304,1771,1773,1776],{"className":1772},[1357],[1304,1774],{"className":1775,"style":1488},[1361],[1304,1777,1779,1782],{"className":1778},[1366],[1304,1780,1330],{"className":1781,"style":1368},[1366,1367],[1304,1783,1785],{"className":1784},[1498],[1304,1786,1788,1811],{"className":1787},[1502,1503],[1304,1789,1791,1808],{"className":1790},[1507],[1304,1792,1794],{"className":1793,"style":1512},[1511],[1304,1795,1796,1799],{"style":1515},[1304,1797],{"className":1798,"style":1520},[1519],[1304,1800,1802],{"className":1801},[1524,1525,1526,1527],[1304,1803,1805],{"className":1804},[1366,1527],[1304,1806,1535],{"className":1807,"style":1534},[1366,1367,1527],[1304,1809,1540],{"className":1810},[1539],[1304,1812,1814],{"className":1813},[1507],[1304,1815,1817],{"className":1816,"style":1547},[1511],[1304,1818],{},")，需要让 (",[1304,1821,1823,1836],{"className":1822},[1311],[1304,1824,1826],{"className":1825},[1315],[1317,1827,1828],{"xmlns":1319},[1322,1829,1830,1834],{},[1325,1831,1832],{},[1328,1833,1453],{},[1345,1835,1453],{"encoding":1347},[1304,1837,1839],{"className":1838,"ariaHidden":1353},[1352],[1304,1840,1842,1846],{"className":1841},[1357],[1304,1843],{"className":1844,"style":1845},[1361],"height:0.6944em;",[1304,1847,1453],{"className":1848,"style":1594},[1366,1367],") 从 0 到 (N-1)，每次做一次乘法和一次加法。矩阵里有 (",[1304,1851,1853,1875],{"className":1852},[1311],[1304,1854,1856],{"className":1855},[1315],[1317,1857,1858],{"xmlns":1319},[1322,1859,1860,1872],{},[1325,1861,1862],{},[1863,1864,1865,1868],"msup",{},[1328,1866,1867],{},"N",[1869,1870,1871],"mn",{},"2",[1345,1873,1874],{"encoding":1347},"N^2",[1304,1876,1878],{"className":1877,"ariaHidden":1353},[1352],[1304,1879,1881,1885],{"className":1880},[1357],[1304,1882],{"className":1883,"style":1884},[1361],"height:0.8141em;",[1304,1886,1888,1892],{"className":1887},[1366],[1304,1889,1867],{"className":1890,"style":1891},[1366,1367],"margin-right:0.109em;",[1304,1893,1895],{"className":1894},[1498],[1304,1896,1898],{"className":1897},[1502],[1304,1899,1901],{"className":1900},[1507],[1304,1902,1904],{"className":1903,"style":1884},[1511],[1304,1905,1907,1910],{"style":1906},"top:-3.063em;margin-right:0.05em;",[1304,1908],{"className":1909,"style":1520},[1519],[1304,1911,1913],{"className":1912},[1524,1525,1526,1527],[1304,1914,1871],{"className":1915},[1366,1527],") 个元素，所以总计算量大约是：",[1304,1918,1920],{"className":1919},[1307],[1304,1921,1923,1944],{"className":1922},[1311],[1304,1924,1926],{"className":1925},[1315],[1317,1927,1928],{"xmlns":1319,"display":1320},[1322,1929,1930,1941],{},[1325,1931,1932,1934],{},[1869,1933,1871],{},[1863,1935,1936,1938],{},[1328,1937,1867],{},[1869,1939,1940],{},"3",[1345,1942,1943],{"encoding":1347},"2N^3",[1304,1945,1947],{"className":1946,"ariaHidden":1353},[1352],[1304,1948,1950,1954,1957],{"className":1949},[1357],[1304,1951],{"className":1952,"style":1953},[1361],"height:0.8641em;",[1304,1955,1871],{"className":1956},[1366],[1304,1958,1960,1963],{"className":1959},[1366],[1304,1961,1867],{"className":1962,"style":1891},[1366,1367],[1304,1964,1966],{"className":1965},[1498],[1304,1967,1969],{"className":1968},[1502],[1304,1970,1972],{"className":1971},[1507],[1304,1973,1975],{"className":1974,"style":1953},[1511],[1304,1976,1978,1981],{"style":1977},"top:-3.113em;margin-right:0.05em;",[1304,1979],{"className":1980,"style":1520},[1519],[1304,1982,1984],{"className":1983},[1524,1525,1526,1527],[1304,1985,1940],{"className":1986},[1366,1527],[1097,1988,1989],{},"这里的 2 来自：一次乘法 + 一次加法。",[1991,1992,1993],"blockquote",{},[1097,1994,1995,1996,2072,2073,2131,2132,2250],{},"其实每一个元素(",[1304,1997,1999,2020],{"className":1998},[1311],[1304,2000,2002],{"className":2001},[1315],[1317,2003,2004],{"xmlns":1319},[1322,2005,2006,2018],{},[1325,2007,2008],{},[1431,2009,2010,2012],{},[1328,2011,1330],{},[1325,2013,2014,2016],{},[1328,2015,1439],{},[1328,2017,1442],{},[1345,2019,1766],{"encoding":1347},[1304,2021,2023],{"className":2022,"ariaHidden":1353},[1352],[1304,2024,2026,2029],{"className":2025},[1357],[1304,2027],{"className":2028,"style":1488},[1361],[1304,2030,2032,2035],{"className":2031},[1366],[1304,2033,1330],{"className":2034,"style":1368},[1366,1367],[1304,2036,2038],{"className":2037},[1498],[1304,2039,2041,2064],{"className":2040},[1502,1503],[1304,2042,2044,2061],{"className":2043},[1507],[1304,2045,2047],{"className":2046,"style":1512},[1511],[1304,2048,2049,2052],{"style":1515},[1304,2050],{"className":2051,"style":1520},[1519],[1304,2053,2055],{"className":2054},[1524,1525,1526,1527],[1304,2056,2058],{"className":2057},[1366,1527],[1304,2059,1535],{"className":2060,"style":1534},[1366,1367,1527],[1304,2062,1540],{"className":2063},[1539],[1304,2065,2067],{"className":2066},[1507],[1304,2068,2070],{"className":2069,"style":1547},[1511],[1304,2071],{},")应该是需要（N）次乘法加上（N-1）次加法，一共（2N-1）次，(",[1304,2074,2076,2093],{"className":2075},[1311],[1304,2077,2079],{"className":2078},[1315],[1317,2080,2081],{"xmlns":1319},[1322,2082,2083,2091],{},[1325,2084,2085],{},[1863,2086,2087,2089],{},[1328,2088,1867],{},[1869,2090,1871],{},[1345,2092,1874],{"encoding":1347},[1304,2094,2096],{"className":2095,"ariaHidden":1353},[1352],[1304,2097,2099,2102],{"className":2098},[1357],[1304,2100],{"className":2101,"style":1884},[1361],[1304,2103,2105,2108],{"className":2104},[1366],[1304,2106,1867],{"className":2107,"style":1891},[1366,1367],[1304,2109,2111],{"className":2110},[1498],[1304,2112,2114],{"className":2113},[1502],[1304,2115,2117],{"className":2116},[1507],[1304,2118,2120],{"className":2119,"style":1884},[1511],[1304,2121,2122,2125],{"style":1906},[1304,2123],{"className":2124,"style":1520},[1519],[1304,2126,2128],{"className":2127},[1524,1525,1526,1527],[1304,2129,1871],{"className":2130},[1366,1527],") 个元素，就是（",[1304,2133,2135,2164],{"className":2134},[1311],[1304,2136,2138],{"className":2137},[1315],[1317,2139,2140],{"xmlns":1319},[1322,2141,2142,2161],{},[1325,2143,2144,2146,2152,2155],{},[1869,2145,1871],{},[1863,2147,2148,2150],{},[1328,2149,1867],{},[1869,2151,1940],{},[1332,2153,2154],{},"−",[1863,2156,2157,2159],{},[1328,2158,1867],{},[1869,2160,1871],{},[1345,2162,2163],{"encoding":1347},"2N^3-N^2",[1304,2165,2167,2215],{"className":2166,"ariaHidden":1353},[1352],[1304,2168,2170,2174,2177,2206,2209,2212],{"className":2169},[1357],[1304,2171],{"className":2172,"style":2173},[1361],"height:0.8974em;vertical-align:-0.0833em;",[1304,2175,1871],{"className":2176},[1366],[1304,2178,2180,2183],{"className":2179},[1366],[1304,2181,1867],{"className":2182,"style":1891},[1366,1367],[1304,2184,2186],{"className":2185},[1498],[1304,2187,2189],{"className":2188},[1502],[1304,2190,2192],{"className":2191},[1507],[1304,2193,2195],{"className":2194,"style":1884},[1511],[1304,2196,2197,2200],{"style":1906},[1304,2198],{"className":2199,"style":1520},[1519],[1304,2201,2203],{"className":2202},[1524,1525,1526,1527],[1304,2204,1940],{"className":2205},[1366,1527],[1304,2207],{"className":2208,"style":1394},[1372],[1304,2210,2154],{"className":2211},[1398],[1304,2213],{"className":2214,"style":1394},[1372],[1304,2216,2218,2221],{"className":2217},[1357],[1304,2219],{"className":2220,"style":1884},[1361],[1304,2222,2224,2227],{"className":2223},[1366],[1304,2225,1867],{"className":2226,"style":1891},[1366,1367],[1304,2228,2230],{"className":2229},[1498],[1304,2231,2233],{"className":2232},[1502],[1304,2234,2236],{"className":2235},[1507],[1304,2237,2239],{"className":2238,"style":1884},[1511],[1304,2240,2241,2244],{"style":1906},[1304,2242],{"className":2243,"style":1520},[1519],[1304,2245,2247],{"className":2246},[1524,1525,1526,1527],[1304,2248,1871],{"className":2249},[1366,1527],"）次运算，二次项省略，即得",[978,2252,2254],{"id":2253},"第-10-页python-版本重要","第 10 页：Python 版本，重要",[1097,2256,2257],{},"Python 代码是三层循环：",[2259,2260,2266],"pre",{"className":2261,"code":2263,"language":2264,"meta":2265},[2262],"language-python","for i in range(N):\n    for j in range(N):\n        c[i+j*N] = 0\n        for k in range(N):\n            c[i+j*N] += a[i+k*N] * b[k+j*N]\n","python","",[1071,2267,2263],{"__ignoreMap":2265},[1097,2269,2270],{},[1246,2271],{"alt":1246,"src":2272},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-03.png",[1097,2274,2275,2276,2279],{},"课件给的数据很有意思：不管 (N=32,160,480,960)，Python 都大概只有 ",[1104,2277,2278],{},"5.3–5.5 MFLOPS","。这说明 Python 解释执行三重循环时，主要瓶颈不是矩阵大小，而是每次循环、索引、对象处理、解释器执行带来的巨大开销。",[1097,2281,2282],{},"要记住单位：",[2284,2285,2286,2359,2427],"ul",{},[1212,2287,2288,2291,2292,2358],{},[1104,2289,2290],{},"1 MFLOP"," = 每秒 (",[1304,2293,2295,2315],{"className":2294},[1311],[1304,2296,2298],{"className":2297},[1315],[1317,2299,2300],{"xmlns":1319},[1322,2301,2302,2312],{},[1325,2303,2304],{},[1863,2305,2306,2309],{},[1869,2307,2308],{},"10",[1869,2310,2311],{},"6",[1345,2313,2314],{"encoding":1347},"10^6",[1304,2316,2318],{"className":2317,"ariaHidden":1353},[1352],[1304,2319,2321,2324,2328],{"className":2320},[1357],[1304,2322],{"className":2323,"style":1884},[1361],[1304,2325,2327],{"className":2326},[1366],"1",[1304,2329,2331,2335],{"className":2330},[1366],[1304,2332,2334],{"className":2333},[1366],"0",[1304,2336,2338],{"className":2337},[1498],[1304,2339,2341],{"className":2340},[1502],[1304,2342,2344],{"className":2343},[1507],[1304,2345,2347],{"className":2346,"style":1884},[1511],[1304,2348,2349,2352],{"style":1906},[1304,2350],{"className":2351,"style":1520},[1519],[1304,2353,2355],{"className":2354},[1524,1525,1526,1527],[1304,2356,2311],{"className":2357},[1366,1527],") 次浮点运算；",[1212,2360,2361,2291,2364,2358],{},[1104,2362,2363],{},"1 GFLOP",[1304,2365,2367,2386],{"className":2366},[1311],[1304,2368,2370],{"className":2369},[1315],[1317,2371,2372],{"xmlns":1319},[1322,2373,2374,2383],{},[1325,2375,2376],{},[1863,2377,2378,2380],{},[1869,2379,2308],{},[1869,2381,2382],{},"9",[1345,2384,2385],{"encoding":1347},"10^9",[1304,2387,2389],{"className":2388,"ariaHidden":1353},[1352],[1304,2390,2392,2395,2398],{"className":2391},[1357],[1304,2393],{"className":2394,"style":1884},[1361],[1304,2396,2327],{"className":2397},[1366],[1304,2399,2401,2404],{"className":2400},[1366],[1304,2402,2334],{"className":2403},[1366],[1304,2405,2407],{"className":2406},[1498],[1304,2408,2410],{"className":2409},[1502],[1304,2411,2413],{"className":2412},[1507],[1304,2414,2416],{"className":2415,"style":1884},[1511],[1304,2417,2418,2421],{"style":1906},[1304,2419],{"className":2420,"style":1520},[1519],[1304,2422,2424],{"className":2423},[1524,1525,1526,1527],[1304,2425,2382],{"className":2426},[1366,1527],[1212,2428,2429,2430,2493],{},"dgemm 的浮点运算数约为 (",[1304,2431,2433,2452],{"className":2432},[1311],[1304,2434,2436],{"className":2435},[1315],[1317,2437,2438],{"xmlns":1319},[1322,2439,2440,2450],{},[1325,2441,2442,2444],{},[1869,2443,1871],{},[1863,2445,2446,2448],{},[1328,2447,1867],{},[1869,2449,1940],{},[1345,2451,1943],{"encoding":1347},[1304,2453,2455],{"className":2454,"ariaHidden":1353},[1352],[1304,2456,2458,2461,2464],{"className":2457},[1357],[1304,2459],{"className":2460,"style":1884},[1361],[1304,2462,1871],{"className":2463},[1366],[1304,2465,2467,2470],{"className":2466},[1366],[1304,2468,1867],{"className":2469,"style":1891},[1366,1367],[1304,2471,2473],{"className":2472},[1498],[1304,2474,2476],{"className":2475},[1502],[1304,2477,2479],{"className":2478},[1507],[1304,2480,2482],{"className":2481,"style":1884},[1511],[1304,2483,2484,2487],{"style":1906},[1304,2485],{"className":2486,"style":1520},[1519],[1304,2488,2490],{"className":2489},[1524,1525,1526,1527],[1304,2491,1940],{"className":2492},[1366,1527],")。",[1097,2495,2496],{},"如果考试给你运行时间 (t)，让你算性能：",[1304,2498,2500],{"className":2499},[1307],[1304,2501,2503,2561],{"className":2502},[1311],[1304,2504,2506],{"className":2505},[1315],[1317,2507,2508],{"xmlns":1319,"display":1320},[1322,2509,2510,2558],{},[1325,2511,2512,2515,2518,2521,2524,2527,2530,2532],{},[1328,2513,2514],{},"G",[1328,2516,2517],{},"F",[1328,2519,2520],{},"L",[1328,2522,2523],{},"O",[1328,2525,2526],{},"P",[1328,2528,2529],{},"S",[1332,2531,1334],{},[2533,2534,2535,2545],"mfrac",{},[1325,2536,2537,2539],{},[1869,2538,1871],{},[1863,2540,2541,2543],{},[1328,2542,1867],{},[1869,2544,1940],{},[1325,2546,2547,2550,2552],{},[1328,2548,2549],{},"t",[1332,2551,1340],{},[1863,2553,2554,2556],{},[1869,2555,2308],{},[1869,2557,2382],{},[1345,2559,2560],{"encoding":1347},"GFLOPS = \\frac{2N^3}{t \\times 10^9}",[1304,2562,2564,2598],{"className":2563,"ariaHidden":1353},[1352],[1304,2565,2567,2570,2575,2578,2582,2585,2589,2592,2595],{"className":2566},[1357],[1304,2568],{"className":2569,"style":1362},[1361],[1304,2571,2574],{"className":2572,"style":2573},[1366,1367],"margin-right:0.1389em;","GF",[1304,2576,2520],{"className":2577},[1366,1367],[1304,2579,2523],{"className":2580,"style":2581},[1366,1367],"margin-right:0.0278em;",[1304,2583,2526],{"className":2584,"style":2573},[1366,1367],[1304,2586,2529],{"className":2587,"style":2588},[1366,1367],"margin-right:0.0576em;",[1304,2590],{"className":2591,"style":1373},[1372],[1304,2593,1334],{"className":2594},[1377],[1304,2596],{"className":2597,"style":1373},[1372],[1304,2599,2601,2605],{"className":2600},[1357],[1304,2602],{"className":2603,"style":2604},[1361],"height:2.2604em;vertical-align:-0.7693em;",[1304,2606,2608,2613,2746],{"className":2607},[1366],[1304,2609],{"className":2610},[2611,2612],"mopen","nulldelimiter",[1304,2614,2616],{"className":2615},[2533],[1304,2617,2619,2737],{"className":2618},[1502,1503],[1304,2620,2622,2734],{"className":2621},[1507],[1304,2623,2626,2682,2693],{"className":2624,"style":2625},[1511],"height:1.4911em;",[1304,2627,2629,2633],{"style":2628},"top:-2.314em;",[1304,2630],{"className":2631,"style":2632},[1519],"height:3em;",[1304,2634,2636,2639,2642,2645,2648,2651],{"className":2635},[1366],[1304,2637,2549],{"className":2638},[1366,1367],[1304,2640],{"className":2641,"style":1394},[1372],[1304,2643,1340],{"className":2644},[1398],[1304,2646],{"className":2647,"style":1394},[1372],[1304,2649,2327],{"className":2650},[1366],[1304,2652,2654,2657],{"className":2653},[1366],[1304,2655,2334],{"className":2656},[1366],[1304,2658,2660],{"className":2659},[1498],[1304,2661,2663],{"className":2662},[1502],[1304,2664,2666],{"className":2665},[1507],[1304,2667,2670],{"className":2668,"style":2669},[1511],"height:0.7401em;",[1304,2671,2673,2676],{"style":2672},"top:-2.989em;margin-right:0.05em;",[1304,2674],{"className":2675,"style":1520},[1519],[1304,2677,2679],{"className":2678},[1524,1525,1526,1527],[1304,2680,2382],{"className":2681},[1366,1527],[1304,2683,2685,2688],{"style":2684},"top:-3.23em;",[1304,2686],{"className":2687,"style":2632},[1519],[1304,2689],{"className":2690,"style":2692},[2691],"frac-line","border-bottom-width:0.04em;",[1304,2694,2696,2699],{"style":2695},"top:-3.677em;",[1304,2697],{"className":2698,"style":2632},[1519],[1304,2700,2702,2705],{"className":2701},[1366],[1304,2703,1871],{"className":2704},[1366],[1304,2706,2708,2711],{"className":2707},[1366],[1304,2709,1867],{"className":2710,"style":1891},[1366,1367],[1304,2712,2714],{"className":2713},[1498],[1304,2715,2717],{"className":2716},[1502],[1304,2718,2720],{"className":2719},[1507],[1304,2721,2723],{"className":2722,"style":1884},[1511],[1304,2724,2725,2728],{"style":1906},[1304,2726],{"className":2727,"style":1520},[1519],[1304,2729,2731],{"className":2730},[1524,1525,1526,1527],[1304,2732,1940],{"className":2733},[1366,1527],[1304,2735,1540],{"className":2736},[1539],[1304,2738,2740],{"className":2739},[1507],[1304,2741,2744],{"className":2742,"style":2743},[1511],"height:0.7693em;",[1304,2745],{},[1304,2747],{"className":2748},[2749,2612],"mclose",[1097,2751,2752],{},"这个公式非常实用。",[978,2754,2756],{"id":2755},"第-1112-页c-版本和计时","第 11–12 页：C 版本和计时",[1097,2758,2759],{},"第 11 页给出 C 版本。它也是三重循环，但 C 是编译执行，类型固定、内存布局更直接，所以比 Python 快非常多。",[1097,2761,2762],{},"注意代码里有一个局部变量：",[2259,2764,2769],{"className":2765,"code":2767,"language":2768,"meta":2265},[2766],"language-c","double cij = 0;\n...\ncij += a[i+k*N] * b[k+j*N];\n...\nc[i+j*N] = cij;\n","c",[1071,2770,2767],{"__ignoreMap":2265},[1097,2772,2773,2774,2777],{},"这样做的好处是：先把结果累加在寄存器或局部变量里，最后再写回内存，减少频繁访问 ",[1071,2775,2776],{"code":2776},"c[i+j*N]"," 的成本。",[1097,2779,2780,2781,2784],{},"第 12 页讲计时，用 ",[1071,2782,2783],{"code":2783},"clock()"," 记录开始和结束时间，然后：",[1304,2786,2788],{"className":2787},[1307],[1304,2789,2791,2872],{"className":2790},[1311],[1304,2792,2794],{"className":2793},[1315],[1317,2795,2796],{"xmlns":1319,"display":1320},[1322,2797,2798,2869],{},[1325,2799,2800,2804,2806,2808],{},[1328,2801,2803],{"mathvariant":2802},"normal","Δ",[1328,2805,2549],{},[1332,2807,1334],{},[2533,2809,2810,2836],{},[1325,2811,2812,2815,2818,2821,2823,2826,2828,2831,2834],{},[1328,2813,2814],{},"e",[1328,2816,2817],{},"n",[1328,2819,2820],{},"d",[1332,2822,2154],{},[1328,2824,2825],{},"s",[1328,2827,2549],{},[1328,2829,2830],{},"a",[1328,2832,2833],{},"r",[1328,2835,2549],{},[1325,2837,2838,2840,2842,2844,2846,2849,2855,2858,2865,2867],{},[1328,2839,1330],{},[1328,2841,2520],{},[1328,2843,2523],{},[1328,2845,1330],{},[1328,2847,2848],{},"K",[1431,2850,2851,2853],{},[1328,2852,2529],{},[1328,2854,2526],{},[1328,2856,2857],{},"E",[1431,2859,2860,2863],{},[1328,2861,2862],{},"R",[1328,2864,2529],{},[1328,2866,2857],{},[1328,2868,1330],{},[1345,2870,2871],{"encoding":1347},"\\Delta t = \\frac{end-start}{CLOCKS_PER_SEC}",[1304,2873,2875,2896],{"className":2874,"ariaHidden":1353},[1352],[1304,2876,2878,2881,2884,2887,2890,2893],{"className":2877},[1357],[1304,2879],{"className":2880,"style":1362},[1361],[1304,2882,2803],{"className":2883},[1366],[1304,2885,2549],{"className":2886},[1366,1367],[1304,2888],{"className":2889,"style":1373},[1372],[1304,2891,1334],{"className":2892},[1377],[1304,2894],{"className":2895,"style":1373},[1372],[1304,2897,2899,2903],{"className":2898},[1357],[1304,2900],{"className":2901,"style":2902},[1361],"height:2.2074em;vertical-align:-0.836em;",[1304,2904,2906,2909,3099],{"className":2905},[1366],[1304,2907],{"className":2908},[2611,2612],[1304,2910,2912],{"className":2911},[2533],[1304,2913,2915,3090],{"className":2914},[1502,1503],[1304,2916,2918,3087],{"className":2917},[1507],[1304,2919,2922,3038,3046],{"className":2920,"style":2921},[1511],"height:1.3714em;",[1304,2923,2924,2927],{"style":2628},[1304,2925],{"className":2926,"style":2632},[1519],[1304,2928,2930,2933,2936,2939,2942,2945,2987,2990,3032,3035],{"className":2929},[1366],[1304,2931,1330],{"className":2932,"style":1368},[1366,1367],[1304,2934,2520],{"className":2935},[1366,1367],[1304,2937,2523],{"className":2938,"style":2581},[1366,1367],[1304,2940,1330],{"className":2941,"style":1368},[1366,1367],[1304,2943,2848],{"className":2944,"style":1368},[1366,1367],[1304,2946,2948,2951],{"className":2947},[1366],[1304,2949,2529],{"className":2950,"style":2588},[1366,1367],[1304,2952,2954],{"className":2953},[1498],[1304,2955,2957,2979],{"className":2956},[1502,1503],[1304,2958,2960,2976],{"className":2959},[1507],[1304,2961,2964],{"className":2962,"style":2963},[1511],"height:0.3283em;",[1304,2965,2967,2970],{"style":2966},"top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;",[1304,2968],{"className":2969,"style":1520},[1519],[1304,2971,2973],{"className":2972},[1524,1525,1526,1527],[1304,2974,2526],{"className":2975,"style":2573},[1366,1367,1527],[1304,2977,1540],{"className":2978},[1539],[1304,2980,2982],{"className":2981},[1507],[1304,2983,2985],{"className":2984,"style":1668},[1511],[1304,2986],{},[1304,2988,2857],{"className":2989,"style":2588},[1366,1367],[1304,2991,2993,2997],{"className":2992},[1366],[1304,2994,2862],{"className":2995,"style":2996},[1366,1367],"margin-right:0.0077em;",[1304,2998,3000],{"className":2999},[1498],[1304,3001,3003,3024],{"className":3002},[1502,1503],[1304,3004,3006,3021],{"className":3005},[1507],[1304,3007,3009],{"className":3008,"style":2963},[1511],[1304,3010,3012,3015],{"style":3011},"top:-2.55em;margin-left:-0.0077em;margin-right:0.05em;",[1304,3013],{"className":3014,"style":1520},[1519],[1304,3016,3018],{"className":3017},[1524,1525,1526,1527],[1304,3019,2529],{"className":3020,"style":2588},[1366,1367,1527],[1304,3022,1540],{"className":3023},[1539],[1304,3025,3027],{"className":3026},[1507],[1304,3028,3030],{"className":3029,"style":1668},[1511],[1304,3031],{},[1304,3033,2857],{"className":3034,"style":2588},[1366,1367],[1304,3036,1330],{"className":3037,"style":1368},[1366,1367],[1304,3039,3040,3043],{"style":2684},[1304,3041],{"className":3042,"style":2632},[1519],[1304,3044],{"className":3045,"style":2692},[2691],[1304,3047,3048,3051],{"style":2695},[1304,3049],{"className":3050,"style":2632},[1519],[1304,3052,3054,3057,3060,3063,3066,3069,3072,3075,3078,3081,3084],{"className":3053},[1366],[1304,3055,2814],{"className":3056},[1366,1367],[1304,3058,2817],{"className":3059},[1366,1367],[1304,3061,2820],{"className":3062},[1366,1367],[1304,3064],{"className":3065,"style":1394},[1372],[1304,3067,2154],{"className":3068},[1398],[1304,3070],{"className":3071,"style":1394},[1372],[1304,3073,2825],{"className":3074},[1366,1367],[1304,3076,2549],{"className":3077},[1366,1367],[1304,3079,2830],{"className":3080},[1366,1367],[1304,3082,2833],{"className":3083,"style":2581},[1366,1367],[1304,3085,2549],{"className":3086},[1366,1367],[1304,3088,1540],{"className":3089},[1539],[1304,3091,3093],{"className":3092},[1507],[1304,3094,3097],{"className":3095,"style":3096},[1511],"height:0.836em;",[1304,3098],{},[1304,3100],{"className":3101},[2749,2612],[978,3103,3105],{"id":3104},"第-13-页c-vs-python","第 13 页：C vs Python",[1097,3107,3108],{},[1246,3109],{"alt":1246,"src":3110},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-04.png",[1097,3112,3113,3114,3117,3118,3121,3122,1107],{},"课件给的数据是：C 大概 ",[1104,3115,3116],{},"0.91–1.32 GFLOPS","，Python 大概 ",[1104,3119,3120],{},"0.0053–0.0055 GFLOPS","，差了约 ",[1104,3123,3124],{},"240 倍",[1097,3126,3127],{},"这一页不要只记“C 比 Python 快”。更重要的是理解差距来源：",[1209,3129,3130,3133,3136,3139],{},[1212,3131,3132],{},"Python 三重循环解释执行，每次循环开销巨大；",[1212,3134,3135],{},"C 编译成机器码，循环和浮点操作更直接；",[1212,3137,3138],{},"C 可以更好利用寄存器、流水线、编译器优化；",[1212,3140,3141],{},"但这个 C 版本仍然只是普通 scalar 版本，还没有充分使用 SIMD、多核、cache blocking 等优化。",[1097,3143,3144,3145,3148],{},"所以这几页是在铺垫后面的主题：\n",[1104,3146,3147],{},"即使用 C，",[1101,3149,3150],{},[1104,3151,3152],{},"离硬件峰值性能也还差很远；想继续提升，就得靠并行。",[1231,3154],{},[1092,3156,3158],{"id":3157},"第-1415-页为什么需要并行重要","第 14–15 页：为什么需要并行，重要",[1097,3160,3161,3162,1107],{},"一个大背景：",[1104,3163,3164],{},"CPU 时钟频率不再持续增加",[1097,3166,3167],{},"以前提升性能有个简单粗暴的方法：提高主频。主频越高，单位时间执行的周期越多。但后来遇到技术和经济问题：散热困难、功耗太高、冷却成本不现实。所以现代处理器不能只靠“把频率拧高”。",[1097,3169,3170],{},"课件用了航空公司的类比：飞机最大速度受声速和经济性限制，那要提高运输吞吐量怎么办？不是无限提高单架飞机速度，而是用更多飞机、更大飞机、更多座位。计算机也是类似：单个核心不能无限快，就用更多核心、更多执行单元、更多 SIMD lanes。",[1097,3172,3173],{},"第 15 页区分两个概念：",[982,3175,3176,3189],{},[985,3177,3178],{},[988,3179,3180,3183,3186],{},[991,3181,3182],{},"概念",[991,3184,3185],{},"含义",[991,3187,3188],{},"难度",[1001,3190,3191,3202],{},[988,3192,3193,3196,3199],{},[1006,3194,3195],{},"Multiprogramming，并行程序\u002F多道程序",[1006,3197,3198],{},"同时运行多个独立程序",[1006,3200,3201],{},"相对简单",[988,3203,3204,3207,3210],{},[1006,3205,3206],{},"Parallel Computing，并行计算",[1006,3208,3209],{},"让一个程序更快运行",[1006,3211,3212],{},"更难",[1097,3214,3215,3216],{},"这门课后面关注的是第二个：",[1104,3217,3218],{},"如何把一个程序拆开并行执行，让它更快完成。",[1097,3220,3221],{},"这个区别很重要。比如你一边开微信一边开浏览器，这是 multiprogramming；但把一个矩阵乘法拆给 8 个核心一起算，这是 parallel computing。",[1231,3223],{},[1092,3225,3227],{"id":3226},"第-1621-页amdahl-定律","第 16–21 页：Amdahl 定律",[1097,3229,3230],{},"这是第 1 模块最可能考计算题的地方。",[978,3232,3234],{"id":3233},"第-16-页公式本体必须掌握","第 16 页：公式本体，必须掌握",[1097,3236,3237],{},"Amdahl 定律讨论的是：如果程序中只有一部分能被加速，那么整体能加速多少？",[1097,3239,3240],{},"设：",[2284,3242,3243,3280,3335,3409],{},[1212,3244,3245,3248,3276,3279],{},[1101,3246,3247],{},"(",[1304,3249,3251,3264],{"className":3250},[1311],[1304,3252,3254],{"className":3253},[1315],[1317,3255,3256],{"xmlns":1319},[1322,3257,3258,3262],{},[1325,3259,3260],{},[1328,3261,2517],{},[1345,3263,2517],{"encoding":1347},[1304,3265,3267],{"className":3266,"ariaHidden":1353},[1352],[1304,3268,3270,3273],{"className":3269},[1357],[1304,3271],{"className":3272,"style":1362},[1361],[1304,3274,2517],{"className":3275,"style":2573},[1366,1367],[1101,3277,3278],{},")：程序中可以被加速的部分所占比例","；",[1212,3281,3247,3282,3334],{},[1304,3283,3285,3303],{"className":3284},[1311],[1304,3286,3288],{"className":3287},[1315],[1317,3289,3290],{"xmlns":1319},[1322,3291,3292,3300],{},[1325,3293,3294,3296,3298],{},[1869,3295,2327],{},[1332,3297,2154],{},[1328,3299,2517],{},[1345,3301,3302],{"encoding":1347},"1-F",[1304,3304,3306,3325],{"className":3305,"ariaHidden":1353},[1352],[1304,3307,3309,3313,3316,3319,3322],{"className":3308},[1357],[1304,3310],{"className":3311,"style":3312},[1361],"height:0.7278em;vertical-align:-0.0833em;",[1304,3314,2327],{"className":3315},[1366],[1304,3317],{"className":3318,"style":1394},[1372],[1304,3320,2154],{"className":3321},[1398],[1304,3323],{"className":3324,"style":1394},[1372],[1304,3326,3328,3331],{"className":3327},[1357],[1304,3329],{"className":3330,"style":1362},[1361],[1304,3332,2517],{"className":3333,"style":2573},[1366,1367],")：不能被加速的部分；",[1212,3336,3247,3337,3408],{},[1304,3338,3340,3358],{"className":3339},[1311],[1304,3341,3343],{"className":3342},[1315],[1317,3344,3345],{"xmlns":1319},[1322,3346,3347,3355],{},[1325,3348,3349],{},[1431,3350,3351,3353],{},[1328,3352,2529],{},[1328,3354,2857],{},[1345,3356,3357],{"encoding":1347},"S_E",[1304,3359,3361],{"className":3360,"ariaHidden":1353},[1352],[1304,3362,3364,3368],{"className":3363},[1357],[1304,3365],{"className":3366,"style":3367},[1361],"height:0.8333em;vertical-align:-0.15em;",[1304,3369,3371,3374],{"className":3370},[1366],[1304,3372,2529],{"className":3373,"style":2588},[1366,1367],[1304,3375,3377],{"className":3376},[1498],[1304,3378,3380,3400],{"className":3379},[1502,1503],[1304,3381,3383,3397],{"className":3382},[1507],[1304,3384,3386],{"className":3385,"style":2963},[1511],[1304,3387,3388,3391],{"style":2966},[1304,3389],{"className":3390,"style":1520},[1519],[1304,3392,3394],{"className":3393},[1524,1525,1526,1527],[1304,3395,2857],{"className":3396,"style":2588},[1366,1367,1527],[1304,3398,1540],{"className":3399},[1539],[1304,3401,3403],{"className":3402},[1507],[1304,3404,3406],{"className":3405,"style":1668},[1511],[1304,3407],{},")：可加速部分的加速倍数；",[1212,3410,3411],{},"总加速比：",[1304,3413,3415],{"className":3414},[1307],[1304,3416,3418,3479],{"className":3417},[1311],[1304,3419,3421],{"className":3420},[1315],[1317,3422,3423],{"xmlns":1319,"display":1320},[1322,3424,3425,3476],{},[1325,3426,3427,3429,3431,3433,3435,3437,3440,3442,3444],{},[1328,3428,2529],{},[1328,3430,1097],{},[1328,3432,2814],{},[1328,3434,2814],{},[1328,3436,2820],{},[1328,3438,3439],{},"u",[1328,3441,1097],{},[1332,3443,1334],{},[2533,3445,3446,3448],{},[1869,3447,2327],{},[1325,3449,3450,3453,3455,3457,3459,3462,3465,3467,3470],{},[1332,3451,3247],{"stretchy":3452},"false",[1869,3454,2327],{},[1332,3456,2154],{},[1328,3458,2517],{},[1332,3460,3461],{"stretchy":3452},")",[1332,3463,3464],{},"+",[1328,3466,2517],{},[1328,3468,3469],{"mathvariant":2802},"\u002F",[1431,3471,3472,3474],{},[1328,3473,2529],{},[1328,3475,2857],{},[1345,3477,3478],{"encoding":1347},"Speedup = \\frac{1}{(1-F)+F\u002FS_E}",[1304,3480,3482,3517],{"className":3481,"ariaHidden":1353},[1352],[1304,3483,3485,3489,3492,3495,3499,3502,3505,3508,3511,3514],{"className":3484},[1357],[1304,3486],{"className":3487,"style":3488},[1361],"height:0.8889em;vertical-align:-0.1944em;",[1304,3490,2529],{"className":3491,"style":2588},[1366,1367],[1304,3493,1097],{"className":3494},[1366,1367],[1304,3496,3498],{"className":3497},[1366,1367],"ee",[1304,3500,2820],{"className":3501},[1366,1367],[1304,3503,3439],{"className":3504},[1366,1367],[1304,3506,1097],{"className":3507},[1366,1367],[1304,3509],{"className":3510,"style":1373},[1372],[1304,3512,1334],{"className":3513},[1377],[1304,3515],{"className":3516,"style":1373},[1372],[1304,3518,3520,3524],{"className":3519},[1357],[1304,3521],{"className":3522,"style":3523},[1361],"height:2.2574em;vertical-align:-0.936em;",[1304,3525,3527,3530,3658],{"className":3526},[1366],[1304,3528],{"className":3529},[2611,2612],[1304,3531,3533],{"className":3532},[2533],[1304,3534,3536,3649],{"className":3535},[1502,1503],[1304,3537,3539,3646],{"className":3538},[1507],[1304,3540,3543,3627,3635],{"className":3541,"style":3542},[1511],"height:1.3214em;",[1304,3544,3545,3548],{"style":2628},[1304,3546],{"className":3547,"style":2632},[1519],[1304,3549,3551,3554,3557,3560,3563,3566,3569,3572,3575,3578,3581,3584,3587],{"className":3550},[1366],[1304,3552,3247],{"className":3553},[2611],[1304,3555,2327],{"className":3556},[1366],[1304,3558],{"className":3559,"style":1394},[1372],[1304,3561,2154],{"className":3562},[1398],[1304,3564],{"className":3565,"style":1394},[1372],[1304,3567,2517],{"className":3568,"style":2573},[1366,1367],[1304,3570,3461],{"className":3571},[2749],[1304,3573],{"className":3574,"style":1394},[1372],[1304,3576,3464],{"className":3577},[1398],[1304,3579],{"className":3580,"style":1394},[1372],[1304,3582,2517],{"className":3583,"style":2573},[1366,1367],[1304,3585,3469],{"className":3586},[1366],[1304,3588,3590,3593],{"className":3589},[1366],[1304,3591,2529],{"className":3592,"style":2588},[1366,1367],[1304,3594,3596],{"className":3595},[1498],[1304,3597,3599,3619],{"className":3598},[1502,1503],[1304,3600,3602,3616],{"className":3601},[1507],[1304,3603,3605],{"className":3604,"style":2963},[1511],[1304,3606,3607,3610],{"style":2966},[1304,3608],{"className":3609,"style":1520},[1519],[1304,3611,3613],{"className":3612},[1524,1525,1526,1527],[1304,3614,2857],{"className":3615,"style":2588},[1366,1367,1527],[1304,3617,1540],{"className":3618},[1539],[1304,3620,3622],{"className":3621},[1507],[1304,3623,3625],{"className":3624,"style":1668},[1511],[1304,3626],{},[1304,3628,3629,3632],{"style":2684},[1304,3630],{"className":3631,"style":2632},[1519],[1304,3633],{"className":3634,"style":2692},[2691],[1304,3636,3637,3640],{"style":2695},[1304,3638],{"className":3639,"style":2632},[1519],[1304,3641,3643],{"className":3642},[1366],[1304,3644,2327],{"className":3645},[1366],[1304,3647,1540],{"className":3648},[1539],[1304,3650,3652],{"className":3651},[1507],[1304,3653,3656],{"className":3654,"style":3655},[1511],"height:0.936em;",[1304,3657],{},[1304,3659],{"className":3660},[2749,2612],[1097,3662,3663,3664,3721,3722,3750,3751,3836],{},"理解方式很简单：\n原来程序总时间看作 1。不能加速的部分还是 (",[1304,3665,3667,3687],{"className":3666},[1311],[1304,3668,3670],{"className":3669},[1315],[1317,3671,3672],{"xmlns":1319},[1322,3673,3674,3684],{},[1325,3675,3676,3678,3680,3682],{},[1869,3677,2327],{},[1332,3679,2154],{},[1328,3681,2517],{},[1332,3683,3461],{"stretchy":3452},[1345,3685,3686],{"encoding":1347},"1-F)",[1304,3688,3690,3708],{"className":3689,"ariaHidden":1353},[1352],[1304,3691,3693,3696,3699,3702,3705],{"className":3692},[1357],[1304,3694],{"className":3695,"style":3312},[1361],[1304,3697,2327],{"className":3698},[1366],[1304,3700],{"className":3701,"style":1394},[1372],[1304,3703,2154],{"className":3704},[1398],[1304,3706],{"className":3707,"style":1394},[1372],[1304,3709,3711,3715,3718],{"className":3710},[1357],[1304,3712],{"className":3713,"style":3714},[1361],"height:1em;vertical-align:-0.25em;",[1304,3716,2517],{"className":3717,"style":2573},[1366,1367],[1304,3719,3461],{"className":3720},[2749],"，能加速的部分从 (",[1304,3723,3725,3738],{"className":3724},[1311],[1304,3726,3728],{"className":3727},[1315],[1317,3729,3730],{"xmlns":1319},[1322,3731,3732,3736],{},[1325,3733,3734],{},[1328,3735,2517],{},[1345,3737,2517],{"encoding":1347},[1304,3739,3741],{"className":3740,"ariaHidden":1353},[1352],[1304,3742,3744,3747],{"className":3743},[1357],[1304,3745],{"className":3746,"style":1362},[1361],[1304,3748,2517],{"className":3749,"style":2573},[1366,1367],") 变成 (",[1304,3752,3754,3778],{"className":3753},[1311],[1304,3755,3757],{"className":3756},[1315],[1317,3758,3759],{"xmlns":1319},[1322,3760,3761,3775],{},[1325,3762,3763,3765,3767,3773],{},[1328,3764,2517],{},[1328,3766,3469],{"mathvariant":2802},[1431,3768,3769,3771],{},[1328,3770,2529],{},[1328,3772,2857],{},[1332,3774,3461],{"stretchy":3452},[1345,3776,3777],{"encoding":1347},"F\u002FS_E)",[1304,3779,3781],{"className":3780,"ariaHidden":1353},[1352],[1304,3782,3784,3787,3790,3793,3833],{"className":3783},[1357],[1304,3785],{"className":3786,"style":3714},[1361],[1304,3788,2517],{"className":3789,"style":2573},[1366,1367],[1304,3791,3469],{"className":3792},[1366],[1304,3794,3796,3799],{"className":3795},[1366],[1304,3797,2529],{"className":3798,"style":2588},[1366,1367],[1304,3800,3802],{"className":3801},[1498],[1304,3803,3805,3825],{"className":3804},[1502,1503],[1304,3806,3808,3822],{"className":3807},[1507],[1304,3809,3811],{"className":3810,"style":2963},[1511],[1304,3812,3813,3816],{"style":2966},[1304,3814],{"className":3815,"style":1520},[1519],[1304,3817,3819],{"className":3818},[1524,1525,1526,1527],[1304,3820,2857],{"className":3821,"style":2588},[1366,1367,1527],[1304,3823,1540],{"className":3824},[1539],[1304,3826,3828],{"className":3827},[1507],[1304,3829,3831],{"className":3830,"style":1668},[1511],[1304,3832],{},[1304,3834,3461],{"className":3835},[2749],"。所以新时间是：",[1304,3838,3840],{"className":3839},[1307],[1304,3841,3843,3877],{"className":3842},[1311],[1304,3844,3846],{"className":3845},[1315],[1317,3847,3848],{"xmlns":1319,"display":1320},[1322,3849,3850,3874],{},[1325,3851,3852,3854,3856,3858,3860,3862,3864,3866,3868],{},[1332,3853,3247],{"stretchy":3452},[1869,3855,2327],{},[1332,3857,2154],{},[1328,3859,2517],{},[1332,3861,3461],{"stretchy":3452},[1332,3863,3464],{},[1328,3865,2517],{},[1328,3867,3469],{"mathvariant":2802},[1431,3869,3870,3872],{},[1328,3871,2529],{},[1328,3873,2857],{},[1345,3875,3876],{"encoding":1347},"(1-F)+F\u002FS_E",[1304,3878,3880,3901,3922],{"className":3879,"ariaHidden":1353},[1352],[1304,3881,3883,3886,3889,3892,3895,3898],{"className":3882},[1357],[1304,3884],{"className":3885,"style":3714},[1361],[1304,3887,3247],{"className":3888},[2611],[1304,3890,2327],{"className":3891},[1366],[1304,3893],{"className":3894,"style":1394},[1372],[1304,3896,2154],{"className":3897},[1398],[1304,3899],{"className":3900,"style":1394},[1372],[1304,3902,3904,3907,3910,3913,3916,3919],{"className":3903},[1357],[1304,3905],{"className":3906,"style":3714},[1361],[1304,3908,2517],{"className":3909,"style":2573},[1366,1367],[1304,3911,3461],{"className":3912},[2749],[1304,3914],{"className":3915,"style":1394},[1372],[1304,3917,3464],{"className":3918},[1398],[1304,3920],{"className":3921,"style":1394},[1372],[1304,3923,3925,3928,3931,3934],{"className":3924},[1357],[1304,3926],{"className":3927,"style":3714},[1361],[1304,3929,2517],{"className":3930,"style":2573},[1366,1367],[1304,3932,3469],{"className":3933},[1366],[1304,3935,3937,3940],{"className":3936},[1366],[1304,3938,2529],{"className":3939,"style":2588},[1366,1367],[1304,3941,3943],{"className":3942},[1498],[1304,3944,3946,3966],{"className":3945},[1502,1503],[1304,3947,3949,3963],{"className":3948},[1507],[1304,3950,3952],{"className":3951,"style":2963},[1511],[1304,3953,3954,3957],{"style":2966},[1304,3955],{"className":3956,"style":1520},[1519],[1304,3958,3960],{"className":3959},[1524,1525,1526,1527],[1304,3961,2857],{"className":3962,"style":2588},[1366,1367,1527],[1304,3964,1540],{"className":3965},[1539],[1304,3967,3969],{"className":3968},[1507],[1304,3970,3972],{"className":3971,"style":1668},[1511],[1304,3973],{},[1097,3975,3976],{},"加速比就是：",[1304,3978,3980],{"className":3979},[1307],[1304,3981,3983,4004],{"className":3982},[1311],[1304,3984,3986],{"className":3985},[1315],[1317,3987,3988],{"xmlns":1319,"display":1320},[1322,3989,3990,4001],{},[1325,3991,3992],{},[2533,3993,3994,3998],{},[3995,3996,3997],"mtext",{},"原时间",[3995,3999,4000],{},"新时间",[1345,4002,4003],{"encoding":1347},"\\frac{原时间}{新时间}",[1304,4005,4007],{"className":4006,"ariaHidden":1353},[1352],[1304,4008,4010,4014],{"className":4009},[1357],[1304,4011],{"className":4012,"style":4013},[1361],"height:2.0463em;vertical-align:-0.686em;",[1304,4015,4017,4020,4076],{"className":4016},[1366],[1304,4018],{"className":4019},[2611,2612],[1304,4021,4023],{"className":4022},[2533],[1304,4024,4026,4067],{"className":4025},[1502,1503],[1304,4027,4029,4064],{"className":4028},[1507],[1304,4030,4033,4045,4053],{"className":4031,"style":4032},[1511],"height:1.3603em;",[1304,4034,4035,4038],{"style":2628},[1304,4036],{"className":4037,"style":2632},[1519],[1304,4039,4041],{"className":4040},[1366],[1304,4042,4000],{"className":4043},[1366,4044],"cjk_fallback",[1304,4046,4047,4050],{"style":2684},[1304,4048],{"className":4049,"style":2632},[1519],[1304,4051],{"className":4052,"style":2692},[2691],[1304,4054,4055,4058],{"style":2695},[1304,4056],{"className":4057,"style":2632},[1519],[1304,4059,4061],{"className":4060},[1366],[1304,4062,3997],{"className":4063},[1366,4044],[1304,4065,1540],{"className":4066},[1539],[1304,4068,4070],{"className":4069},[1507],[1304,4071,4074],{"className":4072,"style":4073},[1511],"height:0.686em;",[1304,4075],{},[1304,4077],{"className":4078},[2749,2612],[1097,4080,4081],{},"也就是上面的公式。",[978,4083,4085],{"id":4084},"第-17-页例题必须会","第 17 页：例题，必须会",[1097,4087,4088],{},"题目：程序一半时间可以加快 2 倍，整体加速多少？",[1097,4090,4091],{},"这里：",[1304,4093,4095],{"className":4094},[1307],[1304,4096,4098,4133],{"className":4097},[1311],[1304,4099,4101],{"className":4100},[1315],[1317,4102,4103],{"xmlns":1319,"display":1320},[1322,4104,4105,4130],{},[1325,4106,4107,4109,4111,4114,4117,4120,4126,4128],{},[1328,4108,2517],{},[1332,4110,1334],{},[1869,4112,4113],{},"0.5",[1332,4115,4116],{"separator":1353},",",[1372,4118],{"width":4119},"1em",[1431,4121,4122,4124],{},[1328,4123,2529],{},[1328,4125,2857],{},[1332,4127,1334],{},[1869,4129,1871],{},[1345,4131,4132],{"encoding":1347},"F=0.5,\\quad S_E=2",[1304,4134,4136,4154,4224],{"className":4135,"ariaHidden":1353},[1352],[1304,4137,4139,4142,4145,4148,4151],{"className":4138},[1357],[1304,4140],{"className":4141,"style":1362},[1361],[1304,4143,2517],{"className":4144,"style":2573},[1366,1367],[1304,4146],{"className":4147,"style":1373},[1372],[1304,4149,1334],{"className":4150},[1377],[1304,4152],{"className":4153,"style":1373},[1372],[1304,4155,4157,4161,4164,4168,4172,4175,4215,4218,4221],{"className":4156},[1357],[1304,4158],{"className":4159,"style":4160},[1361],"height:0.8778em;vertical-align:-0.1944em;",[1304,4162,4113],{"className":4163},[1366],[1304,4165,4116],{"className":4166},[4167],"mpunct",[1304,4169],{"className":4170,"style":4171},[1372],"margin-right:1em;",[1304,4173],{"className":4174,"style":1623},[1372],[1304,4176,4178,4181],{"className":4177},[1366],[1304,4179,2529],{"className":4180,"style":2588},[1366,1367],[1304,4182,4184],{"className":4183},[1498],[1304,4185,4187,4207],{"className":4186},[1502,1503],[1304,4188,4190,4204],{"className":4189},[1507],[1304,4191,4193],{"className":4192,"style":2963},[1511],[1304,4194,4195,4198],{"style":2966},[1304,4196],{"className":4197,"style":1520},[1519],[1304,4199,4201],{"className":4200},[1524,1525,1526,1527],[1304,4202,2857],{"className":4203,"style":2588},[1366,1367,1527],[1304,4205,1540],{"className":4206},[1539],[1304,4208,4210],{"className":4209},[1507],[1304,4211,4213],{"className":4212,"style":1668},[1511],[1304,4214],{},[1304,4216],{"className":4217,"style":1373},[1372],[1304,4219,1334],{"className":4220},[1377],[1304,4222],{"className":4223,"style":1373},[1372],[1304,4225,4227,4231],{"className":4226},[1357],[1304,4228],{"className":4229,"style":4230},[1361],"height:0.6444em;",[1304,4232,1871],{"className":4233},[1366],[1097,4235,4236],{},"代入：",[1304,4238,4240],{"className":4239},[1307],[1304,4241,4243,4295],{"className":4242},[1311],[1304,4244,4246],{"className":4245},[1315],[1317,4247,4248],{"xmlns":1319,"display":1320},[1322,4249,4250,4292],{},[1325,4251,4252,4254,4256,4258,4260,4262,4264,4266,4268],{},[1328,4253,2529],{},[1328,4255,1097],{},[1328,4257,2814],{},[1328,4259,2814],{},[1328,4261,2820],{},[1328,4263,3439],{},[1328,4265,1097],{},[1332,4267,1334],{},[2533,4269,4270,4272],{},[1869,4271,2327],{},[1325,4273,4274,4276,4278,4280,4282,4284,4286,4288,4290],{},[1332,4275,3247],{"stretchy":3452},[1869,4277,2327],{},[1332,4279,2154],{},[1869,4281,4113],{},[1332,4283,3461],{"stretchy":3452},[1332,4285,3464],{},[1869,4287,4113],{},[1328,4289,3469],{"mathvariant":2802},[1869,4291,1871],{},[1345,4293,4294],{"encoding":1347},"Speedup = \\frac{1}{(1-0.5)+0.5\u002F2}",[1304,4296,4298,4331],{"className":4297,"ariaHidden":1353},[1352],[1304,4299,4301,4304,4307,4310,4313,4316,4319,4322,4325,4328],{"className":4300},[1357],[1304,4302],{"className":4303,"style":3488},[1361],[1304,4305,2529],{"className":4306,"style":2588},[1366,1367],[1304,4308,1097],{"className":4309},[1366,1367],[1304,4311,3498],{"className":4312},[1366,1367],[1304,4314,2820],{"className":4315},[1366,1367],[1304,4317,3439],{"className":4318},[1366,1367],[1304,4320,1097],{"className":4321},[1366,1367],[1304,4323],{"className":4324,"style":1373},[1372],[1304,4326,1334],{"className":4327},[1377],[1304,4329],{"className":4330,"style":1373},[1372],[1304,4332,4334,4337],{"className":4333},[1357],[1304,4335],{"className":4336,"style":3523},[1361],[1304,4338,4340,4343,4427],{"className":4339},[1366],[1304,4341],{"className":4342},[2611,2612],[1304,4344,4346],{"className":4345},[2533],[1304,4347,4349,4419],{"className":4348},[1502,1503],[1304,4350,4352,4416],{"className":4351},[1507],[1304,4353,4355,4397,4405],{"className":4354,"style":3542},[1511],[1304,4356,4357,4360],{"style":2628},[1304,4358],{"className":4359,"style":2632},[1519],[1304,4361,4363,4366,4369,4372,4375,4378,4381,4384,4387,4390,4393],{"className":4362},[1366],[1304,4364,3247],{"className":4365},[2611],[1304,4367,2327],{"className":4368},[1366],[1304,4370],{"className":4371,"style":1394},[1372],[1304,4373,2154],{"className":4374},[1398],[1304,4376],{"className":4377,"style":1394},[1372],[1304,4379,4113],{"className":4380},[1366],[1304,4382,3461],{"className":4383},[2749],[1304,4385],{"className":4386,"style":1394},[1372],[1304,4388,3464],{"className":4389},[1398],[1304,4391],{"className":4392,"style":1394},[1372],[1304,4394,4396],{"className":4395},[1366],"0.5\u002F2",[1304,4398,4399,4402],{"style":2684},[1304,4400],{"className":4401,"style":2632},[1519],[1304,4403],{"className":4404,"style":2692},[2691],[1304,4406,4407,4410],{"style":2695},[1304,4408],{"className":4409,"style":2632},[1519],[1304,4411,4413],{"className":4412},[1366],[1304,4414,2327],{"className":4415},[1366],[1304,4417,1540],{"className":4418},[1539],[1304,4420,4422],{"className":4421},[1507],[1304,4423,4425],{"className":4424,"style":3655},[1511],[1304,4426],{},[1304,4428],{"className":4429},[2749,2612],[1304,4431,4433],{"className":4432},[1307],[1304,4434,4436,4463],{"className":4435},[1311],[1304,4437,4439],{"className":4438},[1315],[1317,4440,4441],{"xmlns":1319,"display":1320},[1322,4442,4443,4460],{},[1325,4444,4445,4447],{},[1332,4446,1334],{},[2533,4448,4449,4451],{},[1869,4450,2327],{},[1325,4452,4453,4455,4457],{},[1869,4454,4113],{},[1332,4456,3464],{},[1869,4458,4459],{},"0.25",[1345,4461,4462],{"encoding":1347},"= \\frac{1}{0.5+0.25}",[1304,4464,4466,4479],{"className":4465,"ariaHidden":1353},[1352],[1304,4467,4469,4473,4476],{"className":4468},[1357],[1304,4470],{"className":4471,"style":4472},[1361],"height:0.3669em;",[1304,4474,1334],{"className":4475},[1377],[1304,4477],{"className":4478,"style":1373},[1372],[1304,4480,4482,4486],{"className":4481},[1357],[1304,4483],{"className":4484,"style":4485},[1361],"height:2.0908em;vertical-align:-0.7693em;",[1304,4487,4489,4492,4557],{"className":4488},[1366],[1304,4490],{"className":4491},[2611,2612],[1304,4493,4495],{"className":4494},[2533],[1304,4496,4498,4549],{"className":4497},[1502,1503],[1304,4499,4501,4546],{"className":4500},[1507],[1304,4502,4504,4527,4535],{"className":4503,"style":3542},[1511],[1304,4505,4506,4509],{"style":2628},[1304,4507],{"className":4508,"style":2632},[1519],[1304,4510,4512,4515,4518,4521,4524],{"className":4511},[1366],[1304,4513,4113],{"className":4514},[1366],[1304,4516],{"className":4517,"style":1394},[1372],[1304,4519,3464],{"className":4520},[1398],[1304,4522],{"className":4523,"style":1394},[1372],[1304,4525,4459],{"className":4526},[1366],[1304,4528,4529,4532],{"style":2684},[1304,4530],{"className":4531,"style":2632},[1519],[1304,4533],{"className":4534,"style":2692},[2691],[1304,4536,4537,4540],{"style":2695},[1304,4538],{"className":4539,"style":2632},[1519],[1304,4541,4543],{"className":4542},[1366],[1304,4544,2327],{"className":4545},[1366],[1304,4547,1540],{"className":4548},[1539],[1304,4550,4552],{"className":4551},[1507],[1304,4553,4555],{"className":4554,"style":2743},[1511],[1304,4556],{},[1304,4558],{"className":4559},[2749,2612],[1304,4561,4563],{"className":4562},[1307],[1304,4564,4566,4587],{"className":4565},[1311],[1304,4567,4569],{"className":4568},[1315],[1317,4570,4571],{"xmlns":1319,"display":1320},[1322,4572,4573,4584],{},[1325,4574,4575,4577],{},[1332,4576,1334],{},[2533,4578,4579,4581],{},[1869,4580,2327],{},[1869,4582,4583],{},"0.75",[1345,4585,4586],{"encoding":1347},"= \\frac{1}{0.75}",[1304,4588,4590,4602],{"className":4589,"ariaHidden":1353},[1352],[1304,4591,4593,4596,4599],{"className":4592},[1357],[1304,4594],{"className":4595,"style":4472},[1361],[1304,4597,1334],{"className":4598},[1377],[1304,4600],{"className":4601,"style":1373},[1372],[1304,4603,4605,4609],{"className":4604},[1357],[1304,4606],{"className":4607,"style":4608},[1361],"height:2.0074em;vertical-align:-0.686em;",[1304,4610,4612,4615,4668],{"className":4611},[1366],[1304,4613],{"className":4614},[2611,2612],[1304,4616,4618],{"className":4617},[2533],[1304,4619,4621,4660],{"className":4620},[1502,1503],[1304,4622,4624,4657],{"className":4623},[1507],[1304,4625,4627,4638,4646],{"className":4626,"style":3542},[1511],[1304,4628,4629,4632],{"style":2628},[1304,4630],{"className":4631,"style":2632},[1519],[1304,4633,4635],{"className":4634},[1366],[1304,4636,4583],{"className":4637},[1366],[1304,4639,4640,4643],{"style":2684},[1304,4641],{"className":4642,"style":2632},[1519],[1304,4644],{"className":4645,"style":2692},[2691],[1304,4647,4648,4651],{"style":2695},[1304,4649],{"className":4650,"style":2632},[1519],[1304,4652,4654],{"className":4653},[1366],[1304,4655,2327],{"className":4656},[1366],[1304,4658,1540],{"className":4659},[1539],[1304,4661,4663],{"className":4662},[1507],[1304,4664,4666],{"className":4665,"style":4073},[1511],[1304,4667],{},[1304,4669],{"className":4670},[2749,2612],[1304,4672,4674],{"className":4673},[1307],[1304,4675,4677,4694],{"className":4676},[1311],[1304,4678,4680],{"className":4679},[1315],[1317,4681,4682],{"xmlns":1319,"display":1320},[1322,4683,4684,4691],{},[1325,4685,4686,4688],{},[1332,4687,1334],{},[1869,4689,4690],{},"1.33",[1345,4692,4693],{"encoding":1347},"= 1.33",[1304,4695,4697,4709],{"className":4696,"ariaHidden":1353},[1352],[1304,4698,4700,4703,4706],{"className":4699},[1357],[1304,4701],{"className":4702,"style":4472},[1361],[1304,4704,1334],{"className":4705},[1377],[1304,4707],{"className":4708,"style":1373},[1372],[1304,4710,4712,4715],{"className":4711},[1357],[1304,4713],{"className":4714,"style":4230},[1361],[1304,4716,4690],{"className":4717},[1366],[1097,4719,4720,4721,4724],{},"所以整体只加速 ",[1104,4722,4723],{},"1.33 倍","，不是 2 倍。",[1097,4726,4727,4728],{},"这就是 Amdahl 定律最想告诉你的事：\n",[1104,4729,4730],{},"局部优化很猛，不代表整体加速也很猛。不能加速的部分会拖后腿。",[978,4732,4734],{"id":4733},"第-1819-页最大可达到加速超级重要","第 18–19 页：最大可达到加速，超级重要",[1097,4736,4737],{},"如果可加速部分的加速倍数趋近无穷大：",[1304,4739,4741],{"className":4740},[1307],[1304,4742,4744,4768],{"className":4743},[1311],[1304,4745,4747],{"className":4746},[1315],[1317,4748,4749],{"xmlns":1319,"display":1320},[1322,4750,4751,4765],{},[1325,4752,4753,4759,4762],{},[1431,4754,4755,4757],{},[1328,4756,2529],{},[1328,4758,2857],{},[1332,4760,4761],{},"→",[1328,4763,4764],{"mathvariant":2802},"∞",[1345,4766,4767],{"encoding":1347},"S_E \\to \\infty",[1304,4769,4771,4826],{"className":4770,"ariaHidden":1353},[1352],[1304,4772,4774,4777,4817,4820,4823],{"className":4773},[1357],[1304,4775],{"className":4776,"style":3367},[1361],[1304,4778,4780,4783],{"className":4779},[1366],[1304,4781,2529],{"className":4782,"style":2588},[1366,1367],[1304,4784,4786],{"className":4785},[1498],[1304,4787,4789,4809],{"className":4788},[1502,1503],[1304,4790,4792,4806],{"className":4791},[1507],[1304,4793,4795],{"className":4794,"style":2963},[1511],[1304,4796,4797,4800],{"style":2966},[1304,4798],{"className":4799,"style":1520},[1519],[1304,4801,4803],{"className":4802},[1524,1525,1526,1527],[1304,4804,2857],{"className":4805,"style":2588},[1366,1367,1527],[1304,4807,1540],{"className":4808},[1539],[1304,4810,4812],{"className":4811},[1507],[1304,4813,4815],{"className":4814,"style":1668},[1511],[1304,4816],{},[1304,4818],{"className":4819,"style":1373},[1372],[1304,4821,4761],{"className":4822},[1377],[1304,4824],{"className":4825,"style":1373},[1372],[1304,4827,4829,4833],{"className":4828},[1357],[1304,4830],{"className":4831,"style":4832},[1361],"height:0.4306em;",[1304,4834,4764],{"className":4835},[1366],[1097,4837,4838],{},"那么：",[1304,4840,4842],{"className":4841},[1307],[1304,4843,4845,4871],{"className":4844},[1311],[1304,4846,4848],{"className":4847},[1315],[1317,4849,4850],{"xmlns":1319,"display":1320},[1322,4851,4852,4868],{},[1325,4853,4854,4856,4858,4864,4866],{},[1328,4855,2517],{},[1328,4857,3469],{"mathvariant":2802},[1431,4859,4860,4862],{},[1328,4861,2529],{},[1328,4863,2857],{},[1332,4865,4761],{},[1869,4867,2334],{},[1345,4869,4870],{"encoding":1347},"F\u002FS_E \\to 0",[1304,4872,4874,4935],{"className":4873,"ariaHidden":1353},[1352],[1304,4875,4877,4880,4883,4886,4926,4929,4932],{"className":4876},[1357],[1304,4878],{"className":4879,"style":3714},[1361],[1304,4881,2517],{"className":4882,"style":2573},[1366,1367],[1304,4884,3469],{"className":4885},[1366],[1304,4887,4889,4892],{"className":4888},[1366],[1304,4890,2529],{"className":4891,"style":2588},[1366,1367],[1304,4893,4895],{"className":4894},[1498],[1304,4896,4898,4918],{"className":4897},[1502,1503],[1304,4899,4901,4915],{"className":4900},[1507],[1304,4902,4904],{"className":4903,"style":2963},[1511],[1304,4905,4906,4909],{"style":2966},[1304,4907],{"className":4908,"style":1520},[1519],[1304,4910,4912],{"className":4911},[1524,1525,1526,1527],[1304,4913,2857],{"className":4914,"style":2588},[1366,1367,1527],[1304,4916,1540],{"className":4917},[1539],[1304,4919,4921],{"className":4920},[1507],[1304,4922,4924],{"className":4923,"style":1668},[1511],[1304,4925],{},[1304,4927],{"className":4928,"style":1373},[1372],[1304,4930,4761],{"className":4931},[1377],[1304,4933],{"className":4934,"style":1373},[1372],[1304,4936,4938,4941],{"className":4937},[1357],[1304,4939],{"className":4940,"style":4230},[1361],[1304,4942,2334],{"className":4943},[1366],[1097,4945,4946],{},"所以最大加速比是：",[1304,4948,4950],{"className":4949},[1307],[1304,4951,4953,4993],{"className":4952},[1311],[1304,4954,4956],{"className":4955},[1315],[1317,4957,4958],{"xmlns":1319,"display":1320},[1322,4959,4960,4990],{},[1325,4961,4962,4976,4978],{},[1431,4963,4964,4966],{},[1328,4965,2529],{},[1325,4967,4968,4971,4973],{},[1328,4969,4970],{},"m",[1328,4972,2830],{},[1328,4974,4975],{},"x",[1332,4977,1334],{},[2533,4979,4980,4982],{},[1869,4981,2327],{},[1325,4983,4984,4986,4988],{},[1869,4985,2327],{},[1332,4987,2154],{},[1328,4989,2517],{},[1345,4991,4992],{"encoding":1347},"S_{max} = \\frac{1}{1-F}",[1304,4994,4996,5059],{"className":4995,"ariaHidden":1353},[1352],[1304,4997,4999,5002,5050,5053,5056],{"className":4998},[1357],[1304,5000],{"className":5001,"style":3367},[1361],[1304,5003,5005,5008],{"className":5004},[1366],[1304,5006,2529],{"className":5007,"style":2588},[1366,1367],[1304,5009,5011],{"className":5010},[1498],[1304,5012,5014,5042],{"className":5013},[1502,1503],[1304,5015,5017,5039],{"className":5016},[1507],[1304,5018,5021],{"className":5019,"style":5020},[1511],"height:0.1514em;",[1304,5022,5023,5026],{"style":2966},[1304,5024],{"className":5025,"style":1520},[1519],[1304,5027,5029],{"className":5028},[1524,1525,1526,1527],[1304,5030,5032,5036],{"className":5031},[1366,1527],[1304,5033,5035],{"className":5034},[1366,1367,1527],"ma",[1304,5037,4975],{"className":5038},[1366,1367,1527],[1304,5040,1540],{"className":5041},[1539],[1304,5043,5045],{"className":5044},[1507],[1304,5046,5048],{"className":5047,"style":1668},[1511],[1304,5049],{},[1304,5051],{"className":5052,"style":1373},[1372],[1304,5054,1334],{"className":5055},[1377],[1304,5057],{"className":5058,"style":1373},[1372],[1304,5060,5062,5065],{"className":5061},[1357],[1304,5063],{"className":5064,"style":4485},[1361],[1304,5066,5068,5071,5136],{"className":5067},[1366],[1304,5069],{"className":5070},[2611,2612],[1304,5072,5074],{"className":5073},[2533],[1304,5075,5077,5128],{"className":5076},[1502,1503],[1304,5078,5080,5125],{"className":5079},[1507],[1304,5081,5083,5106,5114],{"className":5082,"style":3542},[1511],[1304,5084,5085,5088],{"style":2628},[1304,5086],{"className":5087,"style":2632},[1519],[1304,5089,5091,5094,5097,5100,5103],{"className":5090},[1366],[1304,5092,2327],{"className":5093},[1366],[1304,5095],{"className":5096,"style":1394},[1372],[1304,5098,2154],{"className":5099},[1398],[1304,5101],{"className":5102,"style":1394},[1372],[1304,5104,2517],{"className":5105,"style":2573},[1366,1367],[1304,5107,5108,5111],{"style":2684},[1304,5109],{"className":5110,"style":2632},[1519],[1304,5112],{"className":5113,"style":2692},[2691],[1304,5115,5116,5119],{"style":2695},[1304,5117],{"className":5118,"style":2632},[1519],[1304,5120,5122],{"className":5121},[1366],[1304,5123,2327],{"className":5124},[1366],[1304,5126,1540],{"className":5127},[1539],[1304,5129,5131],{"className":5130},[1507],[1304,5132,5134],{"className":5133,"style":2743},[1511],[1304,5135],{},[1304,5137],{"className":5138},[2749,2612],[1097,5140,5141],{},"课件例子：如果 (F=0.95)，也就是 95% 的程序可以并行化，那么：",[1304,5143,5145],{"className":5144},[1307],[1304,5146,5148,5192],{"className":5147},[1311],[1304,5149,5151],{"className":5150},[1315],[1317,5152,5153],{"xmlns":1319,"display":1320},[1322,5154,5155,5189],{},[1325,5156,5157,5169,5171,5184,5186],{},[1431,5158,5159,5161],{},[1328,5160,2529],{},[1325,5162,5163,5165,5167],{},[1328,5164,4970],{},[1328,5166,2830],{},[1328,5168,4975],{},[1332,5170,1334],{},[2533,5172,5173,5175],{},[1869,5174,2327],{},[1325,5176,5177,5179,5181],{},[1869,5178,2327],{},[1332,5180,2154],{},[1869,5182,5183],{},"0.95",[1332,5185,1334],{},[1869,5187,5188],{},"20",[1345,5190,5191],{"encoding":1347},"S_{max} = \\frac{1}{1-0.95} = 20",[1304,5193,5195,5256,5345],{"className":5194,"ariaHidden":1353},[1352],[1304,5196,5198,5201,5247,5250,5253],{"className":5197},[1357],[1304,5199],{"className":5200,"style":3367},[1361],[1304,5202,5204,5207],{"className":5203},[1366],[1304,5205,2529],{"className":5206,"style":2588},[1366,1367],[1304,5208,5210],{"className":5209},[1498],[1304,5211,5213,5239],{"className":5212},[1502,1503],[1304,5214,5216,5236],{"className":5215},[1507],[1304,5217,5219],{"className":5218,"style":5020},[1511],[1304,5220,5221,5224],{"style":2966},[1304,5222],{"className":5223,"style":1520},[1519],[1304,5225,5227],{"className":5226},[1524,1525,1526,1527],[1304,5228,5230,5233],{"className":5229},[1366,1527],[1304,5231,5035],{"className":5232},[1366,1367,1527],[1304,5234,4975],{"className":5235},[1366,1367,1527],[1304,5237,1540],{"className":5238},[1539],[1304,5240,5242],{"className":5241},[1507],[1304,5243,5245],{"className":5244,"style":1668},[1511],[1304,5246],{},[1304,5248],{"className":5249,"style":1373},[1372],[1304,5251,1334],{"className":5252},[1377],[1304,5254],{"className":5255,"style":1373},[1372],[1304,5257,5259,5262,5336,5339,5342],{"className":5258},[1357],[1304,5260],{"className":5261,"style":4485},[1361],[1304,5263,5265,5268,5333],{"className":5264},[1366],[1304,5266],{"className":5267},[2611,2612],[1304,5269,5271],{"className":5270},[2533],[1304,5272,5274,5325],{"className":5273},[1502,1503],[1304,5275,5277,5322],{"className":5276},[1507],[1304,5278,5280,5303,5311],{"className":5279,"style":3542},[1511],[1304,5281,5282,5285],{"style":2628},[1304,5283],{"className":5284,"style":2632},[1519],[1304,5286,5288,5291,5294,5297,5300],{"className":5287},[1366],[1304,5289,2327],{"className":5290},[1366],[1304,5292],{"className":5293,"style":1394},[1372],[1304,5295,2154],{"className":5296},[1398],[1304,5298],{"className":5299,"style":1394},[1372],[1304,5301,5183],{"className":5302},[1366],[1304,5304,5305,5308],{"style":2684},[1304,5306],{"className":5307,"style":2632},[1519],[1304,5309],{"className":5310,"style":2692},[2691],[1304,5312,5313,5316],{"style":2695},[1304,5314],{"className":5315,"style":2632},[1519],[1304,5317,5319],{"className":5318},[1366],[1304,5320,2327],{"className":5321},[1366],[1304,5323,1540],{"className":5324},[1539],[1304,5326,5328],{"className":5327},[1507],[1304,5329,5331],{"className":5330,"style":2743},[1511],[1304,5332],{},[1304,5334],{"className":5335},[2749,2612],[1304,5337],{"className":5338,"style":1373},[1372],[1304,5340,1334],{"className":5341},[1377],[1304,5343],{"className":5344,"style":1373},[1372],[1304,5346,5348,5351],{"className":5347},[1357],[1304,5349],{"className":5350,"style":4230},[1361],[1304,5352,5188],{"className":5353},[1366],[1097,5355,5356],{},"注意：这已经是假设可并行部分无限快了，现实中不可能真的无限快。所以 20 倍是理论上限。",[1097,5358,5359],{},"课件还给了一个工程妥协：让顺序部分时间和并行部分时间相等：",[1304,5361,5363],{"className":5362},[1307],[1304,5364,5366,5396],{"className":5365},[1311],[1304,5367,5369],{"className":5368},[1315],[1317,5370,5371],{"xmlns":1319,"display":1320},[1322,5372,5373,5393],{},[1325,5374,5375,5377,5379,5381,5383,5385,5387],{},[1869,5376,2327],{},[1332,5378,2154],{},[1328,5380,2517],{},[1332,5382,1334],{},[1328,5384,2517],{},[1328,5386,3469],{"mathvariant":2802},[1431,5388,5389,5391],{},[1328,5390,2529],{},[1328,5392,2857],{},[1345,5394,5395],{"encoding":1347},"1-F = F\u002FS_E",[1304,5397,5399,5417,5435],{"className":5398,"ariaHidden":1353},[1352],[1304,5400,5402,5405,5408,5411,5414],{"className":5401},[1357],[1304,5403],{"className":5404,"style":3312},[1361],[1304,5406,2327],{"className":5407},[1366],[1304,5409],{"className":5410,"style":1394},[1372],[1304,5412,2154],{"className":5413},[1398],[1304,5415],{"className":5416,"style":1394},[1372],[1304,5418,5420,5423,5426,5429,5432],{"className":5419},[1357],[1304,5421],{"className":5422,"style":1362},[1361],[1304,5424,2517],{"className":5425,"style":2573},[1366,1367],[1304,5427],{"className":5428,"style":1373},[1372],[1304,5430,1334],{"className":5431},[1377],[1304,5433],{"className":5434,"style":1373},[1372],[1304,5436,5438,5441,5444,5447],{"className":5437},[1357],[1304,5439],{"className":5440,"style":3714},[1361],[1304,5442,2517],{"className":5443,"style":2573},[1366,1367],[1304,5445,3469],{"className":5446},[1366],[1304,5448,5450,5453],{"className":5449},[1366],[1304,5451,2529],{"className":5452,"style":2588},[1366,1367],[1304,5454,5456],{"className":5455},[1498],[1304,5457,5459,5479],{"className":5458},[1502,1503],[1304,5460,5462,5476],{"className":5461},[1507],[1304,5463,5465],{"className":5464,"style":2963},[1511],[1304,5466,5467,5470],{"style":2966},[1304,5468],{"className":5469,"style":1520},[1519],[1304,5471,5473],{"className":5472},[1524,1525,1526,1527],[1304,5474,2857],{"className":5475,"style":2588},[1366,1367,1527],[1304,5477,1540],{"className":5478},[1539],[1304,5480,5482],{"className":5481},[1507],[1304,5483,5485],{"className":5484,"style":1668},[1511],[1304,5486],{},[1097,5488,5489],{},"所以：",[1304,5491,5493],{"className":5492},[1307],[1304,5494,5496,5528],{"className":5495},[1311],[1304,5497,5499],{"className":5498},[1315],[1317,5500,5501],{"xmlns":1319,"display":1320},[1322,5502,5503,5525],{},[1325,5504,5505,5511,5513],{},[1431,5506,5507,5509],{},[1328,5508,2529],{},[1328,5510,2857],{},[1332,5512,1334],{},[2533,5514,5515,5517],{},[1328,5516,2517],{},[1325,5518,5519,5521,5523],{},[1869,5520,2327],{},[1332,5522,2154],{},[1328,5524,2517],{},[1345,5526,5527],{"encoding":1347},"S_E = \\frac{F}{1-F}",[1304,5529,5531,5586],{"className":5530,"ariaHidden":1353},[1352],[1304,5532,5534,5537,5577,5580,5583],{"className":5533},[1357],[1304,5535],{"className":5536,"style":3367},[1361],[1304,5538,5540,5543],{"className":5539},[1366],[1304,5541,2529],{"className":5542,"style":2588},[1366,1367],[1304,5544,5546],{"className":5545},[1498],[1304,5547,5549,5569],{"className":5548},[1502,1503],[1304,5550,5552,5566],{"className":5551},[1507],[1304,5553,5555],{"className":5554,"style":2963},[1511],[1304,5556,5557,5560],{"style":2966},[1304,5558],{"className":5559,"style":1520},[1519],[1304,5561,5563],{"className":5562},[1524,1525,1526,1527],[1304,5564,2857],{"className":5565,"style":2588},[1366,1367,1527],[1304,5567,1540],{"className":5568},[1539],[1304,5570,5572],{"className":5571},[1507],[1304,5573,5575],{"className":5574,"style":1668},[1511],[1304,5576],{},[1304,5578],{"className":5579,"style":1373},[1372],[1304,5581,1334],{"className":5582},[1377],[1304,5584],{"className":5585,"style":1373},[1372],[1304,5587,5589,5593],{"className":5588},[1357],[1304,5590],{"className":5591,"style":5592},[1361],"height:2.1297em;vertical-align:-0.7693em;",[1304,5594,5596,5599,5664],{"className":5595},[1366],[1304,5597],{"className":5598},[2611,2612],[1304,5600,5602],{"className":5601},[2533],[1304,5603,5605,5656],{"className":5604},[1502,1503],[1304,5606,5608,5653],{"className":5607},[1507],[1304,5609,5611,5634,5642],{"className":5610,"style":4032},[1511],[1304,5612,5613,5616],{"style":2628},[1304,5614],{"className":5615,"style":2632},[1519],[1304,5617,5619,5622,5625,5628,5631],{"className":5618},[1366],[1304,5620,2327],{"className":5621},[1366],[1304,5623],{"className":5624,"style":1394},[1372],[1304,5626,2154],{"className":5627},[1398],[1304,5629],{"className":5630,"style":1394},[1372],[1304,5632,2517],{"className":5633,"style":2573},[1366,1367],[1304,5635,5636,5639],{"style":2684},[1304,5637],{"className":5638,"style":2632},[1519],[1304,5640],{"className":5641,"style":2692},[2691],[1304,5643,5644,5647],{"style":2695},[1304,5645],{"className":5646,"style":2632},[1519],[1304,5648,5650],{"className":5649},[1366],[1304,5651,2517],{"className":5652,"style":2573},[1366,1367],[1304,5654,1540],{"className":5655},[1539],[1304,5657,5659],{"className":5658},[1507],[1304,5660,5662],{"className":5661,"style":2743},[1511],[1304,5663],{},[1304,5665],{"className":5666},[2749,2612],[1097,5668,5669],{},"当 (F=0.95)：",[1304,5671,5673],{"className":5672},[1307],[1304,5674,5676,5713],{"className":5675},[1311],[1304,5677,5679],{"className":5678},[1315],[1317,5680,5681],{"xmlns":1319,"display":1320},[1322,5682,5683,5710],{},[1325,5684,5685,5691,5693,5700,5702,5705,5708],{},[1431,5686,5687,5689],{},[1328,5688,2529],{},[1328,5690,2857],{},[1332,5692,1334],{},[2533,5694,5695,5697],{},[1869,5696,5183],{},[1869,5698,5699],{},"0.05",[1332,5701,1334],{},[1869,5703,5704],{},"19",[1332,5706,5707],{},"≈",[1869,5709,5188],{},[1345,5711,5712],{"encoding":1347},"S_E = \\frac{0.95}{0.05} = 19 \\approx 20",[1304,5714,5716,5771,5848,5866],{"className":5715,"ariaHidden":1353},[1352],[1304,5717,5719,5722,5762,5765,5768],{"className":5718},[1357],[1304,5720],{"className":5721,"style":3367},[1361],[1304,5723,5725,5728],{"className":5724},[1366],[1304,5726,2529],{"className":5727,"style":2588},[1366,1367],[1304,5729,5731],{"className":5730},[1498],[1304,5732,5734,5754],{"className":5733},[1502,1503],[1304,5735,5737,5751],{"className":5736},[1507],[1304,5738,5740],{"className":5739,"style":2963},[1511],[1304,5741,5742,5745],{"style":2966},[1304,5743],{"className":5744,"style":1520},[1519],[1304,5746,5748],{"className":5747},[1524,1525,1526,1527],[1304,5749,2857],{"className":5750,"style":2588},[1366,1367,1527],[1304,5752,1540],{"className":5753},[1539],[1304,5755,5757],{"className":5756},[1507],[1304,5758,5760],{"className":5759,"style":1668},[1511],[1304,5761],{},[1304,5763],{"className":5764,"style":1373},[1372],[1304,5766,1334],{"className":5767},[1377],[1304,5769],{"className":5770,"style":1373},[1372],[1304,5772,5774,5777,5839,5842,5845],{"className":5773},[1357],[1304,5775],{"className":5776,"style":4608},[1361],[1304,5778,5780,5783,5836],{"className":5779},[1366],[1304,5781],{"className":5782},[2611,2612],[1304,5784,5786],{"className":5785},[2533],[1304,5787,5789,5828],{"className":5788},[1502,1503],[1304,5790,5792,5825],{"className":5791},[1507],[1304,5793,5795,5806,5814],{"className":5794,"style":3542},[1511],[1304,5796,5797,5800],{"style":2628},[1304,5798],{"className":5799,"style":2632},[1519],[1304,5801,5803],{"className":5802},[1366],[1304,5804,5699],{"className":5805},[1366],[1304,5807,5808,5811],{"style":2684},[1304,5809],{"className":5810,"style":2632},[1519],[1304,5812],{"className":5813,"style":2692},[2691],[1304,5815,5816,5819],{"style":2695},[1304,5817],{"className":5818,"style":2632},[1519],[1304,5820,5822],{"className":5821},[1366],[1304,5823,5183],{"className":5824},[1366],[1304,5826,1540],{"className":5827},[1539],[1304,5829,5831],{"className":5830},[1507],[1304,5832,5834],{"className":5833,"style":4073},[1511],[1304,5835],{},[1304,5837],{"className":5838},[2749,2612],[1304,5840],{"className":5841,"style":1373},[1372],[1304,5843,1334],{"className":5844},[1377],[1304,5846],{"className":5847,"style":1373},[1372],[1304,5849,5851,5854,5857,5860,5863],{"className":5850},[1357],[1304,5852],{"className":5853,"style":4230},[1361],[1304,5855,5704],{"className":5856},[1366],[1304,5858],{"className":5859,"style":1373},[1372],[1304,5861,5707],{"className":5862},[1377],[1304,5864],{"className":5865,"style":1373},[1372],[1304,5867,5869,5872],{"className":5868},[1357],[1304,5870],{"className":5871,"style":4230},[1361],[1304,5873,5188],{"className":5874},[1366],[1097,5876,5877],{},"此时整体加速：",[1304,5879,5881],{"className":5880},[1307],[1304,5882,5884,5928],{"className":5883},[1311],[1304,5885,5887],{"className":5886},[1315],[1317,5888,5889],{"xmlns":1319,"display":1320},[1322,5890,5891,5925],{},[1325,5892,5893,5895,5897,5899,5901,5903,5905,5907,5909,5921,5923],{},[1328,5894,2529],{},[1328,5896,1097],{},[1328,5898,2814],{},[1328,5900,2814],{},[1328,5902,2820],{},[1328,5904,3439],{},[1328,5906,1097],{},[1332,5908,1334],{},[2533,5910,5911,5913],{},[1869,5912,2327],{},[1325,5914,5915,5917,5919],{},[1869,5916,5699],{},[1332,5918,3464],{},[1869,5920,5699],{},[1332,5922,1334],{},[1869,5924,2308],{},[1345,5926,5927],{"encoding":1347},"Speedup = \\frac{1}{0.05+0.05} = 10",[1304,5929,5931,5964,6053],{"className":5930,"ariaHidden":1353},[1352],[1304,5932,5934,5937,5940,5943,5946,5949,5952,5955,5958,5961],{"className":5933},[1357],[1304,5935],{"className":5936,"style":3488},[1361],[1304,5938,2529],{"className":5939,"style":2588},[1366,1367],[1304,5941,1097],{"className":5942},[1366,1367],[1304,5944,3498],{"className":5945},[1366,1367],[1304,5947,2820],{"className":5948},[1366,1367],[1304,5950,3439],{"className":5951},[1366,1367],[1304,5953,1097],{"className":5954},[1366,1367],[1304,5956],{"className":5957,"style":1373},[1372],[1304,5959,1334],{"className":5960},[1377],[1304,5962],{"className":5963,"style":1373},[1372],[1304,5965,5967,5970,6044,6047,6050],{"className":5966},[1357],[1304,5968],{"className":5969,"style":4485},[1361],[1304,5971,5973,5976,6041],{"className":5972},[1366],[1304,5974],{"className":5975},[2611,2612],[1304,5977,5979],{"className":5978},[2533],[1304,5980,5982,6033],{"className":5981},[1502,1503],[1304,5983,5985,6030],{"className":5984},[1507],[1304,5986,5988,6011,6019],{"className":5987,"style":3542},[1511],[1304,5989,5990,5993],{"style":2628},[1304,5991],{"className":5992,"style":2632},[1519],[1304,5994,5996,5999,6002,6005,6008],{"className":5995},[1366],[1304,5997,5699],{"className":5998},[1366],[1304,6000],{"className":6001,"style":1394},[1372],[1304,6003,3464],{"className":6004},[1398],[1304,6006],{"className":6007,"style":1394},[1372],[1304,6009,5699],{"className":6010},[1366],[1304,6012,6013,6016],{"style":2684},[1304,6014],{"className":6015,"style":2632},[1519],[1304,6017],{"className":6018,"style":2692},[2691],[1304,6020,6021,6024],{"style":2695},[1304,6022],{"className":6023,"style":2632},[1519],[1304,6025,6027],{"className":6026},[1366],[1304,6028,2327],{"className":6029},[1366],[1304,6031,1540],{"className":6032},[1539],[1304,6034,6036],{"className":6035},[1507],[1304,6037,6039],{"className":6038,"style":2743},[1511],[1304,6040],{},[1304,6042],{"className":6043},[2749,2612],[1304,6045],{"className":6046,"style":1373},[1372],[1304,6048,1334],{"className":6049},[1377],[1304,6051],{"className":6052,"style":1373},[1372],[1304,6054,6056,6059],{"className":6055},[1357],[1304,6057],{"className":6058,"style":4230},[1361],[1304,6060,2308],{"className":6061},[1366],[1097,6063,6064,6065,6068],{},"也就是说，",[1104,6066,6067],{},"把 95% 的部分加速 20 倍，整体只有 10 倍加速","。这就是并行系统里很经典的“收益递减”。第 19 页图上的曲线也在表达：处理器越来越多，最后会被顺序部分卡住。",[1097,6070,6071],{},[1246,6072],{"alt":1246,"src":6073},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-05.png",[978,6075,6077,6078,6081],{"id":6076},"第-20-页强扩展弱扩展负载平衡重要","第 20 页：",[1101,6079,6080],{},"强扩展、弱扩展、负载平衡","，重要",[1097,6083,6084,6085],{},"这页概念很容易考简答。其实也在讲并行的",[1104,6086,6087],{},"评价标准",[1097,6089,6090,6093,6094,6097],{},[1104,6091,6092],{},"强扩展 Strong Scaling","：\n",[1101,6095,6096],{},"问题规模不变，增加处理器数量","，看能不能跑得更快。",[1097,6099,6100,6101,6153],{},"比如：同一个 (",[1304,6102,6104,6123],{"className":6103},[1311],[1304,6105,6107],{"className":6106},[1315],[1317,6108,6109],{"xmlns":1319},[1322,6110,6111,6120],{},[1325,6112,6113,6116,6118],{},[1869,6114,6115],{},"10000",[1332,6117,1340],{},[1869,6119,6115],{},[1345,6121,6122],{"encoding":1347},"10000 \\times 10000",[1304,6124,6126,6144],{"className":6125,"ariaHidden":1353},[1352],[1304,6127,6129,6132,6135,6138,6141],{"className":6128},[1357],[1304,6130],{"className":6131,"style":3312},[1361],[1304,6133,6115],{"className":6134},[1366],[1304,6136],{"className":6137,"style":1394},[1372],[1304,6139,1340],{"className":6140},[1398],[1304,6142],{"className":6143,"style":1394},[1372],[1304,6145,6147,6150],{"className":6146},[1357],[1304,6148],{"className":6149,"style":4230},[1361],[1304,6151,6115],{"className":6152},[1366],") 矩阵乘法，用 1 个核、2 个核、4 个核、8 个核分别算，看速度能否对应提升。",[1097,6155,6156,6159,6160,1107],{},[1104,6157,6158],{},"弱扩展 Weak Scaling","：\n每个处理器负责的工作量大致不变，",[1101,6161,6162],{},"处理器变多时，问题规模也同比例变大",[1097,6164,6165],{},"比如：1 个核心算 (N) 个数据，8 个核心算 (8N) 个数据。如果总时间差不多，说明弱扩展好。",[1097,6167,6168,6171],{},[1101,6169,6170],{},"强扩展更难","，因为问题总量固定，处理器越多，每个处理器分到的工作越少，但通信、同步、调度开销不会凭空消失。",[1097,6173,6174,6175,6178,6179,6182],{},"这页还提到",[1104,6176,6177],{},"负载平衡 load balancing","：",[1101,6180,6181],{},"每个处理器最好做差不多的工作","。如果一个处理器工作量是其他处理器的两倍，大家都要等它，整体速度会被它拖住。这个点后面 OpenMP、线程同步里也会继续出现。",[978,6184,6186],{"id":6185},"第-21-页练习题","第 21 页：练习题",[1097,6188,6189],{},"题目：程序花费 80% 时间在平方根例程中。要让程序整体快 5 倍，平方根例程必须加速多少？",[1097,6191,4091],{},[1304,6193,6195],{"className":6194},[1307],[1304,6196,6198,6240],{"className":6197},[1311],[1304,6199,6201],{"className":6200},[1315],[1317,6202,6203],{"xmlns":1319,"display":1320},[1322,6204,6205,6237],{},[1325,6206,6207,6209,6211,6214,6216,6218,6220,6222,6224,6226,6228,6230,6232,6234],{},[1328,6208,2517],{},[1332,6210,1334],{},[1869,6212,6213],{},"0.8",[1332,6215,4116],{"separator":1353},[1372,6217],{"width":4119},[1328,6219,2529],{},[1328,6221,1097],{},[1328,6223,2814],{},[1328,6225,2814],{},[1328,6227,2820],{},[1328,6229,3439],{},[1328,6231,1097],{},[1332,6233,1334],{},[1869,6235,6236],{},"5",[1345,6238,6239],{"encoding":1347},"F=0.8,\\quad Speedup=5",[1304,6241,6243,6261,6306],{"className":6242,"ariaHidden":1353},[1352],[1304,6244,6246,6249,6252,6255,6258],{"className":6245},[1357],[1304,6247],{"className":6248,"style":1362},[1361],[1304,6250,2517],{"className":6251,"style":2573},[1366,1367],[1304,6253],{"className":6254,"style":1373},[1372],[1304,6256,1334],{"className":6257},[1377],[1304,6259],{"className":6260,"style":1373},[1372],[1304,6262,6264,6267,6270,6273,6276,6279,6282,6285,6288,6291,6294,6297,6300,6303],{"className":6263},[1357],[1304,6265],{"className":6266,"style":3488},[1361],[1304,6268,6213],{"className":6269},[1366],[1304,6271,4116],{"className":6272},[4167],[1304,6274],{"className":6275,"style":4171},[1372],[1304,6277],{"className":6278,"style":1623},[1372],[1304,6280,2529],{"className":6281,"style":2588},[1366,1367],[1304,6283,1097],{"className":6284},[1366,1367],[1304,6286,3498],{"className":6287},[1366,1367],[1304,6289,2820],{"className":6290},[1366,1367],[1304,6292,3439],{"className":6293},[1366,1367],[1304,6295,1097],{"className":6296},[1366,1367],[1304,6298],{"className":6299,"style":1373},[1372],[1304,6301,1334],{"className":6302},[1377],[1304,6304],{"className":6305,"style":1373},[1372],[1304,6307,6309,6312],{"className":6308},[1357],[1304,6310],{"className":6311,"style":4230},[1361],[1304,6313,6236],{"className":6314},[1366],[1097,6316,6317],{},"代入 Amdahl：",[1304,6319,6321],{"className":6320},[1307],[1304,6322,6324,6368],{"className":6323},[1311],[1304,6325,6327],{"className":6326},[1315],[1317,6328,6329],{"xmlns":1319,"display":1320},[1322,6330,6331,6365],{},[1325,6332,6333,6335,6337],{},[1869,6334,6236],{},[1332,6336,1334],{},[2533,6338,6339,6341],{},[1869,6340,2327],{},[1325,6342,6343,6345,6347,6349,6351,6353,6355,6357,6359],{},[1332,6344,3247],{"stretchy":3452},[1869,6346,2327],{},[1332,6348,2154],{},[1869,6350,6213],{},[1332,6352,3461],{"stretchy":3452},[1332,6354,3464],{},[1869,6356,6213],{},[1328,6358,3469],{"mathvariant":2802},[1431,6360,6361,6363],{},[1328,6362,2529],{},[1328,6364,2857],{},[1345,6366,6367],{"encoding":1347},"5 = \\frac{1}{(1-0.8)+0.8\u002FS_E}",[1304,6369,6371,6389],{"className":6370,"ariaHidden":1353},[1352],[1304,6372,6374,6377,6380,6383,6386],{"className":6373},[1357],[1304,6375],{"className":6376,"style":4230},[1361],[1304,6378,6236],{"className":6379},[1366],[1304,6381],{"className":6382,"style":1373},[1372],[1304,6384,1334],{"className":6385},[1377],[1304,6387],{"className":6388,"style":1373},[1372],[1304,6390,6392,6395],{"className":6391},[1357],[1304,6393],{"className":6394,"style":3523},[1361],[1304,6396,6398,6401,6525],{"className":6397},[1366],[1304,6399],{"className":6400},[2611,2612],[1304,6402,6404],{"className":6403},[2533],[1304,6405,6407,6517],{"className":6406},[1502,1503],[1304,6408,6410,6514],{"className":6409},[1507],[1304,6411,6413,6495,6503],{"className":6412,"style":3542},[1511],[1304,6414,6415,6418],{"style":2628},[1304,6416],{"className":6417,"style":2632},[1519],[1304,6419,6421,6424,6427,6430,6433,6436,6439,6442,6445,6448,6451,6455],{"className":6420},[1366],[1304,6422,3247],{"className":6423},[2611],[1304,6425,2327],{"className":6426},[1366],[1304,6428],{"className":6429,"style":1394},[1372],[1304,6431,2154],{"className":6432},[1398],[1304,6434],{"className":6435,"style":1394},[1372],[1304,6437,6213],{"className":6438},[1366],[1304,6440,3461],{"className":6441},[2749],[1304,6443],{"className":6444,"style":1394},[1372],[1304,6446,3464],{"className":6447},[1398],[1304,6449],{"className":6450,"style":1394},[1372],[1304,6452,6454],{"className":6453},[1366],"0.8\u002F",[1304,6456,6458,6461],{"className":6457},[1366],[1304,6459,2529],{"className":6460,"style":2588},[1366,1367],[1304,6462,6464],{"className":6463},[1498],[1304,6465,6467,6487],{"className":6466},[1502,1503],[1304,6468,6470,6484],{"className":6469},[1507],[1304,6471,6473],{"className":6472,"style":2963},[1511],[1304,6474,6475,6478],{"style":2966},[1304,6476],{"className":6477,"style":1520},[1519],[1304,6479,6481],{"className":6480},[1524,1525,1526,1527],[1304,6482,2857],{"className":6483,"style":2588},[1366,1367,1527],[1304,6485,1540],{"className":6486},[1539],[1304,6488,6490],{"className":6489},[1507],[1304,6491,6493],{"className":6492,"style":1668},[1511],[1304,6494],{},[1304,6496,6497,6500],{"style":2684},[1304,6498],{"className":6499,"style":2632},[1519],[1304,6501],{"className":6502,"style":2692},[2691],[1304,6504,6505,6508],{"style":2695},[1304,6506],{"className":6507,"style":2632},[1519],[1304,6509,6511],{"className":6510},[1366],[1304,6512,2327],{"className":6513},[1366],[1304,6515,1540],{"className":6516},[1539],[1304,6518,6520],{"className":6519},[1507],[1304,6521,6523],{"className":6522,"style":3655},[1511],[1304,6524],{},[1304,6526],{"className":6527},[2749,2612],[1097,6529,6530],{},"也就是：",[1304,6532,6534],{"className":6533},[1307],[1304,6535,6537,6574],{"className":6536},[1311],[1304,6538,6540],{"className":6539},[1315],[1317,6541,6542],{"xmlns":1319,"display":1320},[1322,6543,6544,6571],{},[1325,6545,6546,6548,6550],{},[1869,6547,6236],{},[1332,6549,1334],{},[2533,6551,6552,6554],{},[1869,6553,2327],{},[1325,6555,6556,6559,6561,6563,6565],{},[1869,6557,6558],{},"0.2",[1332,6560,3464],{},[1869,6562,6213],{},[1328,6564,3469],{"mathvariant":2802},[1431,6566,6567,6569],{},[1328,6568,2529],{},[1328,6570,2857],{},[1345,6572,6573],{"encoding":1347},"5 = \\frac{1}{0.2+0.8\u002FS_E}",[1304,6575,6577,6595],{"className":6576,"ariaHidden":1353},[1352],[1304,6578,6580,6583,6586,6589,6592],{"className":6579},[1357],[1304,6581],{"className":6582,"style":4230},[1361],[1304,6584,6236],{"className":6585},[1366],[1304,6587],{"className":6588,"style":1373},[1372],[1304,6590,1334],{"className":6591},[1377],[1304,6593],{"className":6594,"style":1373},[1372],[1304,6596,6598,6601],{"className":6597},[1357],[1304,6599],{"className":6600,"style":3523},[1361],[1304,6602,6604,6607,6712],{"className":6603},[1366],[1304,6605],{"className":6606},[2611,2612],[1304,6608,6610],{"className":6609},[2533],[1304,6611,6613,6704],{"className":6612},[1502,1503],[1304,6614,6616,6701],{"className":6615},[1507],[1304,6617,6619,6682,6690],{"className":6618,"style":3542},[1511],[1304,6620,6621,6624],{"style":2628},[1304,6622],{"className":6623,"style":2632},[1519],[1304,6625,6627,6630,6633,6636,6639,6642],{"className":6626},[1366],[1304,6628,6558],{"className":6629},[1366],[1304,6631],{"className":6632,"style":1394},[1372],[1304,6634,3464],{"className":6635},[1398],[1304,6637],{"className":6638,"style":1394},[1372],[1304,6640,6454],{"className":6641},[1366],[1304,6643,6645,6648],{"className":6644},[1366],[1304,6646,2529],{"className":6647,"style":2588},[1366,1367],[1304,6649,6651],{"className":6650},[1498],[1304,6652,6654,6674],{"className":6653},[1502,1503],[1304,6655,6657,6671],{"className":6656},[1507],[1304,6658,6660],{"className":6659,"style":2963},[1511],[1304,6661,6662,6665],{"style":2966},[1304,6663],{"className":6664,"style":1520},[1519],[1304,6666,6668],{"className":6667},[1524,1525,1526,1527],[1304,6669,2857],{"className":6670,"style":2588},[1366,1367,1527],[1304,6672,1540],{"className":6673},[1539],[1304,6675,6677],{"className":6676},[1507],[1304,6678,6680],{"className":6679,"style":1668},[1511],[1304,6681],{},[1304,6683,6684,6687],{"style":2684},[1304,6685],{"className":6686,"style":2632},[1519],[1304,6688],{"className":6689,"style":2692},[2691],[1304,6691,6692,6695],{"style":2695},[1304,6693],{"className":6694,"style":2632},[1519],[1304,6696,6698],{"className":6697},[1366],[1304,6699,2327],{"className":6700},[1366],[1304,6702,1540],{"className":6703},[1539],[1304,6705,6707],{"className":6706},[1507],[1304,6708,6710],{"className":6709,"style":3655},[1511],[1304,6711],{},[1304,6713],{"className":6714},[2749,2612],[1097,6716,6717],{},"两边取倒数：",[1304,6719,6721],{"className":6720},[1307],[1304,6722,6724,6754],{"className":6723},[1311],[1304,6725,6727],{"className":6726},[1315],[1317,6728,6729],{"xmlns":1319,"display":1320},[1322,6730,6731,6751],{},[1325,6732,6733,6735,6737,6739,6741,6743,6745],{},[1869,6734,6558],{},[1332,6736,1334],{},[1869,6738,6558],{},[1332,6740,3464],{},[1869,6742,6213],{},[1328,6744,3469],{"mathvariant":2802},[1431,6746,6747,6749],{},[1328,6748,2529],{},[1328,6750,2857],{},[1345,6752,6753],{"encoding":1347},"0.2 = 0.2+0.8\u002FS_E",[1304,6755,6757,6775,6793],{"className":6756,"ariaHidden":1353},[1352],[1304,6758,6760,6763,6766,6769,6772],{"className":6759},[1357],[1304,6761],{"className":6762,"style":4230},[1361],[1304,6764,6558],{"className":6765},[1366],[1304,6767],{"className":6768,"style":1373},[1372],[1304,6770,1334],{"className":6771},[1377],[1304,6773],{"className":6774,"style":1373},[1372],[1304,6776,6778,6781,6784,6787,6790],{"className":6777},[1357],[1304,6779],{"className":6780,"style":3312},[1361],[1304,6782,6558],{"className":6783},[1366],[1304,6785],{"className":6786,"style":1394},[1372],[1304,6788,3464],{"className":6789},[1398],[1304,6791],{"className":6792,"style":1394},[1372],[1304,6794,6796,6799,6802],{"className":6795},[1357],[1304,6797],{"className":6798,"style":3714},[1361],[1304,6800,6454],{"className":6801},[1366],[1304,6803,6805,6808],{"className":6804},[1366],[1304,6806,2529],{"className":6807,"style":2588},[1366,1367],[1304,6809,6811],{"className":6810},[1498],[1304,6812,6814,6834],{"className":6813},[1502,1503],[1304,6815,6817,6831],{"className":6816},[1507],[1304,6818,6820],{"className":6819,"style":2963},[1511],[1304,6821,6822,6825],{"style":2966},[1304,6823],{"className":6824,"style":1520},[1519],[1304,6826,6828],{"className":6827},[1524,1525,1526,1527],[1304,6829,2857],{"className":6830,"style":2588},[1366,1367,1527],[1304,6832,1540],{"className":6833},[1539],[1304,6835,6837],{"className":6836},[1507],[1304,6838,6840],{"className":6839,"style":1668},[1511],[1304,6841],{},[1097,6843,5489],{},[1304,6845,6847],{"className":6846},[1307],[1304,6848,6850,6876],{"className":6849},[1311],[1304,6851,6853],{"className":6852},[1315],[1317,6854,6855],{"xmlns":1319,"display":1320},[1322,6856,6857,6873],{},[1325,6858,6859,6861,6863,6869,6871],{},[1869,6860,6213],{},[1328,6862,3469],{"mathvariant":2802},[1431,6864,6865,6867],{},[1328,6866,2529],{},[1328,6868,2857],{},[1332,6870,1334],{},[1869,6872,2334],{},[1345,6874,6875],{"encoding":1347},"0.8\u002FS_E = 0",[1304,6877,6879,6937],{"className":6878,"ariaHidden":1353},[1352],[1304,6880,6882,6885,6888,6928,6931,6934],{"className":6881},[1357],[1304,6883],{"className":6884,"style":3714},[1361],[1304,6886,6454],{"className":6887},[1366],[1304,6889,6891,6894],{"className":6890},[1366],[1304,6892,2529],{"className":6893,"style":2588},[1366,1367],[1304,6895,6897],{"className":6896},[1498],[1304,6898,6900,6920],{"className":6899},[1502,1503],[1304,6901,6903,6917],{"className":6902},[1507],[1304,6904,6906],{"className":6905,"style":2963},[1511],[1304,6907,6908,6911],{"style":2966},[1304,6909],{"className":6910,"style":1520},[1519],[1304,6912,6914],{"className":6913},[1524,1525,1526,1527],[1304,6915,2857],{"className":6916,"style":2588},[1366,1367,1527],[1304,6918,1540],{"className":6919},[1539],[1304,6921,6923],{"className":6922},[1507],[1304,6924,6926],{"className":6925,"style":1668},[1511],[1304,6927],{},[1304,6929],{"className":6930,"style":1373},[1372],[1304,6932,1334],{"className":6933},[1377],[1304,6935],{"className":6936,"style":1373},[1372],[1304,6938,6940,6943],{"className":6939},[1357],[1304,6941],{"className":6942,"style":4230},[1361],[1304,6944,2334],{"className":6945},[1366],[1097,6947,6948],{},"这要求：",[1304,6950,6952],{"className":6951},[1307],[1304,6953,6955,6977],{"className":6954},[1311],[1304,6956,6958],{"className":6957},[1315],[1317,6959,6960],{"xmlns":1319,"display":1320},[1322,6961,6962,6974],{},[1325,6963,6964,6970,6972],{},[1431,6965,6966,6968],{},[1328,6967,2529],{},[1328,6969,2857],{},[1332,6971,1334],{},[1328,6973,4764],{"mathvariant":2802},[1345,6975,6976],{"encoding":1347},"S_E = \\infty",[1304,6978,6980,7035],{"className":6979,"ariaHidden":1353},[1352],[1304,6981,6983,6986,7026,7029,7032],{"className":6982},[1357],[1304,6984],{"className":6985,"style":3367},[1361],[1304,6987,6989,6992],{"className":6988},[1366],[1304,6990,2529],{"className":6991,"style":2588},[1366,1367],[1304,6993,6995],{"className":6994},[1498],[1304,6996,6998,7018],{"className":6997},[1502,1503],[1304,6999,7001,7015],{"className":7000},[1507],[1304,7002,7004],{"className":7003,"style":2963},[1511],[1304,7005,7006,7009],{"style":2966},[1304,7007],{"className":7008,"style":1520},[1519],[1304,7010,7012],{"className":7011},[1524,1525,1526,1527],[1304,7013,2857],{"className":7014,"style":2588},[1366,1367,1527],[1304,7016,1540],{"className":7017},[1539],[1304,7019,7021],{"className":7020},[1507],[1304,7022,7024],{"className":7023,"style":1668},[1511],[1304,7025],{},[1304,7027],{"className":7028,"style":1373},[1372],[1304,7030,1334],{"className":7031},[1377],[1304,7033],{"className":7034,"style":1373},[1372],[1304,7036,7038,7041],{"className":7037},[1357],[1304,7039],{"className":7040,"style":4832},[1361],[1304,7042,4764],{"className":7043},[1366],[1097,7045,7046,7047,7050],{},"所以答案不是 5、20、500，而是 ",[1104,7048,7049],{},"None of above","。因为 80% 可加速时，理论最大加速就是：",[1304,7052,7054],{"className":7053},[1307],[1304,7055,7057,7099],{"className":7056},[1311],[1304,7058,7060],{"className":7059},[1315],[1317,7061,7062],{"xmlns":1319,"display":1320},[1322,7063,7064,7096],{},[1325,7065,7066,7078,7080,7092,7094],{},[1431,7067,7068,7070],{},[1328,7069,2529],{},[1325,7071,7072,7074,7076],{},[1328,7073,4970],{},[1328,7075,2830],{},[1328,7077,4975],{},[1332,7079,1334],{},[2533,7081,7082,7084],{},[1869,7083,2327],{},[1325,7085,7086,7088,7090],{},[1869,7087,2327],{},[1332,7089,2154],{},[1869,7091,6213],{},[1332,7093,1334],{},[1869,7095,6236],{},[1345,7097,7098],{"encoding":1347},"S_{max} = \\frac{1}{1-0.8} = 5",[1304,7100,7102,7163,7252],{"className":7101,"ariaHidden":1353},[1352],[1304,7103,7105,7108,7154,7157,7160],{"className":7104},[1357],[1304,7106],{"className":7107,"style":3367},[1361],[1304,7109,7111,7114],{"className":7110},[1366],[1304,7112,2529],{"className":7113,"style":2588},[1366,1367],[1304,7115,7117],{"className":7116},[1498],[1304,7118,7120,7146],{"className":7119},[1502,1503],[1304,7121,7123,7143],{"className":7122},[1507],[1304,7124,7126],{"className":7125,"style":5020},[1511],[1304,7127,7128,7131],{"style":2966},[1304,7129],{"className":7130,"style":1520},[1519],[1304,7132,7134],{"className":7133},[1524,1525,1526,1527],[1304,7135,7137,7140],{"className":7136},[1366,1527],[1304,7138,5035],{"className":7139},[1366,1367,1527],[1304,7141,4975],{"className":7142},[1366,1367,1527],[1304,7144,1540],{"className":7145},[1539],[1304,7147,7149],{"className":7148},[1507],[1304,7150,7152],{"className":7151,"style":1668},[1511],[1304,7153],{},[1304,7155],{"className":7156,"style":1373},[1372],[1304,7158,1334],{"className":7159},[1377],[1304,7161],{"className":7162,"style":1373},[1372],[1304,7164,7166,7169,7243,7246,7249],{"className":7165},[1357],[1304,7167],{"className":7168,"style":4485},[1361],[1304,7170,7172,7175,7240],{"className":7171},[1366],[1304,7173],{"className":7174},[2611,2612],[1304,7176,7178],{"className":7177},[2533],[1304,7179,7181,7232],{"className":7180},[1502,1503],[1304,7182,7184,7229],{"className":7183},[1507],[1304,7185,7187,7210,7218],{"className":7186,"style":3542},[1511],[1304,7188,7189,7192],{"style":2628},[1304,7190],{"className":7191,"style":2632},[1519],[1304,7193,7195,7198,7201,7204,7207],{"className":7194},[1366],[1304,7196,2327],{"className":7197},[1366],[1304,7199],{"className":7200,"style":1394},[1372],[1304,7202,2154],{"className":7203},[1398],[1304,7205],{"className":7206,"style":1394},[1372],[1304,7208,6213],{"className":7209},[1366],[1304,7211,7212,7215],{"style":2684},[1304,7213],{"className":7214,"style":2632},[1519],[1304,7216],{"className":7217,"style":2692},[2691],[1304,7219,7220,7223],{"style":2695},[1304,7221],{"className":7222,"style":2632},[1519],[1304,7224,7226],{"className":7225},[1366],[1304,7227,2327],{"className":7228},[1366],[1304,7230,1540],{"className":7231},[1539],[1304,7233,7235],{"className":7234},[1507],[1304,7236,7238],{"className":7237,"style":2743},[1511],[1304,7239],{},[1304,7241],{"className":7242},[2749,2612],[1304,7244],{"className":7245,"style":1373},[1372],[1304,7247,1334],{"className":7248},[1377],[1304,7250],{"className":7251,"style":1373},[1372],[1304,7253,7255,7258],{"className":7254},[1357],[1304,7256],{"className":7257,"style":4230},[1361],[1304,7259,6236],{"className":7260},[1366],[1097,7262,7263],{},"要达到这个上限，平方根部分必须无限快，有限倍数都不行。这个题很“阴”，考试很爱出。",[1231,7265],{},[1092,7267,7269],{"id":7268},"第-22-页并行的类型框架重要","第 22 页：并行的类型，框架重要",[1097,7271,7272],{},"这页把并行分成硬件和软件两类。",[1097,7274,7275],{},[1104,7276,7277],{},"硬件的并行性（Parallelism in Hardware）",[2284,7279,7280,7291,7294,7308],{},[1212,7281,7282,7283],{},"单处理器中的并行性（Parallelism in a Uniprocessor）\n",[2284,7284,7285,7288],{},[1212,7286,7287],{},"流水线（Pipelining）",[1212,7289,7290],{},"超标量（Superscalar）, VLIW 等等",[1212,7292,7293],{},"SIMD 指令，Vector processors，GPUs",[1212,7295,7296,7297],{},"多处理器（Multiprocessor）\n",[2284,7298,7299,7302,7305],{},[1212,7300,7301],{},"Symmetric shared-memory multiprocessors",[1212,7303,7304],{},"Distributed-memory multiprocessors",[1212,7306,7307],{},"Chip-multiprocessors a.k.a. Multi-cores",[1212,7309,7310],{},"多计算机（Multicomputers），又称集群（clusters）",[1097,7312,7313],{},[1104,7314,7315],{},"软件中的并行性（Parallelism in Software）",[2284,7317,7318,7321,7324,7327],{},[1212,7319,7320],{},"指令级并行（Instruction level parallelism） ILP",[1212,7322,7323],{},"任务级并行（Task-level parallelism）",[1212,7325,7326],{},"数据级并行（Data-level parallelism） DLP",[1212,7328,7329],{},"事务级并行（Transaction level parallelism）",[1097,7331,7332],{},"这页不用死背所有英文，但要能建立映射：",[982,7334,7335,7345],{},[985,7336,7337],{},[988,7338,7339,7342],{},[991,7340,7341],{},"类型",[991,7343,7344],{},"核心问题",[1001,7346,7347,7355,7363],{},[988,7348,7349,7352],{},[1006,7350,7351],{},"DLP",[1006,7353,7354],{},"同一操作作用在很多数据上",[988,7356,7357,7360],{},[1006,7358,7359],{},"ILP",[1006,7361,7362],{},"多条指令能不能同时执行",[988,7364,7365,7368],{},[1006,7366,7367],{},"TLP",[1006,7369,7370],{},"多个线程\u002F任务能不能同时执行",[1097,7372,7373],{},"后面模块基本就是围绕 DLP、ILP、TLP 展开。",[1231,7375],{},[1092,7377,7379],{"id":7378},"第-2327-页flynn-分类重要","第 23–27 页：Flynn 分类，重要",[1097,7381,7382],{},"Flynn 分类是按照两个维度分机器：",[1209,7384,7385,7388],{},[1212,7386,7387],{},"指令流是单个还是多个；",[1212,7389,7390],{},"数据流是单个还是多个。",[1097,7392,7393],{},"于是得到四类：",[982,7395,7397],{"style":7396},"width: 100%; border: 0; border-collapse: collapse; border-spacing: 0;",[1001,7398,7399],{},[988,7400,7402,7403,7402,7411],{"style":7401},"border: none;","\n  ",[1006,7404,7406,7402],{"style":7405},"width: 50.0%; text-align: center; border: none; padding: 0.3em; margin: 0;",[1097,7407,7408],{},[1246,7409],{"alt":1246,"src":7410},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-06.png",[1006,7412,7414,7402],{"style":7413},"width: 49.0%; text-align: center; border: none; padding: 0.3em; margin: 0;",[1097,7415,7416],{},[1246,7417],{"alt":1246,"src":7418},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-07.png",[982,7420,7421],{"style":7396},[1001,7422,7423],{},[988,7424,7402,7425,7402,7432],{"style":7401},[1006,7426,7427,7402],{"style":7405},[1097,7428,7429],{},[1246,7430],{"alt":1246,"src":7431},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-08.png",[1006,7433,7434,7402],{"style":7413},[1097,7435,7436],{},[1246,7437],{"alt":1246,"src":7438},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-09.png",[982,7440,7441,7455],{},[985,7442,7443],{},[988,7444,7445,7447,7450,7452],{},[991,7446,7341],{},[991,7448,7449],{},"全称",[991,7451,3185],{},[991,7453,7454],{},"重要度",[1001,7456,7457,7471,7485,7499],{},[988,7458,7459,7462,7465,7468],{},[1006,7460,7461],{},"SISD",[1006,7463,7464],{},"Single Instruction Single Data",[1006,7466,7467],{},"单指令流、单数据流",[1006,7469,7470],{},"中",[988,7472,7473,7476,7479,7482],{},[1006,7474,7475],{},"SIMD",[1006,7477,7478],{},"Single Instruction Multiple Data",[1006,7480,7481],{},"单指令流、多数据流",[1006,7483,7484],{},"高",[988,7486,7487,7490,7493,7496],{},[1006,7488,7489],{},"MISD",[1006,7491,7492],{},"Multiple Instruction Single Data",[1006,7494,7495],{},"多指令流、单数据流",[1006,7497,7498],{},"低",[988,7500,7501,7504,7507,7510],{},[1006,7502,7503],{},"MIMD",[1006,7505,7506],{},"Multiple Instruction Multiple Data",[1006,7508,7509],{},"多指令流、多数据流",[1006,7511,7484],{},[978,7513,7515],{"id":7514},"第-23-页sisd","第 23 页：SISD",[1097,7517,7518],{},"SISD 是传统顺序计算机：一个指令流处理一个数据流。课件说传统单处理器机器就是 SISD。",[1097,7520,7521],{},"注意一个小细节：流水线机器虽然内部多个阶段同时工作，但从程序员视角看，仍然是单一指令流按顺序推进。所以 Flynn 分类里可以把传统流水线处理器看成 SISD。",[978,7523,7525],{"id":7524},"第-24-页simd","第 24 页：SIMD",[1097,7527,7528,7529],{},"SIMD 是本课后面很重要的主题：",[1104,7530,7531],{},"一条指令，同时处理多个数据。",[1097,7533,7534],{},"典型例子：",[2284,7536,7537,7540,7543],{},[1212,7538,7539],{},"Intel SIMD 指令扩展；",[1212,7541,7542],{},"NVIDIA GPU；",[1212,7544,7545],{},"向量处理器。",[1097,7547,7548],{},"比如你要算：",[1304,7550,7552],{"className":7551},[1307],[1304,7553,7555,7636],{"className":7554},[1311],[1304,7556,7558],{"className":7557},[1315],[1317,7559,7560],{"xmlns":1319,"display":1320},[1322,7561,7562,7633],{},[1325,7563,7564,7570,7572,7578,7580,7583,7589,7591,7597,7599,7601,7607,7609,7615,7617,7619,7625,7627],{},[1431,7565,7566,7568],{},[1328,7567,1337],{},[1869,7569,2334],{},[1332,7571,3464],{},[1431,7573,7574,7576],{},[1328,7575,1343],{},[1869,7577,2334],{},[1332,7579,4116],{"separator":1353},[3995,7581,7582],{}," ",[1431,7584,7585,7587],{},[1328,7586,1337],{},[1869,7588,2327],{},[1332,7590,3464],{},[1431,7592,7593,7595],{},[1328,7594,1343],{},[1869,7596,2327],{},[1332,7598,4116],{"separator":1353},[3995,7600,7582],{},[1431,7602,7603,7605],{},[1328,7604,1337],{},[1869,7606,1871],{},[1332,7608,3464],{},[1431,7610,7611,7613],{},[1328,7612,1343],{},[1869,7614,1871],{},[1332,7616,4116],{"separator":1353},[3995,7618,7582],{},[1431,7620,7621,7623],{},[1328,7622,1337],{},[1869,7624,1940],{},[1332,7626,3464],{},[1431,7628,7629,7631],{},[1328,7630,1343],{},[1869,7632,1940],{},[1345,7634,7635],{"encoding":1347},"A_0+B_0,\\ A_1+B_1,\\ A_2+B_2,\\ A_3+B_3",[1304,7637,7639,7695,7799,7903,8007],{"className":7638,"ariaHidden":1353},[1352],[1304,7640,7642,7645,7686,7689,7692],{"className":7641},[1357],[1304,7643],{"className":7644,"style":3367},[1361],[1304,7646,7648,7651],{"className":7647},[1366],[1304,7649,1337],{"className":7650},[1366,1367],[1304,7652,7654],{"className":7653},[1498],[1304,7655,7657,7678],{"className":7656},[1502,1503],[1304,7658,7660,7675],{"className":7659},[1507],[1304,7661,7664],{"className":7662,"style":7663},[1511],"height:0.3011em;",[1304,7665,7666,7669],{"style":1645},[1304,7667],{"className":7668,"style":1520},[1519],[1304,7670,7672],{"className":7671},[1524,1525,1526,1527],[1304,7673,2334],{"className":7674},[1366,1527],[1304,7676,1540],{"className":7677},[1539],[1304,7679,7681],{"className":7680},[1507],[1304,7682,7684],{"className":7683,"style":1668},[1511],[1304,7685],{},[1304,7687],{"className":7688,"style":1394},[1372],[1304,7690,3464],{"className":7691},[1398],[1304,7693],{"className":7694,"style":1394},[1372],[1304,7696,7698,7701,7741,7744,7747,7750,7790,7793,7796],{"className":7697},[1357],[1304,7699],{"className":7700,"style":4160},[1361],[1304,7702,7704,7707],{"className":7703},[1366],[1304,7705,1343],{"className":7706,"style":1411},[1366,1367],[1304,7708,7710],{"className":7709},[1498],[1304,7711,7713,7733],{"className":7712},[1502,1503],[1304,7714,7716,7730],{"className":7715},[1507],[1304,7717,7719],{"className":7718,"style":7663},[1511],[1304,7720,7721,7724],{"style":1706},[1304,7722],{"className":7723,"style":1520},[1519],[1304,7725,7727],{"className":7726},[1524,1525,1526,1527],[1304,7728,2334],{"className":7729},[1366,1527],[1304,7731,1540],{"className":7732},[1539],[1304,7734,7736],{"className":7735},[1507],[1304,7737,7739],{"className":7738,"style":1668},[1511],[1304,7740],{},[1304,7742,4116],{"className":7743},[4167],[1304,7745,7582],{"className":7746},[1372],[1304,7748],{"className":7749,"style":1623},[1372],[1304,7751,7753,7756],{"className":7752},[1366],[1304,7754,1337],{"className":7755},[1366,1367],[1304,7757,7759],{"className":7758},[1498],[1304,7760,7762,7782],{"className":7761},[1502,1503],[1304,7763,7765,7779],{"className":7764},[1507],[1304,7766,7768],{"className":7767,"style":7663},[1511],[1304,7769,7770,7773],{"style":1645},[1304,7771],{"className":7772,"style":1520},[1519],[1304,7774,7776],{"className":7775},[1524,1525,1526,1527],[1304,7777,2327],{"className":7778},[1366,1527],[1304,7780,1540],{"className":7781},[1539],[1304,7783,7785],{"className":7784},[1507],[1304,7786,7788],{"className":7787,"style":1668},[1511],[1304,7789],{},[1304,7791],{"className":7792,"style":1394},[1372],[1304,7794,3464],{"className":7795},[1398],[1304,7797],{"className":7798,"style":1394},[1372],[1304,7800,7802,7805,7845,7848,7851,7854,7894,7897,7900],{"className":7801},[1357],[1304,7803],{"className":7804,"style":4160},[1361],[1304,7806,7808,7811],{"className":7807},[1366],[1304,7809,1343],{"className":7810,"style":1411},[1366,1367],[1304,7812,7814],{"className":7813},[1498],[1304,7815,7817,7837],{"className":7816},[1502,1503],[1304,7818,7820,7834],{"className":7819},[1507],[1304,7821,7823],{"className":7822,"style":7663},[1511],[1304,7824,7825,7828],{"style":1706},[1304,7826],{"className":7827,"style":1520},[1519],[1304,7829,7831],{"className":7830},[1524,1525,1526,1527],[1304,7832,2327],{"className":7833},[1366,1527],[1304,7835,1540],{"className":7836},[1539],[1304,7838,7840],{"className":7839},[1507],[1304,7841,7843],{"className":7842,"style":1668},[1511],[1304,7844],{},[1304,7846,4116],{"className":7847},[4167],[1304,7849,7582],{"className":7850},[1372],[1304,7852],{"className":7853,"style":1623},[1372],[1304,7855,7857,7860],{"className":7856},[1366],[1304,7858,1337],{"className":7859},[1366,1367],[1304,7861,7863],{"className":7862},[1498],[1304,7864,7866,7886],{"className":7865},[1502,1503],[1304,7867,7869,7883],{"className":7868},[1507],[1304,7870,7872],{"className":7871,"style":7663},[1511],[1304,7873,7874,7877],{"style":1645},[1304,7875],{"className":7876,"style":1520},[1519],[1304,7878,7880],{"className":7879},[1524,1525,1526,1527],[1304,7881,1871],{"className":7882},[1366,1527],[1304,7884,1540],{"className":7885},[1539],[1304,7887,7889],{"className":7888},[1507],[1304,7890,7892],{"className":7891,"style":1668},[1511],[1304,7893],{},[1304,7895],{"className":7896,"style":1394},[1372],[1304,7898,3464],{"className":7899},[1398],[1304,7901],{"className":7902,"style":1394},[1372],[1304,7904,7906,7909,7949,7952,7955,7958,7998,8001,8004],{"className":7905},[1357],[1304,7907],{"className":7908,"style":4160},[1361],[1304,7910,7912,7915],{"className":7911},[1366],[1304,7913,1343],{"className":7914,"style":1411},[1366,1367],[1304,7916,7918],{"className":7917},[1498],[1304,7919,7921,7941],{"className":7920},[1502,1503],[1304,7922,7924,7938],{"className":7923},[1507],[1304,7925,7927],{"className":7926,"style":7663},[1511],[1304,7928,7929,7932],{"style":1706},[1304,7930],{"className":7931,"style":1520},[1519],[1304,7933,7935],{"className":7934},[1524,1525,1526,1527],[1304,7936,1871],{"className":7937},[1366,1527],[1304,7939,1540],{"className":7940},[1539],[1304,7942,7944],{"className":7943},[1507],[1304,7945,7947],{"className":7946,"style":1668},[1511],[1304,7948],{},[1304,7950,4116],{"className":7951},[4167],[1304,7953,7582],{"className":7954},[1372],[1304,7956],{"className":7957,"style":1623},[1372],[1304,7959,7961,7964],{"className":7960},[1366],[1304,7962,1337],{"className":7963},[1366,1367],[1304,7965,7967],{"className":7966},[1498],[1304,7968,7970,7990],{"className":7969},[1502,1503],[1304,7971,7973,7987],{"className":7972},[1507],[1304,7974,7976],{"className":7975,"style":7663},[1511],[1304,7977,7978,7981],{"style":1645},[1304,7979],{"className":7980,"style":1520},[1519],[1304,7982,7984],{"className":7983},[1524,1525,1526,1527],[1304,7985,1940],{"className":7986},[1366,1527],[1304,7988,1540],{"className":7989},[1539],[1304,7991,7993],{"className":7992},[1507],[1304,7994,7996],{"className":7995,"style":1668},[1511],[1304,7997],{},[1304,7999],{"className":8000,"style":1394},[1372],[1304,8002,3464],{"className":8003},[1398],[1304,8005],{"className":8006,"style":1394},[1372],[1304,8008,8010,8013],{"className":8009},[1357],[1304,8011],{"className":8012,"style":3367},[1361],[1304,8014,8016,8019],{"className":8015},[1366],[1304,8017,1343],{"className":8018,"style":1411},[1366,1367],[1304,8020,8022],{"className":8021},[1498],[1304,8023,8025,8045],{"className":8024},[1502,1503],[1304,8026,8028,8042],{"className":8027},[1507],[1304,8029,8031],{"className":8030,"style":7663},[1511],[1304,8032,8033,8036],{"style":1706},[1304,8034],{"className":8035,"style":1520},[1519],[1304,8037,8039],{"className":8038},[1524,1525,1526,1527],[1304,8040,1940],{"className":8041},[1366,1527],[1304,8043,1540],{"className":8044},[1539],[1304,8046,8048],{"className":8047},[1507],[1304,8049,8051],{"className":8050,"style":1668},[1511],[1304,8052],{},[1097,8054,8055,8056,1107],{},"普通 scalar 做法可能要四次加法指令；SIMD 可以一条向量加法指令同时完成多个加法。它对应后面的 ",[1104,8057,1217],{},[978,8059,8061],{"id":8060},"第-25-页mimd","第 25 页：MIMD",[1097,8063,8064],{},"MIMD 是多个自主处理器同时执行不同指令，处理不同数据。",[1097,8066,7534],{},[2284,8068,8069,8072,8075],{},[1212,8070,8071],{},"多核 CPU；",[1212,8073,8074],{},"多处理器系统；",[1212,8076,8077],{},"数据中心、仓库级计算机。",[1097,8079,8080,8081,8085],{},"它对应后面的 ",[1101,8082,8083],{},[1104,8084,1223],{},"。多个线程可以跑在多个核心上，每个线程有自己的指令序列和状态。",[978,8087,8089],{"id":8088},"第-26-页misd","第 26 页：MISD",[1097,8091,8092],{},"MISD 是多指令流、单数据流。课件说它没什么应用，本课程不涉及。考试最多让你认一下，不太会深入考。",[978,8094,8096],{"id":8095},"第-27-页simd-mimd-最常见spmd-要记","第 27 页：SIMD + MIMD 最常见，SPMD 要记",[1097,8098,8099,8100],{},"课件强调：",[1101,8101,8102],{},[1104,8103,8104],{},"SIMD 和 MIMD 是现代体系结构中最常见的并行方式，而且通常在同一个系统中同时存在。",[1097,8106,8107],{},"比如一台现代电脑：",[2284,8109,8110,8113],{},[1212,8111,8112],{},"多个 CPU 核心：MIMD；",[1212,8114,8115],{},"每个核心内部有 AVX\u002FSIMD 指令：SIMD。",[1097,8117,8118,8119,1107],{},"所以高性能程序常常是：",[1104,8120,8121],{},"多线程 + 每个线程内部 SIMD 向量化",[1097,8123,8124,8125,6178],{},"这一页还出现了 ",[1104,8126,8127],{},"SPMD",[1097,8129,8130],{},[1104,8131,8132],{},"SPMD = Single Program Multiple Data，单程序多数据。",[1097,8134,8135],{},"意思是：多个处理器\u002F线程运行同一个程序，但处理不同的数据，并通过同步原语协调。",[1097,8137,8138],{},"比如 8 个线程都执行同一个矩阵乘法函数，但第 0 个线程算第 0–999 行，第 1 个线程算第 1000–1999 行。这就是 SPMD 风格。",[1231,8140],{},[1092,8142,8144],{"id":8143},"第-2829-页应用程序中的并行分类-dlp-ilp-tlp重要","第 28–29 页：应用程序中的并行分类 DLP \u002F ILP \u002F TLP，重要",[1097,8146,8147],{},"这两页是前面所有分类的落地版，很适合考试简答。",[978,8149,8151],{"id":8150},"第-28-页dlp-和-ilp","第 28 页：DLP 和 ILP",[1209,8153,8154],{},[1212,8155,8156,6178],{},[1104,8157,8158],{},"DLP，Data-Level Parallelism，数据级并行",[2284,8160,8161,8164,8167,8170],{},[1212,8162,8163],{},"对应 SIMD；",[1212,8165,8166],{},"一个指令流同时操作多个数据；",[1212,8168,8169],{},"适合数组、矩阵、图像、向量计算；",[1212,8171,8172],{},"限制来自不规则数据访问和内存带宽。",[1097,8174,8175,8176],{},"一句话：\n",[1104,8177,8178],{},"DLP 是“同样的操作，对很多数据一起做”。",[1209,8180,8182],{"start":8181},2,[1212,8183,8184,6178],{},[1104,8185,8186],{},"ILP，Instruction-Level Parallelism，指令级并行",[1991,8188,8189],{},[1097,8190,8191],{},"一个 PC，一套架构寄存器",[2284,8193,8194,8197,8200,8203],{},[1212,8195,8196],{},"同时执行多条指令；",[1212,8198,8199],{},"例如流水线、超标量、乱序执行、VLIW；",[1212,8201,8202],{},"可以由硬件管理，也可以由编译器管理（VLIW）；",[1212,8204,8205],{},"限制来自数据依赖和控制依赖，也就是流水线冒险。",[1097,8207,8175,8208],{},[1104,8209,8210],{},"ILP 是“一个线程内部，多条指令能不能重叠执行”。",[978,8212,8214],{"id":8213},"第-29-页tlp","第 29 页：TLP",[1097,8216,8217,6178],{},[1104,8218,8219],{},"TLP，Thread-Level Parallelism，线程级\u002F任务级并行",[2284,8221,8222,8225,8228,8234],{},[1212,8223,8224],{},"对应 MIMD；",[1212,8226,8227],{},"同一个应用程序的多个线程或指令序列并发执行；",[1212,8229,8230,8233],{},[1101,8231,8232],{},"每个线程有自己的程序计数器 PC 和处理器状态","，比如寄存器；",[1212,8235,8236],{},"限制来自通信、同步开销和算法特性。",[1097,8238,8175,8239],{},[1104,8240,8241],{},"TLP 是“把一个程序拆成多个线程\u002F任务同时跑”。",[1097,8243,8244],{},"第 29 页还区分了几个概念：",[982,8246,8247,8256],{},[985,8248,8249],{},[988,8250,8251,8253],{},[991,8252,3182],{},[991,8254,8255],{},"解释",[1001,8257,8258,8266,8274],{},[988,8259,8260,8263],{},[1006,8261,8262],{},"Physical CPU \u002F core",[1006,8264,8265],{},"真实物理核心，一般一次运行一个硬件线程",[988,8267,8268,8271],{},[1006,8269,8270],{},"Logical CPU",[1006,8272,8273],{},"操作系统看到的逻辑处理单元",[988,8275,8276,8279],{},[1006,8277,8278],{},"SMT ( 超线程)",[1006,8280,8281],{},"一个物理核心同时维护多个线程状态，共享执行资源",[1097,8283,8284,8285],{},"最容易混的是：\n",[1104,8286,8287],{},"多核 ≠ 超线程。",[1097,8289,8290,3279,8293,8296],{},[1101,8291,8292],{},"多核是有多个真实核心",[1101,8294,8295],{},"超线程是一个核心伪装成多个逻辑 CPU","，用来提高资源利用率，但不是性能直接翻倍。",[1231,8298],{},[1087,8300,8302],{"id":8301},"第-2-模块数据级并行-dlp-simd","第 2 模块：数据级并行 DLP \u002F SIMD",[1097,8304,8305,8306,8309],{},"继续讲",[1104,8307,8308],{},"第 2 模块：数据级并行 Data Level Parallelism，约第 30–60 页","。这一块是本课件的核心之一，主线很清楚：",[1097,8311,8312],{},[1104,8313,8314],{},"SIMD 是什么 → AVX 怎么用 → 为什么没达到理论峰值 → 用loop unrolling 和 blocking 继续优化 → GEMM 为什么这么写。",[1231,8316],{},[1092,8318,8320],{"id":8319},"第-3034-页simd-背景略讲但要知道","第 30–34 页：SIMD 背景，略讲但要知道",[978,8322,8324],{"id":8323},"第-31-页simd-应用和实现重要度中等","第 31 页：SIMD 应用和实现，重要度中等",[1097,8326,8327],{},"课件列了 SIMD 的典型应用：",[982,8329,8330,8340],{},[985,8331,8332],{},[988,8333,8334,8337],{},[991,8335,8336],{},"应用领域",[991,8338,8339],{},"为什么适合 SIMD",[1001,8341,8342,8350,8358,8366],{},[988,8343,8344,8347],{},[1006,8345,8346],{},"科学计算：Matlab、NumPy",[1006,8348,8349],{},"大量向量\u002F矩阵操作",[988,8351,8352,8355],{},[1006,8353,8354],{},"图形和视频处理",[1006,8356,8357],{},"像素处理高度重复",[988,8359,8360,8363],{},[1006,8361,8362],{},"大数据 \u002F 深度学习",[1006,8364,8365],{},"大量张量、矩阵乘法",[988,8367,8368,8371],{},[1006,8369,8370],{},"游戏",[1006,8372,8373],{},"图形、物理、动画计算",[1097,8375,8376],{},"实现方面包括：",[2284,8378,8379,8382,8385],{},[1212,8380,8381],{},"x86；",[1212,8383,8384],{},"ARM；",[1212,8386,8387],{},"RISC-V vector extensions。",[1097,8389,8390,8393],{},[1104,8391,8392],{},"什么样的程序适合 SIMD？",[1104,8394,8395],{},"数据规则、操作相同、循环独立、内存访问连续的程序最适合 SIMD。",[1231,8397],{},[978,8399,8401],{"id":8400},"第-3234-页simd-发展和-cpu-特性略讲","第 32–34 页：SIMD 发展和 CPU 特性，略讲",[1097,8403,8404],{},"第 32 页说第一个 SIMD 扩展可以追溯到 MIT Lincoln Labs TX-2，1957。这个历史不用背。",[1097,8406,8407,8408,8411],{},"第 33 页展示 x86 SIMD 的演进：MMX、SSE、SSE2、SSE3、SSE4、",[1101,8409,8410],{},"AVX","。主线是：",[1991,8413,8414],{},[1097,8415,8416],{},"新指令 + 更宽寄存器 + 更多寄存器 = 更多并行性。",[1097,8418,8419,8420],{},"第 34 页用一台 i7-5557U 做例子，列出 CPU 支持的特性，比如 FPU、SSE、SSE2、SSE3、SSE4.1、SSE4.2、AVX、AVX2、FMA 等。重点不是背这些字符串，而是看懂：",[1104,8421,8422],{},"现代 CPU 内部已经有很多 SIMD\u002F浮点加速硬件",[1231,8424],{},[1092,8426,8428],{"id":8427},"第-3537-页simd-寄存器数据类型向量模式","第 35–37 页：SIMD 寄存器、数据类型、向量模式",[1097,8430,8431],{},"这三页是 SIMD 概念的基础，建议认真看。",[978,8433,8435],{"id":8434},"第-35-页simd-registers","第 35 页：SIMD Registers",[1097,8437,8438],{},"课件展示了 x86 SIMD 寄存器：",[1097,8440,8441],{},[1246,8442],{"alt":1246,"src":8443},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-10.png",[2284,8445,8446,8452,8458,8461],{},[1212,8447,8448,8451],{},[1104,8449,8450],{},"XMM","：128-bit；",[1212,8453,8454,8457],{},[1104,8455,8456],{},"YMM","：256-bit；",[1212,8459,8460],{},"YMM 的低 128 bit 可以看成对应的 XMM；",[1212,8462,8463],{},"图里有 YMM0 到 YMM15。",[1097,8465,8466],{},"可以这么理解：",[1097,8468,8469],{},"普通标量寄存器像一个小盒子，一次放一个 double。\nSIMD 寄存器像一个长盒子，一次能放多个 double 或 float。",[1097,8471,8472,8473,6178],{},"比如 AVX 的 ",[1104,8474,8475],{},"256-bit YMM 寄存器",[2284,8477,8478,8481],{},[1212,8479,8480],{},"一个 double 是 64 bit；",[1212,8482,8483],{},"所以 256 bit 可以放：",[1304,8485,8487],{"className":8486},[1307],[1304,8488,8490,8515],{"className":8489},[1311],[1304,8491,8493],{"className":8492},[1315],[1317,8494,8495],{"xmlns":1319,"display":1320},[1322,8496,8497,8512],{},[1325,8498,8499,8502,8504,8507,8509],{},[1869,8500,8501],{},"256",[1328,8503,3469],{"mathvariant":2802},[1869,8505,8506],{},"64",[1332,8508,1334],{},[1869,8510,8511],{},"4",[1345,8513,8514],{"encoding":1347},"256 \u002F 64 = 4",[1304,8516,8518,8537],{"className":8517,"ariaHidden":1353},[1352],[1304,8519,8521,8524,8528,8531,8534],{"className":8520},[1357],[1304,8522],{"className":8523,"style":3714},[1361],[1304,8525,8527],{"className":8526},[1366],"256\u002F64",[1304,8529],{"className":8530,"style":1373},[1372],[1304,8532,1334],{"className":8533},[1377],[1304,8535],{"className":8536,"style":1373},[1372],[1304,8538,8540,8543],{"className":8539},[1357],[1304,8541],{"className":8542,"style":4230},[1361],[1304,8544,8511],{"className":8545},[1366],[1097,8547,8548,8549,1107],{},"也就是 ",[1104,8550,8551],{},"4 个 double",[1097,8553,8554],{},"如果是 float，一个 float 是 32 bit：",[1304,8556,8558],{"className":8557},[1307],[1304,8559,8561,8585],{"className":8560},[1311],[1304,8562,8564],{"className":8563},[1315],[1317,8565,8566],{"xmlns":1319,"display":1320},[1322,8567,8568,8582],{},[1325,8569,8570,8572,8574,8577,8579],{},[1869,8571,8501],{},[1328,8573,3469],{"mathvariant":2802},[1869,8575,8576],{},"32",[1332,8578,1334],{},[1869,8580,8581],{},"8",[1345,8583,8584],{"encoding":1347},"256 \u002F 32 = 8",[1304,8586,8588,8607],{"className":8587,"ariaHidden":1353},[1352],[1304,8589,8591,8594,8598,8601,8604],{"className":8590},[1357],[1304,8592],{"className":8593,"style":3714},[1361],[1304,8595,8597],{"className":8596},[1366],"256\u002F32",[1304,8599],{"className":8600,"style":1373},[1372],[1304,8602,1334],{"className":8603},[1377],[1304,8605],{"className":8606,"style":1373},[1372],[1304,8608,8610,8613],{"className":8609},[1357],[1304,8611],{"className":8612,"style":4230},[1361],[1304,8614,8581],{"className":8615},[1366],[1097,8617,8618,8619,1107],{},"所以可以放 ",[1104,8620,8621],{},"8 个 float",[1097,8623,8624],{},"这就是为什么 AVX 对 double 理论上能有接近 4 倍的数据并行度。",[1231,8626],{},[978,8628,8630],{"id":8629},"第-36-页simd-data-types","第 36 页：SIMD Data Types",[1097,8632,8633],{},"这一页说明同样长度的 SIMD 寄存器可以按不同数据类型解释。",[1097,8635,8636],{},[1246,8637],{"alt":1246,"src":8638},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-11.png",[1097,8640,8641],{},"128-bit SSE\u002FAVX-128 可以装：",[2284,8643,8644,8647,8650,8653,8656,8659],{},[1212,8645,8646],{},"4 个 float；",[1212,8648,8649],{},"2 个 double；",[1212,8651,8652],{},"16 个 byte；",[1212,8654,8655],{},"8 个 16-bit word；",[1212,8657,8658],{},"4 个 32-bit doubleword；",[1212,8660,8661],{},"2 个 64-bit quadword。",[1097,8663,8664],{},"256-bit AVX 可以装：",[2284,8666,8667,8670],{},[1212,8668,8669],{},"8 个 float；",[1212,8671,8672],{},"4 个 double。",[1097,8674,8675],{},"现在还有 AVX-512，可以进一步扩展到 512-bit。对 double 来说：",[1304,8677,8679],{"className":8678},[1307],[1304,8680,8682,8705],{"className":8681},[1311],[1304,8683,8685],{"className":8684},[1315],[1317,8686,8687],{"xmlns":1319,"display":1320},[1322,8688,8689,8702],{},[1325,8690,8691,8694,8696,8698,8700],{},[1869,8692,8693],{},"512",[1328,8695,3469],{"mathvariant":2802},[1869,8697,8506],{},[1332,8699,1334],{},[1869,8701,8581],{},[1345,8703,8704],{"encoding":1347},"512 \u002F 64 = 8",[1304,8706,8708,8727],{"className":8707,"ariaHidden":1353},[1352],[1304,8709,8711,8714,8718,8721,8724],{"className":8710},[1357],[1304,8712],{"className":8713,"style":3714},[1361],[1304,8715,8717],{"className":8716},[1366],"512\u002F64",[1304,8719],{"className":8720,"style":1373},[1372],[1304,8722,1334],{"className":8723},[1377],[1304,8725],{"className":8726,"style":1373},[1372],[1304,8728,8730,8733],{"className":8729},[1357],[1304,8731],{"className":8732,"style":4230},[1361],[1304,8734,8581],{"className":8735},[1366],[1097,8737,8738],{},"所以 AVX-512 一条向量指令可以处理 8 个 double。",[1097,8740,8741],{},"比如：",[982,8743,8744,8757],{},[985,8745,8746],{},[988,8747,8748,8751,8754],{},[991,8749,8750],{},"SIMD 宽度",[991,8752,8753],{},"double 数量",[991,8755,8756],{},"float 数量",[1001,8758,8759,8768,8777],{},[988,8760,8761,8764,8766],{},[1006,8762,8763],{},"128 bit",[1006,8765,1871],{},[1006,8767,8511],{},[988,8769,8770,8773,8775],{},[1006,8771,8772],{},"256 bit",[1006,8774,8511],{},[1006,8776,8581],{},[988,8778,8779,8782,8784],{},[1006,8780,8781],{},"512 bit",[1006,8783,8581],{},[1006,8785,8786],{},"16",[1231,8788],{},[978,8790,8792],{"id":8791},"第-37-页simd-vector-mode必须理解","第 37 页：SIMD Vector Mode，必须理解",[1097,8794,8795,8796,8799,8800,1107],{},"这页用图对比了 ",[1104,8797,8798],{},"SIMD mode"," 和 ",[1104,8801,8802],{},"scalar mode",[1097,8804,8805],{},[1246,8806],{"alt":1246,"src":8807},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-12.png",[1097,8809,8810],{},"标量模式：",[1304,8812,8814],{"className":8813},[1307],[1304,8815,8817,8835],{"className":8816},[1311],[1304,8818,8820],{"className":8819},[1315],[1317,8821,8822],{"xmlns":1319,"display":1320},[1322,8823,8824,8832],{},[1325,8825,8826,8828,8830],{},[1328,8827,1337],{},[1332,8829,3464],{},[1328,8831,1343],{},[1345,8833,8834],{"encoding":1347},"A + B",[1304,8836,8838,8856],{"className":8837,"ariaHidden":1353},[1352],[1304,8839,8841,8844,8847,8850,8853],{"className":8840},[1357],[1304,8842],{"className":8843,"style":1387},[1361],[1304,8845,1337],{"className":8846},[1366,1367],[1304,8848],{"className":8849,"style":1394},[1372],[1304,8851,3464],{"className":8852},[1398],[1304,8854],{"className":8855,"style":1394},[1372],[1304,8857,8859,8862],{"className":8858},[1357],[1304,8860],{"className":8861,"style":1362},[1361],[1304,8863,1343],{"className":8864,"style":1411},[1366,1367],[1097,8866,8867],{},"一次只算一个。",[1097,8869,8870],{},"SIMD 模式：",[1304,8872,8874],{"className":8873},[1307],[1304,8875,8877,8955],{"className":8876},[1311],[1304,8878,8880],{"className":8879},[1315],[1317,8881,8882],{"xmlns":1319,"display":1320},[1322,8883,8884,8952],{},[1325,8885,8886,8889,8896,8898,8904,8906,8909,8911,8917,8920,8922,8924,8930,8932,8938,8940,8942,8944,8950],{},[1332,8887,8888],{"stretchy":3452},"[",[1431,8890,8891,8893],{},[1328,8892,1337],{},[1869,8894,8895],{},"7",[1332,8897,4116],{"separator":1353},[1431,8899,8900,8902],{},[1328,8901,1337],{},[1869,8903,2311],{},[1332,8905,4116],{"separator":1353},[1332,8907,8908],{},"…",[1332,8910,4116],{"separator":1353},[1431,8912,8913,8915],{},[1328,8914,1337],{},[1869,8916,2334],{},[1332,8918,8919],{"stretchy":3452},"]",[1332,8921,3464],{},[1332,8923,8888],{"stretchy":3452},[1431,8925,8926,8928],{},[1328,8927,1343],{},[1869,8929,8895],{},[1332,8931,4116],{"separator":1353},[1431,8933,8934,8936],{},[1328,8935,1343],{},[1869,8937,2311],{},[1332,8939,4116],{"separator":1353},[1332,8941,8908],{},[1332,8943,4116],{"separator":1353},[1431,8945,8946,8948],{},[1328,8947,1343],{},[1869,8949,2334],{},[1332,8951,8919],{"stretchy":3452},[1345,8953,8954],{"encoding":1347},"[A_7,A_6,\\dots,A_0] + [B_7,B_6,\\dots,B_0]",[1304,8956,8958,9124],{"className":8957,"ariaHidden":1353},[1352],[1304,8959,8961,8964,8967,9007,9010,9013,9053,9056,9059,9063,9066,9069,9072,9112,9115,9118,9121],{"className":8960},[1357],[1304,8962],{"className":8963,"style":3714},[1361],[1304,8965,8888],{"className":8966},[2611],[1304,8968,8970,8973],{"className":8969},[1366],[1304,8971,1337],{"className":8972},[1366,1367],[1304,8974,8976],{"className":8975},[1498],[1304,8977,8979,8999],{"className":8978},[1502,1503],[1304,8980,8982,8996],{"className":8981},[1507],[1304,8983,8985],{"className":8984,"style":7663},[1511],[1304,8986,8987,8990],{"style":1645},[1304,8988],{"className":8989,"style":1520},[1519],[1304,8991,8993],{"className":8992},[1524,1525,1526,1527],[1304,8994,8895],{"className":8995},[1366,1527],[1304,8997,1540],{"className":8998},[1539],[1304,9000,9002],{"className":9001},[1507],[1304,9003,9005],{"className":9004,"style":1668},[1511],[1304,9006],{},[1304,9008,4116],{"className":9009},[4167],[1304,9011],{"className":9012,"style":1623},[1372],[1304,9014,9016,9019],{"className":9015},[1366],[1304,9017,1337],{"className":9018},[1366,1367],[1304,9020,9022],{"className":9021},[1498],[1304,9023,9025,9045],{"className":9024},[1502,1503],[1304,9026,9028,9042],{"className":9027},[1507],[1304,9029,9031],{"className":9030,"style":7663},[1511],[1304,9032,9033,9036],{"style":1645},[1304,9034],{"className":9035,"style":1520},[1519],[1304,9037,9039],{"className":9038},[1524,1525,1526,1527],[1304,9040,2311],{"className":9041},[1366,1527],[1304,9043,1540],{"className":9044},[1539],[1304,9046,9048],{"className":9047},[1507],[1304,9049,9051],{"className":9050,"style":1668},[1511],[1304,9052],{},[1304,9054,4116],{"className":9055},[4167],[1304,9057],{"className":9058,"style":1623},[1372],[1304,9060,8908],{"className":9061},[9062],"minner",[1304,9064],{"className":9065,"style":1623},[1372],[1304,9067,4116],{"className":9068},[4167],[1304,9070],{"className":9071,"style":1623},[1372],[1304,9073,9075,9078],{"className":9074},[1366],[1304,9076,1337],{"className":9077},[1366,1367],[1304,9079,9081],{"className":9080},[1498],[1304,9082,9084,9104],{"className":9083},[1502,1503],[1304,9085,9087,9101],{"className":9086},[1507],[1304,9088,9090],{"className":9089,"style":7663},[1511],[1304,9091,9092,9095],{"style":1645},[1304,9093],{"className":9094,"style":1520},[1519],[1304,9096,9098],{"className":9097},[1524,1525,1526,1527],[1304,9099,2334],{"className":9100},[1366,1527],[1304,9102,1540],{"className":9103},[1539],[1304,9105,9107],{"className":9106},[1507],[1304,9108,9110],{"className":9109,"style":1668},[1511],[1304,9111],{},[1304,9113,8919],{"className":9114},[2749],[1304,9116],{"className":9117,"style":1394},[1372],[1304,9119,3464],{"className":9120},[1398],[1304,9122],{"className":9123,"style":1394},[1372],[1304,9125,9127,9130,9133,9173,9176,9179,9219,9222,9225,9228,9231,9234,9237,9277],{"className":9126},[1357],[1304,9128],{"className":9129,"style":3714},[1361],[1304,9131,8888],{"className":9132},[2611],[1304,9134,9136,9139],{"className":9135},[1366],[1304,9137,1343],{"className":9138,"style":1411},[1366,1367],[1304,9140,9142],{"className":9141},[1498],[1304,9143,9145,9165],{"className":9144},[1502,1503],[1304,9146,9148,9162],{"className":9147},[1507],[1304,9149,9151],{"className":9150,"style":7663},[1511],[1304,9152,9153,9156],{"style":1706},[1304,9154],{"className":9155,"style":1520},[1519],[1304,9157,9159],{"className":9158},[1524,1525,1526,1527],[1304,9160,8895],{"className":9161},[1366,1527],[1304,9163,1540],{"className":9164},[1539],[1304,9166,9168],{"className":9167},[1507],[1304,9169,9171],{"className":9170,"style":1668},[1511],[1304,9172],{},[1304,9174,4116],{"className":9175},[4167],[1304,9177],{"className":9178,"style":1623},[1372],[1304,9180,9182,9185],{"className":9181},[1366],[1304,9183,1343],{"className":9184,"style":1411},[1366,1367],[1304,9186,9188],{"className":9187},[1498],[1304,9189,9191,9211],{"className":9190},[1502,1503],[1304,9192,9194,9208],{"className":9193},[1507],[1304,9195,9197],{"className":9196,"style":7663},[1511],[1304,9198,9199,9202],{"style":1706},[1304,9200],{"className":9201,"style":1520},[1519],[1304,9203,9205],{"className":9204},[1524,1525,1526,1527],[1304,9206,2311],{"className":9207},[1366,1527],[1304,9209,1540],{"className":9210},[1539],[1304,9212,9214],{"className":9213},[1507],[1304,9215,9217],{"className":9216,"style":1668},[1511],[1304,9218],{},[1304,9220,4116],{"className":9221},[4167],[1304,9223],{"className":9224,"style":1623},[1372],[1304,9226,8908],{"className":9227},[9062],[1304,9229],{"className":9230,"style":1623},[1372],[1304,9232,4116],{"className":9233},[4167],[1304,9235],{"className":9236,"style":1623},[1372],[1304,9238,9240,9243],{"className":9239},[1366],[1304,9241,1343],{"className":9242,"style":1411},[1366,1367],[1304,9244,9246],{"className":9245},[1498],[1304,9247,9249,9269],{"className":9248},[1502,1503],[1304,9250,9252,9266],{"className":9251},[1507],[1304,9253,9255],{"className":9254,"style":7663},[1511],[1304,9256,9257,9260],{"style":1706},[1304,9258],{"className":9259,"style":1520},[1519],[1304,9261,9263],{"className":9262},[1524,1525,1526,1527],[1304,9264,2334],{"className":9265},[1366,1527],[1304,9267,1540],{"className":9268},[1539],[1304,9270,9272],{"className":9271},[1507],[1304,9273,9275],{"className":9274,"style":1668},[1511],[1304,9276],{},[1304,9278,8919],{"className":9279},[2749],[1097,9281,9282],{},"结果是：",[1304,9284,9286],{"className":9285},[1307],[1304,9287,9289,9355],{"className":9288},[1311],[1304,9290,9292],{"className":9291},[1315],[1317,9293,9294],{"xmlns":1319,"display":1320},[1322,9295,9296,9352],{},[1325,9297,9298,9300,9306,9308,9314,9316,9322,9324,9330,9332,9334,9336,9342,9344,9350],{},[1332,9299,8888],{"stretchy":3452},[1431,9301,9302,9304],{},[1328,9303,1337],{},[1869,9305,8895],{},[1332,9307,3464],{},[1431,9309,9310,9312],{},[1328,9311,1343],{},[1869,9313,8895],{},[1332,9315,4116],{"separator":1353},[1431,9317,9318,9320],{},[1328,9319,1337],{},[1869,9321,2311],{},[1332,9323,3464],{},[1431,9325,9326,9328],{},[1328,9327,1343],{},[1869,9329,2311],{},[1332,9331,4116],{"separator":1353},[1332,9333,8908],{},[1332,9335,4116],{"separator":1353},[1431,9337,9338,9340],{},[1328,9339,1337],{},[1869,9341,2334],{},[1332,9343,3464],{},[1431,9345,9346,9348],{},[1328,9347,1343],{},[1869,9349,2334],{},[1332,9351,8919],{"stretchy":3452},[1345,9353,9354],{"encoding":1347},"[A_7+B_7, A_6+B_6, \\dots, A_0+B_0]",[1304,9356,9358,9416,9517,9630],{"className":9357,"ariaHidden":1353},[1352],[1304,9359,9361,9364,9367,9407,9410,9413],{"className":9360},[1357],[1304,9362],{"className":9363,"style":3714},[1361],[1304,9365,8888],{"className":9366},[2611],[1304,9368,9370,9373],{"className":9369},[1366],[1304,9371,1337],{"className":9372},[1366,1367],[1304,9374,9376],{"className":9375},[1498],[1304,9377,9379,9399],{"className":9378},[1502,1503],[1304,9380,9382,9396],{"className":9381},[1507],[1304,9383,9385],{"className":9384,"style":7663},[1511],[1304,9386,9387,9390],{"style":1645},[1304,9388],{"className":9389,"style":1520},[1519],[1304,9391,9393],{"className":9392},[1524,1525,1526,1527],[1304,9394,8895],{"className":9395},[1366,1527],[1304,9397,1540],{"className":9398},[1539],[1304,9400,9402],{"className":9401},[1507],[1304,9403,9405],{"className":9404,"style":1668},[1511],[1304,9406],{},[1304,9408],{"className":9409,"style":1394},[1372],[1304,9411,3464],{"className":9412},[1398],[1304,9414],{"className":9415,"style":1394},[1372],[1304,9417,9419,9422,9462,9465,9468,9508,9511,9514],{"className":9418},[1357],[1304,9420],{"className":9421,"style":4160},[1361],[1304,9423,9425,9428],{"className":9424},[1366],[1304,9426,1343],{"className":9427,"style":1411},[1366,1367],[1304,9429,9431],{"className":9430},[1498],[1304,9432,9434,9454],{"className":9433},[1502,1503],[1304,9435,9437,9451],{"className":9436},[1507],[1304,9438,9440],{"className":9439,"style":7663},[1511],[1304,9441,9442,9445],{"style":1706},[1304,9443],{"className":9444,"style":1520},[1519],[1304,9446,9448],{"className":9447},[1524,1525,1526,1527],[1304,9449,8895],{"className":9450},[1366,1527],[1304,9452,1540],{"className":9453},[1539],[1304,9455,9457],{"className":9456},[1507],[1304,9458,9460],{"className":9459,"style":1668},[1511],[1304,9461],{},[1304,9463,4116],{"className":9464},[4167],[1304,9466],{"className":9467,"style":1623},[1372],[1304,9469,9471,9474],{"className":9470},[1366],[1304,9472,1337],{"className":9473},[1366,1367],[1304,9475,9477],{"className":9476},[1498],[1304,9478,9480,9500],{"className":9479},[1502,1503],[1304,9481,9483,9497],{"className":9482},[1507],[1304,9484,9486],{"className":9485,"style":7663},[1511],[1304,9487,9488,9491],{"style":1645},[1304,9489],{"className":9490,"style":1520},[1519],[1304,9492,9494],{"className":9493},[1524,1525,1526,1527],[1304,9495,2311],{"className":9496},[1366,1527],[1304,9498,1540],{"className":9499},[1539],[1304,9501,9503],{"className":9502},[1507],[1304,9504,9506],{"className":9505,"style":1668},[1511],[1304,9507],{},[1304,9509],{"className":9510,"style":1394},[1372],[1304,9512,3464],{"className":9513},[1398],[1304,9515],{"className":9516,"style":1394},[1372],[1304,9518,9520,9523,9563,9566,9569,9572,9575,9578,9581,9621,9624,9627],{"className":9519},[1357],[1304,9521],{"className":9522,"style":4160},[1361],[1304,9524,9526,9529],{"className":9525},[1366],[1304,9527,1343],{"className":9528,"style":1411},[1366,1367],[1304,9530,9532],{"className":9531},[1498],[1304,9533,9535,9555],{"className":9534},[1502,1503],[1304,9536,9538,9552],{"className":9537},[1507],[1304,9539,9541],{"className":9540,"style":7663},[1511],[1304,9542,9543,9546],{"style":1706},[1304,9544],{"className":9545,"style":1520},[1519],[1304,9547,9549],{"className":9548},[1524,1525,1526,1527],[1304,9550,2311],{"className":9551},[1366,1527],[1304,9553,1540],{"className":9554},[1539],[1304,9556,9558],{"className":9557},[1507],[1304,9559,9561],{"className":9560,"style":1668},[1511],[1304,9562],{},[1304,9564,4116],{"className":9565},[4167],[1304,9567],{"className":9568,"style":1623},[1372],[1304,9570,8908],{"className":9571},[9062],[1304,9573],{"className":9574,"style":1623},[1372],[1304,9576,4116],{"className":9577},[4167],[1304,9579],{"className":9580,"style":1623},[1372],[1304,9582,9584,9587],{"className":9583},[1366],[1304,9585,1337],{"className":9586},[1366,1367],[1304,9588,9590],{"className":9589},[1498],[1304,9591,9593,9613],{"className":9592},[1502,1503],[1304,9594,9596,9610],{"className":9595},[1507],[1304,9597,9599],{"className":9598,"style":7663},[1511],[1304,9600,9601,9604],{"style":1645},[1304,9602],{"className":9603,"style":1520},[1519],[1304,9605,9607],{"className":9606},[1524,1525,1526,1527],[1304,9608,2334],{"className":9609},[1366,1527],[1304,9611,1540],{"className":9612},[1539],[1304,9614,9616],{"className":9615},[1507],[1304,9617,9619],{"className":9618,"style":1668},[1511],[1304,9620],{},[1304,9622],{"className":9623,"style":1394},[1372],[1304,9625,3464],{"className":9626},[1398],[1304,9628],{"className":9629,"style":1394},[1372],[1304,9631,9633,9636,9676],{"className":9632},[1357],[1304,9634],{"className":9635,"style":3714},[1361],[1304,9637,9639,9642],{"className":9638},[1366],[1304,9640,1343],{"className":9641,"style":1411},[1366,1367],[1304,9643,9645],{"className":9644},[1498],[1304,9646,9648,9668],{"className":9647},[1502,1503],[1304,9649,9651,9665],{"className":9650},[1507],[1304,9652,9654],{"className":9653,"style":7663},[1511],[1304,9655,9656,9659],{"style":1706},[1304,9657],{"className":9658,"style":1520},[1519],[1304,9660,9662],{"className":9661},[1524,1525,1526,1527],[1304,9663,2334],{"className":9664},[1366,1527],[1304,9666,1540],{"className":9667},[1539],[1304,9669,9671],{"className":9670},[1507],[1304,9672,9674],{"className":9673,"style":1668},[1511],[1304,9675],{},[1304,9677,8919],{"className":9678},[2749],[1097,9680,6064,9681,1107],{},[1104,9682,9683],{},"每个 lane 独立做同一种操作",[1097,9685,9686,9687,9690],{},"这里有个关键词：",[1104,9688,9689],{},"lane","。\n一个 SIMD 向量可以看成多条 lane，每条 lane 存一个数据元素。SIMD 指令会对每条 lane 做同样的运算。",[1991,9692,9693],{},[1097,9694,9695],{},"SIMD 的本质是一条指令控制多个数据通道，每个通道执行相同操作，从而利用数据级并行。",[1231,9697],{},[1092,9699,9701],{"id":9700},"第-3842-页为什么用-intrinsics","第 38–42 页：为什么用 Intrinsics",[978,9703,9705],{"id":9704},"第-38-页问题编译器不一定能自动生成-simd","第 38 页：问题：编译器不一定能自动生成 SIMD",[1097,9707,9708],{},"课件说，大部分编译器不能总是自动生成很好的 SIMD 代码。原因是编译器需要确认很多事情：",[2284,9710,9711,9714,9717,9720,9723],{},[1212,9712,9713],{},"循环之间有没有数据依赖；",[1212,9715,9716],{},"指针是否别名 alias；",[1212,9718,9719],{},"内存是否对齐；",[1212,9721,9722],{},"分支是否规则；",[1212,9724,9725],{},"数据访问是否连续。",[1097,9727,9728],{},"所以有时需要程序员直接写 SIMD 代码。",[1097,9730,9731],{},"直接写汇编太痛苦，x86 指令太多，所以课件引出一个折中方案：",[1097,9733,9734],{},[1101,9735,9736],{},"用 C 的 intrinsics 直接访问 SIMD 寄存器和指令。",[1991,9738,9739],{},[1097,9740,9741],{},"Intrinsics 可以理解成“长得像 C 函数的汇编指令包装器”。\n它比汇编好写，但仍然非常接近硬件。",[1231,9743],{},[978,9745,9747],{"id":9746},"第-39-页avx-数据类型重要","第 39 页：AVX 数据类型，重要",[1097,9749,9750],{},"课件列了一些 AVX intrinsic 类型：",[982,9752,9753,9761],{},[985,9754,9755],{},[988,9756,9757,9759],{},[991,9758,7341],{},[991,9760,3185],{},[1001,9762,9763,9773,9783,9793,9803],{},[988,9764,9765,9770],{},[1006,9766,9767],{},[1071,9768,9769],{"code":9769},"__m256",[1006,9771,9772],{},"256-bit，8 个 single-precision float",[988,9774,9775,9780],{},[1006,9776,9777],{},[1071,9778,9779],{"code":9779},"__m256d",[1006,9781,9782],{},"256-bit，4 个 double",[988,9784,9785,9790],{},[1006,9786,9787],{},[1071,9788,9789],{"code":9789},"__m256i",[1006,9791,9792],{},"256-bit 整数向量",[988,9794,9795,9800],{},[1006,9796,9797],{},[1071,9798,9799],{"code":9799},"__m128",[1006,9801,9802],{},"128-bit float 向量",[988,9804,9805,9810],{},[1006,9806,9807],{},[1071,9808,9809],{"code":9809},"__m128d",[1006,9811,9812],{},"128-bit double 向量",[1097,9814,9815],{},"这里最重要的是：",[2259,9817,9820],{"className":9818,"code":9819,"language":2768,"meta":2265},[2766],"__m256d\n",[1071,9821,9819],{"__ignoreMap":2265},[1097,9823,9824,9825,1107],{},"它表示一个 256-bit 的向量寄存器，可以装 ",[1104,9826,8551],{},[1097,9828,9829],{},"后面矩阵乘法里会用它一次计算 4 个 double 的乘加。",[1231,9831],{},[978,9833,9835],{"id":9834},"第-4041-页avx-命名法和-_mm256_mul_pd","第 40–41 页：AVX 命名法和 _mm256_mul_pd",[1097,9837,9838],{},"第 40 页讲命名法，不用全背，但几个后缀要看懂：",[982,9840,9841,9850],{},[985,9842,9843],{},[988,9844,9845,9848],{},[991,9846,9847],{},"标记",[991,9849,3185],{},[1001,9851,9852,9864,9874,9884,9894,9903],{},[988,9853,9854,9861],{},[1006,9855,9856,9858,9859],{},[1071,9857,2825],{"code":2825}," \u002F ",[1071,9860,2820],{"code":2820},[1006,9862,9863],{},"single \u002F double",[988,9865,9866,9871],{},[1006,9867,9868],{},[1071,9869,9870],{"code":9870},"ps",[1006,9872,9873],{},"packed single，即多个 float",[988,9875,9876,9881],{},[1006,9877,9878],{},[1071,9879,9880],{"code":9880},"pd",[1006,9882,9883],{},"packed double，即多个 double",[988,9885,9886,9891],{},[1006,9887,9888],{},[1071,9889,9890],{"code":9890},"sd",[1006,9892,9893],{},"scalar double，即单个 double",[988,9895,9896,9900],{},[1006,9897,9898],{},[1071,9899,8501],{"code":8501},[1006,9901,9902],{},"256-bit AVX",[988,9904,9905,9909],{},[1006,9906,9907],{},[1071,9908,1439],{"code":1439},[1006,9910,9911],{},"integer",[1097,9913,8741],{},[2259,9915,9918],{"className":9916,"code":9917,"language":2768,"meta":2265},[2766],"_mm256_mul_pd(a, b)\n",[1071,9919,9917],{"__ignoreMap":2265},[1097,9921,9922],{},"可以拆开看：",[2284,9924,9925,9931,9936,9942],{},[1212,9926,9927,9930],{},[1071,9928,9929],{"code":9929},"_mm","：Intel intrinsic；",[1212,9932,9933,9935],{},[1071,9934,8501],{"code":8501},"：操作 256-bit 向量；",[1212,9937,9938,9941],{},[1071,9939,9940],{"code":9940},"mul","：乘法；",[1212,9943,9944,9946],{},[1071,9945,9880],{"code":9880},"：packed double。",[1097,9948,9949,9950],{},"所以它的意思是：\n",[1104,9951,9952],{},"对两个 256-bit double 向量做逐元素乘法。",[1097,9954,9955,9956,8799,9958,9961],{},"如果 ",[1071,9957,2830],{"code":2830},[1071,9959,9960],{"code":9960},"b"," 各有 4 个 double：",[1304,9963,9965],{"className":9964},[1307],[1304,9966,9968,10018],{"className":9967},[1311],[1304,9969,9971],{"className":9970},[1315],[1317,9972,9973],{"xmlns":1319,"display":1320},[1322,9974,9975,10015],{},[1325,9976,9977,9979,9981,9983,9989,9991,9997,9999,10005,10007,10013],{},[1328,9978,2830],{},[1332,9980,1334],{},[1332,9982,8888],{"stretchy":3452},[1431,9984,9985,9987],{},[1328,9986,2830],{},[1869,9988,2334],{},[1332,9990,4116],{"separator":1353},[1431,9992,9993,9995],{},[1328,9994,2830],{},[1869,9996,2327],{},[1332,9998,4116],{"separator":1353},[1431,10000,10001,10003],{},[1328,10002,2830],{},[1869,10004,1871],{},[1332,10006,4116],{"separator":1353},[1431,10008,10009,10011],{},[1328,10010,2830],{},[1869,10012,1940],{},[1332,10014,8919],{"stretchy":3452},[1345,10016,10017],{"encoding":1347},"a=[a_0,a_1,a_2,a_3]",[1304,10019,10021,10039],{"className":10020,"ariaHidden":1353},[1352],[1304,10022,10024,10027,10030,10033,10036],{"className":10023},[1357],[1304,10025],{"className":10026,"style":4832},[1361],[1304,10028,2830],{"className":10029},[1366,1367],[1304,10031],{"className":10032,"style":1373},[1372],[1304,10034,1334],{"className":10035},[1377],[1304,10037],{"className":10038,"style":1373},[1372],[1304,10040,10042,10045,10048,10088,10091,10094,10134,10137,10140,10180,10183,10186,10226],{"className":10041},[1357],[1304,10043],{"className":10044,"style":3714},[1361],[1304,10046,8888],{"className":10047},[2611],[1304,10049,10051,10054],{"className":10050},[1366],[1304,10052,2830],{"className":10053},[1366,1367],[1304,10055,10057],{"className":10056},[1498],[1304,10058,10060,10080],{"className":10059},[1502,1503],[1304,10061,10063,10077],{"className":10062},[1507],[1304,10064,10066],{"className":10065,"style":7663},[1511],[1304,10067,10068,10071],{"style":1645},[1304,10069],{"className":10070,"style":1520},[1519],[1304,10072,10074],{"className":10073},[1524,1525,1526,1527],[1304,10075,2334],{"className":10076},[1366,1527],[1304,10078,1540],{"className":10079},[1539],[1304,10081,10083],{"className":10082},[1507],[1304,10084,10086],{"className":10085,"style":1668},[1511],[1304,10087],{},[1304,10089,4116],{"className":10090},[4167],[1304,10092],{"className":10093,"style":1623},[1372],[1304,10095,10097,10100],{"className":10096},[1366],[1304,10098,2830],{"className":10099},[1366,1367],[1304,10101,10103],{"className":10102},[1498],[1304,10104,10106,10126],{"className":10105},[1502,1503],[1304,10107,10109,10123],{"className":10108},[1507],[1304,10110,10112],{"className":10111,"style":7663},[1511],[1304,10113,10114,10117],{"style":1645},[1304,10115],{"className":10116,"style":1520},[1519],[1304,10118,10120],{"className":10119},[1524,1525,1526,1527],[1304,10121,2327],{"className":10122},[1366,1527],[1304,10124,1540],{"className":10125},[1539],[1304,10127,10129],{"className":10128},[1507],[1304,10130,10132],{"className":10131,"style":1668},[1511],[1304,10133],{},[1304,10135,4116],{"className":10136},[4167],[1304,10138],{"className":10139,"style":1623},[1372],[1304,10141,10143,10146],{"className":10142},[1366],[1304,10144,2830],{"className":10145},[1366,1367],[1304,10147,10149],{"className":10148},[1498],[1304,10150,10152,10172],{"className":10151},[1502,1503],[1304,10153,10155,10169],{"className":10154},[1507],[1304,10156,10158],{"className":10157,"style":7663},[1511],[1304,10159,10160,10163],{"style":1645},[1304,10161],{"className":10162,"style":1520},[1519],[1304,10164,10166],{"className":10165},[1524,1525,1526,1527],[1304,10167,1871],{"className":10168},[1366,1527],[1304,10170,1540],{"className":10171},[1539],[1304,10173,10175],{"className":10174},[1507],[1304,10176,10178],{"className":10177,"style":1668},[1511],[1304,10179],{},[1304,10181,4116],{"className":10182},[4167],[1304,10184],{"className":10185,"style":1623},[1372],[1304,10187,10189,10192],{"className":10188},[1366],[1304,10190,2830],{"className":10191},[1366,1367],[1304,10193,10195],{"className":10194},[1498],[1304,10196,10198,10218],{"className":10197},[1502,1503],[1304,10199,10201,10215],{"className":10200},[1507],[1304,10202,10204],{"className":10203,"style":7663},[1511],[1304,10205,10206,10209],{"style":1645},[1304,10207],{"className":10208,"style":1520},[1519],[1304,10210,10212],{"className":10211},[1524,1525,1526,1527],[1304,10213,1940],{"className":10214},[1366,1527],[1304,10216,1540],{"className":10217},[1539],[1304,10219,10221],{"className":10220},[1507],[1304,10222,10224],{"className":10223,"style":1668},[1511],[1304,10225],{},[1304,10227,8919],{"className":10228},[2749],[1304,10230,10232],{"className":10231},[1307],[1304,10233,10235,10285],{"className":10234},[1311],[1304,10236,10238],{"className":10237},[1315],[1317,10239,10240],{"xmlns":1319,"display":1320},[1322,10241,10242,10282],{},[1325,10243,10244,10246,10248,10250,10256,10258,10264,10266,10272,10274,10280],{},[1328,10245,9960],{},[1332,10247,1334],{},[1332,10249,8888],{"stretchy":3452},[1431,10251,10252,10254],{},[1328,10253,9960],{},[1869,10255,2334],{},[1332,10257,4116],{"separator":1353},[1431,10259,10260,10262],{},[1328,10261,9960],{},[1869,10263,2327],{},[1332,10265,4116],{"separator":1353},[1431,10267,10268,10270],{},[1328,10269,9960],{},[1869,10271,1871],{},[1332,10273,4116],{"separator":1353},[1431,10275,10276,10278],{},[1328,10277,9960],{},[1869,10279,1940],{},[1332,10281,8919],{"stretchy":3452},[1345,10283,10284],{"encoding":1347},"b=[b_0,b_1,b_2,b_3]",[1304,10286,10288,10306],{"className":10287,"ariaHidden":1353},[1352],[1304,10289,10291,10294,10297,10300,10303],{"className":10290},[1357],[1304,10292],{"className":10293,"style":1845},[1361],[1304,10295,9960],{"className":10296},[1366,1367],[1304,10298],{"className":10299,"style":1373},[1372],[1304,10301,1334],{"className":10302},[1377],[1304,10304],{"className":10305,"style":1373},[1372],[1304,10307,10309,10312,10315,10355,10358,10361,10401,10404,10407,10447,10450,10453,10493],{"className":10308},[1357],[1304,10310],{"className":10311,"style":3714},[1361],[1304,10313,8888],{"className":10314},[2611],[1304,10316,10318,10321],{"className":10317},[1366],[1304,10319,9960],{"className":10320},[1366,1367],[1304,10322,10324],{"className":10323},[1498],[1304,10325,10327,10347],{"className":10326},[1502,1503],[1304,10328,10330,10344],{"className":10329},[1507],[1304,10331,10333],{"className":10332,"style":7663},[1511],[1304,10334,10335,10338],{"style":1645},[1304,10336],{"className":10337,"style":1520},[1519],[1304,10339,10341],{"className":10340},[1524,1525,1526,1527],[1304,10342,2334],{"className":10343},[1366,1527],[1304,10345,1540],{"className":10346},[1539],[1304,10348,10350],{"className":10349},[1507],[1304,10351,10353],{"className":10352,"style":1668},[1511],[1304,10354],{},[1304,10356,4116],{"className":10357},[4167],[1304,10359],{"className":10360,"style":1623},[1372],[1304,10362,10364,10367],{"className":10363},[1366],[1304,10365,9960],{"className":10366},[1366,1367],[1304,10368,10370],{"className":10369},[1498],[1304,10371,10373,10393],{"className":10372},[1502,1503],[1304,10374,10376,10390],{"className":10375},[1507],[1304,10377,10379],{"className":10378,"style":7663},[1511],[1304,10380,10381,10384],{"style":1645},[1304,10382],{"className":10383,"style":1520},[1519],[1304,10385,10387],{"className":10386},[1524,1525,1526,1527],[1304,10388,2327],{"className":10389},[1366,1527],[1304,10391,1540],{"className":10392},[1539],[1304,10394,10396],{"className":10395},[1507],[1304,10397,10399],{"className":10398,"style":1668},[1511],[1304,10400],{},[1304,10402,4116],{"className":10403},[4167],[1304,10405],{"className":10406,"style":1623},[1372],[1304,10408,10410,10413],{"className":10409},[1366],[1304,10411,9960],{"className":10412},[1366,1367],[1304,10414,10416],{"className":10415},[1498],[1304,10417,10419,10439],{"className":10418},[1502,1503],[1304,10420,10422,10436],{"className":10421},[1507],[1304,10423,10425],{"className":10424,"style":7663},[1511],[1304,10426,10427,10430],{"style":1645},[1304,10428],{"className":10429,"style":1520},[1519],[1304,10431,10433],{"className":10432},[1524,1525,1526,1527],[1304,10434,1871],{"className":10435},[1366,1527],[1304,10437,1540],{"className":10438},[1539],[1304,10440,10442],{"className":10441},[1507],[1304,10443,10445],{"className":10444,"style":1668},[1511],[1304,10446],{},[1304,10448,4116],{"className":10449},[4167],[1304,10451],{"className":10452,"style":1623},[1372],[1304,10454,10456,10459],{"className":10455},[1366],[1304,10457,9960],{"className":10458},[1366,1367],[1304,10460,10462],{"className":10461},[1498],[1304,10463,10465,10485],{"className":10464},[1502,1503],[1304,10466,10468,10482],{"className":10467},[1507],[1304,10469,10471],{"className":10470,"style":7663},[1511],[1304,10472,10473,10476],{"style":1645},[1304,10474],{"className":10475,"style":1520},[1519],[1304,10477,10479],{"className":10478},[1524,1525,1526,1527],[1304,10480,1940],{"className":10481},[1366,1527],[1304,10483,1540],{"className":10484},[1539],[1304,10486,10488],{"className":10487},[1507],[1304,10489,10491],{"className":10490,"style":1668},[1511],[1304,10492],{},[1304,10494,8919],{"className":10495},[2749],[1097,10497,4838],{},[1304,10499,10501],{"className":10500},[1307],[1304,10502,10504,10611],{"className":10503},[1311],[1304,10505,10507],{"className":10506},[1315],[1317,10508,10509],{"xmlns":1319,"display":1320},[1322,10510,10511,10608],{},[1325,10512,10513,10519,10521,10527,10529,10536,10538,10540,10542,10544,10546,10548,10550,10552,10558,10564,10566,10572,10578,10580,10586,10592,10594,10600,10606],{},[1431,10514,10515,10517],{},[1325,10516],{},[1328,10518,4970],{},[1328,10520,4970],{},[1431,10522,10523,10525],{},[1869,10524,8501],{},[1328,10526,4970],{},[1328,10528,3439],{},[1431,10530,10531,10534],{},[1328,10532,10533],{},"l",[1328,10535,1097],{},[1328,10537,2820],{},[1332,10539,3247],{"stretchy":3452},[1328,10541,2830],{},[1332,10543,4116],{"separator":1353},[1328,10545,9960],{},[1332,10547,3461],{"stretchy":3452},[1332,10549,1334],{},[1332,10551,8888],{"stretchy":3452},[1431,10553,10554,10556],{},[1328,10555,2830],{},[1869,10557,2334],{},[1431,10559,10560,10562],{},[1328,10561,9960],{},[1869,10563,2334],{},[1332,10565,4116],{"separator":1353},[1431,10567,10568,10570],{},[1328,10569,2830],{},[1869,10571,2327],{},[1431,10573,10574,10576],{},[1328,10575,9960],{},[1869,10577,2327],{},[1332,10579,4116],{"separator":1353},[1431,10581,10582,10584],{},[1328,10583,2830],{},[1869,10585,1871],{},[1431,10587,10588,10590],{},[1328,10589,9960],{},[1869,10591,1871],{},[1332,10593,4116],{"separator":1353},[1431,10595,10596,10598],{},[1328,10597,2830],{},[1869,10599,1940],{},[1431,10601,10602,10604],{},[1328,10603,9960],{},[1869,10605,1940],{},[1332,10607,8919],{"stretchy":3452},[1345,10609,10610],{"encoding":1347},"_mm256_mul_pd(a,b)=[a_0b_0,a_1b_1,a_2b_2,a_3b_3]",[1304,10612,10614,10783],{"className":10613,"ariaHidden":1353},[1352],[1304,10615,10617,10621,10661,10664,10668,10708,10711,10753,10756,10759,10762,10765,10768,10771,10774,10777,10780],{"className":10616},[1357],[1304,10618],{"className":10619,"style":10620},[1361],"height:1.0361em;vertical-align:-0.2861em;",[1304,10622,10624,10626],{"className":10623},[1366],[1304,10625],{},[1304,10627,10629],{"className":10628},[1498],[1304,10630,10632,10653],{"className":10631},[1502,1503],[1304,10633,10635,10650],{"className":10634},[1507],[1304,10636,10638],{"className":10637,"style":5020},[1511],[1304,10639,10641,10644],{"style":10640},"top:-2.55em;margin-right:0.05em;",[1304,10642],{"className":10643,"style":1520},[1519],[1304,10645,10647],{"className":10646},[1524,1525,1526,1527],[1304,10648,4970],{"className":10649},[1366,1367,1527],[1304,10651,1540],{"className":10652},[1539],[1304,10654,10656],{"className":10655},[1507],[1304,10657,10659],{"className":10658,"style":1668},[1511],[1304,10660],{},[1304,10662,4970],{"className":10663},[1366,1367],[1304,10665,10667],{"className":10666},[1366],"25",[1304,10669,10671,10674],{"className":10670},[1366],[1304,10672,2311],{"className":10673},[1366],[1304,10675,10677],{"className":10676},[1498],[1304,10678,10680,10700],{"className":10679},[1502,1503],[1304,10681,10683,10697],{"className":10682},[1507],[1304,10684,10686],{"className":10685,"style":5020},[1511],[1304,10687,10688,10691],{"style":1645},[1304,10689],{"className":10690,"style":1520},[1519],[1304,10692,10694],{"className":10693},[1524,1525,1526,1527],[1304,10695,4970],{"className":10696},[1366,1367,1527],[1304,10698,1540],{"className":10699},[1539],[1304,10701,10703],{"className":10702},[1507],[1304,10704,10706],{"className":10705,"style":1668},[1511],[1304,10707],{},[1304,10709,3439],{"className":10710},[1366,1367],[1304,10712,10714,10718],{"className":10713},[1366],[1304,10715,10533],{"className":10716,"style":10717},[1366,1367],"margin-right:0.0197em;",[1304,10719,10721],{"className":10720},[1498],[1304,10722,10724,10745],{"className":10723},[1502,1503],[1304,10725,10727,10742],{"className":10726},[1507],[1304,10728,10730],{"className":10729,"style":5020},[1511],[1304,10731,10733,10736],{"style":10732},"top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;",[1304,10734],{"className":10735,"style":1520},[1519],[1304,10737,10739],{"className":10738},[1524,1525,1526,1527],[1304,10740,1097],{"className":10741},[1366,1367,1527],[1304,10743,1540],{"className":10744},[1539],[1304,10746,10748],{"className":10747},[1507],[1304,10749,10751],{"className":10750,"style":1547},[1511],[1304,10752],{},[1304,10754,2820],{"className":10755},[1366,1367],[1304,10757,3247],{"className":10758},[2611],[1304,10760,2830],{"className":10761},[1366,1367],[1304,10763,4116],{"className":10764},[4167],[1304,10766],{"className":10767,"style":1623},[1372],[1304,10769,9960],{"className":10770},[1366,1367],[1304,10772,3461],{"className":10773},[2749],[1304,10775],{"className":10776,"style":1373},[1372],[1304,10778,1334],{"className":10779},[1377],[1304,10781],{"className":10782,"style":1373},[1372],[1304,10784,10786,10789,10792,10832,10872,10875,10878,10918,10958,10961,10964,11004,11044,11047,11050,11090,11130],{"className":10785},[1357],[1304,10787],{"className":10788,"style":3714},[1361],[1304,10790,8888],{"className":10791},[2611],[1304,10793,10795,10798],{"className":10794},[1366],[1304,10796,2830],{"className":10797},[1366,1367],[1304,10799,10801],{"className":10800},[1498],[1304,10802,10804,10824],{"className":10803},[1502,1503],[1304,10805,10807,10821],{"className":10806},[1507],[1304,10808,10810],{"className":10809,"style":7663},[1511],[1304,10811,10812,10815],{"style":1645},[1304,10813],{"className":10814,"style":1520},[1519],[1304,10816,10818],{"className":10817},[1524,1525,1526,1527],[1304,10819,2334],{"className":10820},[1366,1527],[1304,10822,1540],{"className":10823},[1539],[1304,10825,10827],{"className":10826},[1507],[1304,10828,10830],{"className":10829,"style":1668},[1511],[1304,10831],{},[1304,10833,10835,10838],{"className":10834},[1366],[1304,10836,9960],{"className":10837},[1366,1367],[1304,10839,10841],{"className":10840},[1498],[1304,10842,10844,10864],{"className":10843},[1502,1503],[1304,10845,10847,10861],{"className":10846},[1507],[1304,10848,10850],{"className":10849,"style":7663},[1511],[1304,10851,10852,10855],{"style":1645},[1304,10853],{"className":10854,"style":1520},[1519],[1304,10856,10858],{"className":10857},[1524,1525,1526,1527],[1304,10859,2334],{"className":10860},[1366,1527],[1304,10862,1540],{"className":10863},[1539],[1304,10865,10867],{"className":10866},[1507],[1304,10868,10870],{"className":10869,"style":1668},[1511],[1304,10871],{},[1304,10873,4116],{"className":10874},[4167],[1304,10876],{"className":10877,"style":1623},[1372],[1304,10879,10881,10884],{"className":10880},[1366],[1304,10882,2830],{"className":10883},[1366,1367],[1304,10885,10887],{"className":10886},[1498],[1304,10888,10890,10910],{"className":10889},[1502,1503],[1304,10891,10893,10907],{"className":10892},[1507],[1304,10894,10896],{"className":10895,"style":7663},[1511],[1304,10897,10898,10901],{"style":1645},[1304,10899],{"className":10900,"style":1520},[1519],[1304,10902,10904],{"className":10903},[1524,1525,1526,1527],[1304,10905,2327],{"className":10906},[1366,1527],[1304,10908,1540],{"className":10909},[1539],[1304,10911,10913],{"className":10912},[1507],[1304,10914,10916],{"className":10915,"style":1668},[1511],[1304,10917],{},[1304,10919,10921,10924],{"className":10920},[1366],[1304,10922,9960],{"className":10923},[1366,1367],[1304,10925,10927],{"className":10926},[1498],[1304,10928,10930,10950],{"className":10929},[1502,1503],[1304,10931,10933,10947],{"className":10932},[1507],[1304,10934,10936],{"className":10935,"style":7663},[1511],[1304,10937,10938,10941],{"style":1645},[1304,10939],{"className":10940,"style":1520},[1519],[1304,10942,10944],{"className":10943},[1524,1525,1526,1527],[1304,10945,2327],{"className":10946},[1366,1527],[1304,10948,1540],{"className":10949},[1539],[1304,10951,10953],{"className":10952},[1507],[1304,10954,10956],{"className":10955,"style":1668},[1511],[1304,10957],{},[1304,10959,4116],{"className":10960},[4167],[1304,10962],{"className":10963,"style":1623},[1372],[1304,10965,10967,10970],{"className":10966},[1366],[1304,10968,2830],{"className":10969},[1366,1367],[1304,10971,10973],{"className":10972},[1498],[1304,10974,10976,10996],{"className":10975},[1502,1503],[1304,10977,10979,10993],{"className":10978},[1507],[1304,10980,10982],{"className":10981,"style":7663},[1511],[1304,10983,10984,10987],{"style":1645},[1304,10985],{"className":10986,"style":1520},[1519],[1304,10988,10990],{"className":10989},[1524,1525,1526,1527],[1304,10991,1871],{"className":10992},[1366,1527],[1304,10994,1540],{"className":10995},[1539],[1304,10997,10999],{"className":10998},[1507],[1304,11000,11002],{"className":11001,"style":1668},[1511],[1304,11003],{},[1304,11005,11007,11010],{"className":11006},[1366],[1304,11008,9960],{"className":11009},[1366,1367],[1304,11011,11013],{"className":11012},[1498],[1304,11014,11016,11036],{"className":11015},[1502,1503],[1304,11017,11019,11033],{"className":11018},[1507],[1304,11020,11022],{"className":11021,"style":7663},[1511],[1304,11023,11024,11027],{"style":1645},[1304,11025],{"className":11026,"style":1520},[1519],[1304,11028,11030],{"className":11029},[1524,1525,1526,1527],[1304,11031,1871],{"className":11032},[1366,1527],[1304,11034,1540],{"className":11035},[1539],[1304,11037,11039],{"className":11038},[1507],[1304,11040,11042],{"className":11041,"style":1668},[1511],[1304,11043],{},[1304,11045,4116],{"className":11046},[4167],[1304,11048],{"className":11049,"style":1623},[1372],[1304,11051,11053,11056],{"className":11052},[1366],[1304,11054,2830],{"className":11055},[1366,1367],[1304,11057,11059],{"className":11058},[1498],[1304,11060,11062,11082],{"className":11061},[1502,1503],[1304,11063,11065,11079],{"className":11064},[1507],[1304,11066,11068],{"className":11067,"style":7663},[1511],[1304,11069,11070,11073],{"style":1645},[1304,11071],{"className":11072,"style":1520},[1519],[1304,11074,11076],{"className":11075},[1524,1525,1526,1527],[1304,11077,1940],{"className":11078},[1366,1527],[1304,11080,1540],{"className":11081},[1539],[1304,11083,11085],{"className":11084},[1507],[1304,11086,11088],{"className":11087,"style":1668},[1511],[1304,11089],{},[1304,11091,11093,11096],{"className":11092},[1366],[1304,11094,9960],{"className":11095},[1366,1367],[1304,11097,11099],{"className":11098},[1498],[1304,11100,11102,11122],{"className":11101},[1502,1503],[1304,11103,11105,11119],{"className":11104},[1507],[1304,11106,11108],{"className":11107,"style":7663},[1511],[1304,11109,11110,11113],{"style":1645},[1304,11111],{"className":11112,"style":1520},[1519],[1304,11114,11116],{"className":11115},[1524,1525,1526,1527],[1304,11117,1940],{"className":11118},[1366,1527],[1304,11120,1540],{"className":11121},[1539],[1304,11123,11125],{"className":11124},[1507],[1304,11126,11128],{"className":11127,"style":1668},[1511],[1304,11129],{},[1304,11131,8919],{"className":11132},[2749],[1097,11134,11135,11136,11139,11140,11143,11144,11147],{},"第 41 页还给出一个性能信息：",[1071,11137,11138],{"code":11138},"mul_pd"," 一条指令可以做 ",[1104,11141,11142],{},"4 个并行乘法","，并且某些架构上吞吐率可以达到 ",[1104,11145,11146],{},"每周期 2 条指令，CPI = 0.5","。这个后面会用来算理论峰值。",[1231,11149],{},[978,11151,11153],{"id":11152},"第-42-页原始双精度吞吐量重要","第 42 页：原始双精度吞吐量，重要",[1097,11155,11156],{},"课件用 i7-5557U 算峰值：",[982,11158,11159,11169],{},[985,11160,11161],{},[988,11162,11163,11166],{},[991,11164,11165],{},"项",[991,11167,11168],{},"值",[1001,11170,11171,11179,11189,11196],{},[988,11172,11173,11176],{},[1006,11174,11175],{},"时钟",[1006,11177,11178],{},"3.1 GHz",[988,11180,11181,11187],{},[1006,11182,11183,11184,11186],{},"每周期 ",[1071,11185,11138],{"code":11138}," 指令数",[1006,11188,1871],{},[988,11190,11191,11194],{},[1006,11192,11193],{},"每条指令并行 double 乘法数",[1006,11195,8511],{},[988,11197,11198,11201],{},[1006,11199,11200],{},"峰值双精度 FLOPS",[1006,11202,11203],{},"24.8 GFLOPS",[1097,11205,11206],{},"计算方法是：",[1304,11208,11210],{"className":11209},[1307],[1304,11211,11213,11257],{"className":11212},[1311],[1304,11214,11216],{"className":11215},[1315],[1317,11217,11218],{"xmlns":1319,"display":1320},[1322,11219,11220,11254],{},[1325,11221,11222,11225,11227,11233,11235,11237,11239,11241,11243,11246,11248],{},[1869,11223,11224],{},"3.1",[1332,11226,1340],{},[1863,11228,11229,11231],{},[1869,11230,2308],{},[1869,11232,2382],{},[1332,11234,1340],{},[1869,11236,1871],{},[1332,11238,1340],{},[1869,11240,8511],{},[1332,11242,1334],{},[1869,11244,11245],{},"24.8",[1332,11247,1340],{},[1863,11249,11250,11252],{},[1869,11251,2308],{},[1869,11253,2382],{},[1345,11255,11256],{"encoding":1347},"3.1 \\times 10^9 \\times 2 \\times 4 = 24.8 \\times 10^9",[1304,11258,11260,11278,11326,11344,11362,11380],{"className":11259,"ariaHidden":1353},[1352],[1304,11261,11263,11266,11269,11272,11275],{"className":11262},[1357],[1304,11264],{"className":11265,"style":3312},[1361],[1304,11267,11224],{"className":11268},[1366],[1304,11270],{"className":11271,"style":1394},[1372],[1304,11273,1340],{"className":11274},[1398],[1304,11276],{"className":11277,"style":1394},[1372],[1304,11279,11281,11285,11288,11317,11320,11323],{"className":11280},[1357],[1304,11282],{"className":11283,"style":11284},[1361],"height:0.9474em;vertical-align:-0.0833em;",[1304,11286,2327],{"className":11287},[1366],[1304,11289,11291,11294],{"className":11290},[1366],[1304,11292,2334],{"className":11293},[1366],[1304,11295,11297],{"className":11296},[1498],[1304,11298,11300],{"className":11299},[1502],[1304,11301,11303],{"className":11302},[1507],[1304,11304,11306],{"className":11305,"style":1953},[1511],[1304,11307,11308,11311],{"style":1977},[1304,11309],{"className":11310,"style":1520},[1519],[1304,11312,11314],{"className":11313},[1524,1525,1526,1527],[1304,11315,2382],{"className":11316},[1366,1527],[1304,11318],{"className":11319,"style":1394},[1372],[1304,11321,1340],{"className":11322},[1398],[1304,11324],{"className":11325,"style":1394},[1372],[1304,11327,11329,11332,11335,11338,11341],{"className":11328},[1357],[1304,11330],{"className":11331,"style":3312},[1361],[1304,11333,1871],{"className":11334},[1366],[1304,11336],{"className":11337,"style":1394},[1372],[1304,11339,1340],{"className":11340},[1398],[1304,11342],{"className":11343,"style":1394},[1372],[1304,11345,11347,11350,11353,11356,11359],{"className":11346},[1357],[1304,11348],{"className":11349,"style":4230},[1361],[1304,11351,8511],{"className":11352},[1366],[1304,11354],{"className":11355,"style":1373},[1372],[1304,11357,1334],{"className":11358},[1377],[1304,11360],{"className":11361,"style":1373},[1372],[1304,11363,11365,11368,11371,11374,11377],{"className":11364},[1357],[1304,11366],{"className":11367,"style":3312},[1361],[1304,11369,11245],{"className":11370},[1366],[1304,11372],{"className":11373,"style":1394},[1372],[1304,11375,1340],{"className":11376},[1398],[1304,11378],{"className":11379,"style":1394},[1372],[1304,11381,11383,11386,11389],{"className":11382},[1357],[1304,11384],{"className":11385,"style":1953},[1361],[1304,11387,2327],{"className":11388},[1366],[1304,11390,11392,11395],{"className":11391},[1366],[1304,11393,2334],{"className":11394},[1366],[1304,11396,11398],{"className":11397},[1498],[1304,11399,11401],{"className":11400},[1502],[1304,11402,11404],{"className":11403},[1507],[1304,11405,11407],{"className":11406,"style":1953},[1511],[1304,11408,11409,11412],{"style":1977},[1304,11410],{"className":11411,"style":1520},[1519],[1304,11413,11415],{"className":11414},[1524,1525,1526,1527],[1304,11416,2382],{"className":11417},[1366,1527],[1097,11419,11420],{},"所以峰值是：",[1304,11422,11424],{"className":11423},[1307],[1304,11425,11427,11455],{"className":11426},[1311],[1304,11428,11430],{"className":11429},[1315],[1317,11431,11432],{"xmlns":1319,"display":1320},[1322,11433,11434,11452],{},[1325,11435,11436,11438,11440,11442,11444,11446,11448,11450],{},[1869,11437,11245],{},[3995,11439,7582],{},[1328,11441,2514],{},[1328,11443,2517],{},[1328,11445,2520],{},[1328,11447,2523],{},[1328,11449,2526],{},[1328,11451,2529],{},[1345,11453,11454],{"encoding":1347},"24.8\\ GFLOPS",[1304,11456,11458],{"className":11457,"ariaHidden":1353},[1352],[1304,11459,11461,11464,11467,11470,11473,11476,11479,11482],{"className":11460},[1357],[1304,11462],{"className":11463,"style":1362},[1361],[1304,11465,11245],{"className":11466},[1366],[1304,11468,7582],{"className":11469},[1372],[1304,11471,2574],{"className":11472,"style":2573},[1366,1367],[1304,11474,2520],{"className":11475},[1366,1367],[1304,11477,2523],{"className":11478,"style":2581},[1366,1367],[1304,11480,2526],{"className":11481,"style":2573},[1366,1367],[1304,11483,2529],{"className":11484,"style":2588},[1366,1367],[1097,11486,11487,11488,11491],{},"注意，",[1101,11489,11490],{},"这只是理想上限","。后面实际 dgemm 远低于这个数，说明限制性能的不只是浮点运算单元。",[1231,11493],{},[1092,11495,11497],{"id":11496},"第-4345-页向量化矩阵乘法重要","第 43–45 页：向量化矩阵乘法，重要",[1097,11499,11500],{},"这几页开始把 SIMD 用到之前的矩阵乘法 dgemm 上。",[978,11502,11504],{"id":11503},"第-4344-页vectorized-matrix-multiplication必须懂","第 43–44 页：Vectorized Matrix Multiplication，必须懂",[1097,11506,11507,11508,11584,11585,1107],{},"原来的 scalar dgemm 一次算一个 (",[1304,11509,11511,11532],{"className":11510},[1311],[1304,11512,11514],{"className":11513},[1315],[1317,11515,11516],{"xmlns":1319},[1322,11517,11518,11530],{},[1325,11519,11520],{},[1431,11521,11522,11524],{},[1328,11523,1330],{},[1325,11525,11526,11528],{},[1328,11527,1439],{},[1328,11529,1442],{},[1345,11531,1766],{"encoding":1347},[1304,11533,11535],{"className":11534,"ariaHidden":1353},[1352],[1304,11536,11538,11541],{"className":11537},[1357],[1304,11539],{"className":11540,"style":1488},[1361],[1304,11542,11544,11547],{"className":11543},[1366],[1304,11545,1330],{"className":11546,"style":1368},[1366,1367],[1304,11548,11550],{"className":11549},[1498],[1304,11551,11553,11576],{"className":11552},[1502,1503],[1304,11554,11556,11573],{"className":11555},[1507],[1304,11557,11559],{"className":11558,"style":1512},[1511],[1304,11560,11561,11564],{"style":1515},[1304,11562],{"className":11563,"style":1520},[1519],[1304,11565,11567],{"className":11566},[1524,1525,1526,1527],[1304,11568,11570],{"className":11569},[1366,1527],[1304,11571,1535],{"className":11572,"style":1534},[1366,1367,1527],[1304,11574,1540],{"className":11575},[1539],[1304,11577,11579],{"className":11578},[1507],[1304,11580,11582],{"className":11581,"style":1547},[1511],[1304,11583],{},")。\n现在 AVX 一次能放 4 个 double，所以改成一次算 ",[1104,11586,11587],{},"4 个 C 元素",[1097,11589,11590],{},[1246,11591],{"alt":1246,"src":11592},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-13.png",[1097,11594,11595],{},"课件里的外层循环变成：",[2259,11597,11600],{"className":11598,"code":11599,"language":2768,"meta":2265},[2766],"for (int i = 0; i \u003C N; i += 4)\n",[1071,11601,11599],{"__ignoreMap":2265},[1097,11603,11604],{},"也就是 (i) 每次加 4。",[1097,11606,11607],{},"核心思想是：一次计算：",[1304,11609,11611],{"className":11610},[1307],[1304,11612,11614,11692],{"className":11613},[1311],[1304,11615,11617],{"className":11616},[1315],[1317,11618,11619],{"xmlns":1319,"display":1320},[1322,11620,11621,11689],{},[1325,11622,11623,11635,11637,11653,11655,11671,11673],{},[1431,11624,11625,11627],{},[1328,11626,1330],{},[1325,11628,11629,11631,11633],{},[1328,11630,1439],{},[1332,11632,4116],{"separator":1353},[1328,11634,1442],{},[1332,11636,4116],{"separator":1353},[1431,11638,11639,11641],{},[1328,11640,1330],{},[1325,11642,11643,11645,11647,11649,11651],{},[1328,11644,1439],{},[1332,11646,3464],{},[1869,11648,2327],{},[1332,11650,4116],{"separator":1353},[1328,11652,1442],{},[1332,11654,4116],{"separator":1353},[1431,11656,11657,11659],{},[1328,11658,1330],{},[1325,11660,11661,11663,11665,11667,11669],{},[1328,11662,1439],{},[1332,11664,3464],{},[1869,11666,1871],{},[1332,11668,4116],{"separator":1353},[1328,11670,1442],{},[1332,11672,4116],{"separator":1353},[1431,11674,11675,11677],{},[1328,11676,1330],{},[1325,11678,11679,11681,11683,11685,11687],{},[1328,11680,1439],{},[1332,11682,3464],{},[1869,11684,1940],{},[1332,11686,4116],{"separator":1353},[1328,11688,1442],{},[1345,11690,11691],{"encoding":1347},"C_{i,j}, C_{i+1,j}, C_{i+2,j}, C_{i+3,j}",[1304,11693,11695],{"className":11694,"ariaHidden":1353},[1352],[1304,11696,11698,11701,11750,11753,11756,11811,11814,11817,11872,11875,11878],{"className":11697},[1357],[1304,11699],{"className":11700,"style":1488},[1361],[1304,11702,11704,11707],{"className":11703},[1366],[1304,11705,1330],{"className":11706,"style":1368},[1366,1367],[1304,11708,11710],{"className":11709},[1498],[1304,11711,11713,11742],{"className":11712},[1502,1503],[1304,11714,11716,11739],{"className":11715},[1507],[1304,11717,11719],{"className":11718,"style":1512},[1511],[1304,11720,11721,11724],{"style":1515},[1304,11722],{"className":11723,"style":1520},[1519],[1304,11725,11727],{"className":11726},[1524,1525,1526,1527],[1304,11728,11730,11733,11736],{"className":11729},[1366,1527],[1304,11731,1439],{"className":11732},[1366,1367,1527],[1304,11734,4116],{"className":11735},[4167,1527],[1304,11737,1442],{"className":11738,"style":1534},[1366,1367,1527],[1304,11740,1540],{"className":11741},[1539],[1304,11743,11745],{"className":11744},[1507],[1304,11746,11748],{"className":11747,"style":1547},[1511],[1304,11749],{},[1304,11751,4116],{"className":11752},[4167],[1304,11754],{"className":11755,"style":1623},[1372],[1304,11757,11759,11762],{"className":11758},[1366],[1304,11760,1330],{"className":11761,"style":1368},[1366,1367],[1304,11763,11765],{"className":11764},[1498],[1304,11766,11768,11803],{"className":11767},[1502,1503],[1304,11769,11771,11800],{"className":11770},[1507],[1304,11772,11774],{"className":11773,"style":1512},[1511],[1304,11775,11776,11779],{"style":1515},[1304,11777],{"className":11778,"style":1520},[1519],[1304,11780,11782],{"className":11781},[1524,1525,1526,1527],[1304,11783,11785,11788,11791,11794,11797],{"className":11784},[1366,1527],[1304,11786,1439],{"className":11787},[1366,1367,1527],[1304,11789,3464],{"className":11790},[1398,1527],[1304,11792,2327],{"className":11793},[1366,1527],[1304,11795,4116],{"className":11796},[4167,1527],[1304,11798,1442],{"className":11799,"style":1534},[1366,1367,1527],[1304,11801,1540],{"className":11802},[1539],[1304,11804,11806],{"className":11805},[1507],[1304,11807,11809],{"className":11808,"style":1547},[1511],[1304,11810],{},[1304,11812,4116],{"className":11813},[4167],[1304,11815],{"className":11816,"style":1623},[1372],[1304,11818,11820,11823],{"className":11819},[1366],[1304,11821,1330],{"className":11822,"style":1368},[1366,1367],[1304,11824,11826],{"className":11825},[1498],[1304,11827,11829,11864],{"className":11828},[1502,1503],[1304,11830,11832,11861],{"className":11831},[1507],[1304,11833,11835],{"className":11834,"style":1512},[1511],[1304,11836,11837,11840],{"style":1515},[1304,11838],{"className":11839,"style":1520},[1519],[1304,11841,11843],{"className":11842},[1524,1525,1526,1527],[1304,11844,11846,11849,11852,11855,11858],{"className":11845},[1366,1527],[1304,11847,1439],{"className":11848},[1366,1367,1527],[1304,11850,3464],{"className":11851},[1398,1527],[1304,11853,1871],{"className":11854},[1366,1527],[1304,11856,4116],{"className":11857},[4167,1527],[1304,11859,1442],{"className":11860,"style":1534},[1366,1367,1527],[1304,11862,1540],{"className":11863},[1539],[1304,11865,11867],{"className":11866},[1507],[1304,11868,11870],{"className":11869,"style":1547},[1511],[1304,11871],{},[1304,11873,4116],{"className":11874},[4167],[1304,11876],{"className":11877,"style":1623},[1372],[1304,11879,11881,11884],{"className":11880},[1366],[1304,11882,1330],{"className":11883,"style":1368},[1366,1367],[1304,11885,11887],{"className":11886},[1498],[1304,11888,11890,11925],{"className":11889},[1502,1503],[1304,11891,11893,11922],{"className":11892},[1507],[1304,11894,11896],{"className":11895,"style":1512},[1511],[1304,11897,11898,11901],{"style":1515},[1304,11899],{"className":11900,"style":1520},[1519],[1304,11902,11904],{"className":11903},[1524,1525,1526,1527],[1304,11905,11907,11910,11913,11916,11919],{"className":11906},[1366,1527],[1304,11908,1439],{"className":11909},[1366,1367,1527],[1304,11911,3464],{"className":11912},[1398,1527],[1304,11914,1940],{"className":11915},[1366,1527],[1304,11917,4116],{"className":11918},[4167,1527],[1304,11920,1442],{"className":11921,"style":1534},[1366,1367,1527],[1304,11923,1540],{"className":11924},[1539],[1304,11926,11928],{"className":11927},[1507],[1304,11929,11931],{"className":11930,"style":1547},[1511],[1304,11932],{},[1097,11934,11935],{},"也就是同一列 (j) 上连续 4 行的结果。",[1097,11937,11938],{},"内层大致是：",[2259,11940,11943],{"className":11941,"code":11942,"language":2768,"meta":2265},[2766],"__m256d c0 = {0,0,0,0};\n\nfor (int k = 0; k \u003C N; k++) {\n    c0 = _mm256_add_pd(\n            c0,\n            _mm256_mul_pd(\n                _mm256_load_pd(a + i + k*N),\n                _mm256_broadcast_sd(b + k + j*N)\n            )\n         );\n}\n\n_mm256_store_pd(c + i + j*N, c0);\n",[1071,11944,11942],{"__ignoreMap":2265},[1097,11946,11947],{},"这里每个 intrinsic 的作用：",[982,11949,11950,11959],{},[985,11951,11952],{},[988,11953,11954,11957],{},[991,11955,11956],{},"代码",[991,11958,3185],{},[1001,11960,11961,11971,11981,11991,12001],{},[988,11962,11963,11968],{},[1006,11964,11965],{},[1071,11966,11967],{"code":11967},"_mm256_load_pd(a+i+k*N)",[1006,11969,11970],{},"从 A 中连续加载 4 个 double",[988,11972,11973,11978],{},[1006,11974,11975],{},[1071,11976,11977],{"code":11977},"_mm256_broadcast_sd(b+k+j*N)",[1006,11979,11980],{},"把 B 的一个 double 复制成 4 份",[988,11982,11983,11988],{},[1006,11984,11985],{},[1071,11986,11987],{"code":11987},"_mm256_mul_pd(...)",[1006,11989,11990],{},"4 个 double 并行乘法",[988,11992,11993,11998],{},[1006,11994,11995],{},[1071,11996,11997],{"code":11997},"_mm256_add_pd(...)",[1006,11999,12000],{},"4 个 double 并行加法",[988,12002,12003,12008],{},[1006,12004,12005],{},[1071,12006,12007],{"code":12007},"_mm256_store_pd(...)",[1006,12009,12010],{},"把 4 个结果写回 C",[1097,12012,12013],{},"这个写法非常妙：\nA 取的是一段连续的 4 个元素：",[1304,12015,12017],{"className":12016},[1307],[1304,12018,12020,12098],{"className":12019},[1311],[1304,12021,12023],{"className":12022},[1315],[1317,12024,12025],{"xmlns":1319,"display":1320},[1322,12026,12027,12095],{},[1325,12028,12029,12041,12043,12059,12061,12077,12079],{},[1431,12030,12031,12033],{},[1328,12032,1337],{},[1325,12034,12035,12037,12039],{},[1328,12036,1439],{},[1332,12038,4116],{"separator":1353},[1328,12040,1453],{},[1332,12042,4116],{"separator":1353},[1431,12044,12045,12047],{},[1328,12046,1337],{},[1325,12048,12049,12051,12053,12055,12057],{},[1328,12050,1439],{},[1332,12052,3464],{},[1869,12054,2327],{},[1332,12056,4116],{"separator":1353},[1328,12058,1453],{},[1332,12060,4116],{"separator":1353},[1431,12062,12063,12065],{},[1328,12064,1337],{},[1325,12066,12067,12069,12071,12073,12075],{},[1328,12068,1439],{},[1332,12070,3464],{},[1869,12072,1871],{},[1332,12074,4116],{"separator":1353},[1328,12076,1453],{},[1332,12078,4116],{"separator":1353},[1431,12080,12081,12083],{},[1328,12082,1337],{},[1325,12084,12085,12087,12089,12091,12093],{},[1328,12086,1439],{},[1332,12088,3464],{},[1869,12090,1940],{},[1332,12092,4116],{"separator":1353},[1328,12094,1453],{},[1345,12096,12097],{"encoding":1347},"A_{i,k}, A_{i+1,k}, A_{i+2,k}, A_{i+3,k}",[1304,12099,12101],{"className":12100,"ariaHidden":1353},[1352],[1304,12102,12104,12107,12156,12159,12162,12217,12220,12223,12278,12281,12284],{"className":12103},[1357],[1304,12105],{"className":12106,"style":1488},[1361],[1304,12108,12110,12113],{"className":12109},[1366],[1304,12111,1337],{"className":12112},[1366,1367],[1304,12114,12116],{"className":12115},[1498],[1304,12117,12119,12148],{"className":12118},[1502,1503],[1304,12120,12122,12145],{"className":12121},[1507],[1304,12123,12125],{"className":12124,"style":1642},[1511],[1304,12126,12127,12130],{"style":1645},[1304,12128],{"className":12129,"style":1520},[1519],[1304,12131,12133],{"className":12132},[1524,1525,1526,1527],[1304,12134,12136,12139,12142],{"className":12135},[1366,1527],[1304,12137,1439],{"className":12138},[1366,1367,1527],[1304,12140,4116],{"className":12141},[4167,1527],[1304,12143,1453],{"className":12144,"style":1594},[1366,1367,1527],[1304,12146,1540],{"className":12147},[1539],[1304,12149,12151],{"className":12150},[1507],[1304,12152,12154],{"className":12153,"style":1547},[1511],[1304,12155],{},[1304,12157,4116],{"className":12158},[4167],[1304,12160],{"className":12161,"style":1623},[1372],[1304,12163,12165,12168],{"className":12164},[1366],[1304,12166,1337],{"className":12167},[1366,1367],[1304,12169,12171],{"className":12170},[1498],[1304,12172,12174,12209],{"className":12173},[1502,1503],[1304,12175,12177,12206],{"className":12176},[1507],[1304,12178,12180],{"className":12179,"style":1642},[1511],[1304,12181,12182,12185],{"style":1645},[1304,12183],{"className":12184,"style":1520},[1519],[1304,12186,12188],{"className":12187},[1524,1525,1526,1527],[1304,12189,12191,12194,12197,12200,12203],{"className":12190},[1366,1527],[1304,12192,1439],{"className":12193},[1366,1367,1527],[1304,12195,3464],{"className":12196},[1398,1527],[1304,12198,2327],{"className":12199},[1366,1527],[1304,12201,4116],{"className":12202},[4167,1527],[1304,12204,1453],{"className":12205,"style":1594},[1366,1367,1527],[1304,12207,1540],{"className":12208},[1539],[1304,12210,12212],{"className":12211},[1507],[1304,12213,12215],{"className":12214,"style":1547},[1511],[1304,12216],{},[1304,12218,4116],{"className":12219},[4167],[1304,12221],{"className":12222,"style":1623},[1372],[1304,12224,12226,12229],{"className":12225},[1366],[1304,12227,1337],{"className":12228},[1366,1367],[1304,12230,12232],{"className":12231},[1498],[1304,12233,12235,12270],{"className":12234},[1502,1503],[1304,12236,12238,12267],{"className":12237},[1507],[1304,12239,12241],{"className":12240,"style":1642},[1511],[1304,12242,12243,12246],{"style":1645},[1304,12244],{"className":12245,"style":1520},[1519],[1304,12247,12249],{"className":12248},[1524,1525,1526,1527],[1304,12250,12252,12255,12258,12261,12264],{"className":12251},[1366,1527],[1304,12253,1439],{"className":12254},[1366,1367,1527],[1304,12256,3464],{"className":12257},[1398,1527],[1304,12259,1871],{"className":12260},[1366,1527],[1304,12262,4116],{"className":12263},[4167,1527],[1304,12265,1453],{"className":12266,"style":1594},[1366,1367,1527],[1304,12268,1540],{"className":12269},[1539],[1304,12271,12273],{"className":12272},[1507],[1304,12274,12276],{"className":12275,"style":1547},[1511],[1304,12277],{},[1304,12279,4116],{"className":12280},[4167],[1304,12282],{"className":12283,"style":1623},[1372],[1304,12285,12287,12290],{"className":12286},[1366],[1304,12288,1337],{"className":12289},[1366,1367],[1304,12291,12293],{"className":12292},[1498],[1304,12294,12296,12331],{"className":12295},[1502,1503],[1304,12297,12299,12328],{"className":12298},[1507],[1304,12300,12302],{"className":12301,"style":1642},[1511],[1304,12303,12304,12307],{"style":1645},[1304,12305],{"className":12306,"style":1520},[1519],[1304,12308,12310],{"className":12309},[1524,1525,1526,1527],[1304,12311,12313,12316,12319,12322,12325],{"className":12312},[1366,1527],[1304,12314,1439],{"className":12315},[1366,1367,1527],[1304,12317,3464],{"className":12318},[1398,1527],[1304,12320,1940],{"className":12321},[1366,1527],[1304,12323,4116],{"className":12324},[4167,1527],[1304,12326,1453],{"className":12327,"style":1594},[1366,1367,1527],[1304,12329,1540],{"className":12330},[1539],[1304,12332,12334],{"className":12333},[1507],[1304,12335,12337],{"className":12336,"style":1547},[1511],[1304,12338],{},[1097,12340,12341],{},"B 取的是一个标量：",[1304,12343,12345],{"className":12344},[1307],[1304,12346,12348,12372],{"className":12347},[1311],[1304,12349,12351],{"className":12350},[1315],[1317,12352,12353],{"xmlns":1319,"display":1320},[1322,12354,12355,12369],{},[1325,12356,12357],{},[1431,12358,12359,12361],{},[1328,12360,1343],{},[1325,12362,12363,12365,12367],{},[1328,12364,1453],{},[1332,12366,4116],{"separator":1353},[1328,12368,1442],{},[1345,12370,12371],{"encoding":1347},"B_{k,j}",[1304,12373,12375],{"className":12374,"ariaHidden":1353},[1352],[1304,12376,12378,12381],{"className":12377},[1357],[1304,12379],{"className":12380,"style":1488},[1361],[1304,12382,12384,12387],{"className":12383},[1366],[1304,12385,1343],{"className":12386,"style":1411},[1366,1367],[1304,12388,12390],{"className":12389},[1498],[1304,12391,12393,12422],{"className":12392},[1502,1503],[1304,12394,12396,12419],{"className":12395},[1507],[1304,12397,12399],{"className":12398,"style":1642},[1511],[1304,12400,12401,12404],{"style":1706},[1304,12402],{"className":12403,"style":1520},[1519],[1304,12405,12407],{"className":12406},[1524,1525,1526,1527],[1304,12408,12410,12413,12416],{"className":12409},[1366,1527],[1304,12411,1453],{"className":12412,"style":1594},[1366,1367,1527],[1304,12414,4116],{"className":12415},[4167,1527],[1304,12417,1442],{"className":12418,"style":1534},[1366,1367,1527],[1304,12420,1540],{"className":12421},[1539],[1304,12423,12425],{"className":12424},[1507],[1304,12426,12428],{"className":12427,"style":1547},[1511],[1304,12429],{},[1097,12431,12432],{},"然后广播成：",[1304,12434,12436],{"className":12435},[1307],[1304,12437,12439,12509],{"className":12438},[1311],[1304,12440,12442],{"className":12441},[1315],[1317,12443,12444],{"xmlns":1319,"display":1320},[1322,12445,12446,12506],{},[1325,12447,12448,12450,12462,12464,12476,12478,12490,12492,12504],{},[1332,12449,8888],{"stretchy":3452},[1431,12451,12452,12454],{},[1328,12453,1343],{},[1325,12455,12456,12458,12460],{},[1328,12457,1453],{},[1332,12459,4116],{"separator":1353},[1328,12461,1442],{},[1332,12463,4116],{"separator":1353},[1431,12465,12466,12468],{},[1328,12467,1343],{},[1325,12469,12470,12472,12474],{},[1328,12471,1453],{},[1332,12473,4116],{"separator":1353},[1328,12475,1442],{},[1332,12477,4116],{"separator":1353},[1431,12479,12480,12482],{},[1328,12481,1343],{},[1325,12483,12484,12486,12488],{},[1328,12485,1453],{},[1332,12487,4116],{"separator":1353},[1328,12489,1442],{},[1332,12491,4116],{"separator":1353},[1431,12493,12494,12496],{},[1328,12495,1343],{},[1325,12497,12498,12500,12502],{},[1328,12499,1453],{},[1332,12501,4116],{"separator":1353},[1328,12503,1442],{},[1332,12505,8919],{"stretchy":3452},[1345,12507,12508],{"encoding":1347},"[B_{k,j},B_{k,j},B_{k,j},B_{k,j}]",[1304,12510,12512],{"className":12511,"ariaHidden":1353},[1352],[1304,12513,12515,12518,12521,12570,12573,12576,12625,12628,12631,12680,12683,12686,12735],{"className":12514},[1357],[1304,12516],{"className":12517,"style":10620},[1361],[1304,12519,8888],{"className":12520},[2611],[1304,12522,12524,12527],{"className":12523},[1366],[1304,12525,1343],{"className":12526,"style":1411},[1366,1367],[1304,12528,12530],{"className":12529},[1498],[1304,12531,12533,12562],{"className":12532},[1502,1503],[1304,12534,12536,12559],{"className":12535},[1507],[1304,12537,12539],{"className":12538,"style":1642},[1511],[1304,12540,12541,12544],{"style":1706},[1304,12542],{"className":12543,"style":1520},[1519],[1304,12545,12547],{"className":12546},[1524,1525,1526,1527],[1304,12548,12550,12553,12556],{"className":12549},[1366,1527],[1304,12551,1453],{"className":12552,"style":1594},[1366,1367,1527],[1304,12554,4116],{"className":12555},[4167,1527],[1304,12557,1442],{"className":12558,"style":1534},[1366,1367,1527],[1304,12560,1540],{"className":12561},[1539],[1304,12563,12565],{"className":12564},[1507],[1304,12566,12568],{"className":12567,"style":1547},[1511],[1304,12569],{},[1304,12571,4116],{"className":12572},[4167],[1304,12574],{"className":12575,"style":1623},[1372],[1304,12577,12579,12582],{"className":12578},[1366],[1304,12580,1343],{"className":12581,"style":1411},[1366,1367],[1304,12583,12585],{"className":12584},[1498],[1304,12586,12588,12617],{"className":12587},[1502,1503],[1304,12589,12591,12614],{"className":12590},[1507],[1304,12592,12594],{"className":12593,"style":1642},[1511],[1304,12595,12596,12599],{"style":1706},[1304,12597],{"className":12598,"style":1520},[1519],[1304,12600,12602],{"className":12601},[1524,1525,1526,1527],[1304,12603,12605,12608,12611],{"className":12604},[1366,1527],[1304,12606,1453],{"className":12607,"style":1594},[1366,1367,1527],[1304,12609,4116],{"className":12610},[4167,1527],[1304,12612,1442],{"className":12613,"style":1534},[1366,1367,1527],[1304,12615,1540],{"className":12616},[1539],[1304,12618,12620],{"className":12619},[1507],[1304,12621,12623],{"className":12622,"style":1547},[1511],[1304,12624],{},[1304,12626,4116],{"className":12627},[4167],[1304,12629],{"className":12630,"style":1623},[1372],[1304,12632,12634,12637],{"className":12633},[1366],[1304,12635,1343],{"className":12636,"style":1411},[1366,1367],[1304,12638,12640],{"className":12639},[1498],[1304,12641,12643,12672],{"className":12642},[1502,1503],[1304,12644,12646,12669],{"className":12645},[1507],[1304,12647,12649],{"className":12648,"style":1642},[1511],[1304,12650,12651,12654],{"style":1706},[1304,12652],{"className":12653,"style":1520},[1519],[1304,12655,12657],{"className":12656},[1524,1525,1526,1527],[1304,12658,12660,12663,12666],{"className":12659},[1366,1527],[1304,12661,1453],{"className":12662,"style":1594},[1366,1367,1527],[1304,12664,4116],{"className":12665},[4167,1527],[1304,12667,1442],{"className":12668,"style":1534},[1366,1367,1527],[1304,12670,1540],{"className":12671},[1539],[1304,12673,12675],{"className":12674},[1507],[1304,12676,12678],{"className":12677,"style":1547},[1511],[1304,12679],{},[1304,12681,4116],{"className":12682},[4167],[1304,12684],{"className":12685,"style":1623},[1372],[1304,12687,12689,12692],{"className":12688},[1366],[1304,12690,1343],{"className":12691,"style":1411},[1366,1367],[1304,12693,12695],{"className":12694},[1498],[1304,12696,12698,12727],{"className":12697},[1502,1503],[1304,12699,12701,12724],{"className":12700},[1507],[1304,12702,12704],{"className":12703,"style":1642},[1511],[1304,12705,12706,12709],{"style":1706},[1304,12707],{"className":12708,"style":1520},[1519],[1304,12710,12712],{"className":12711},[1524,1525,1526,1527],[1304,12713,12715,12718,12721],{"className":12714},[1366,1527],[1304,12716,1453],{"className":12717,"style":1594},[1366,1367,1527],[1304,12719,4116],{"className":12720},[4167,1527],[1304,12722,1442],{"className":12723,"style":1534},[1366,1367,1527],[1304,12725,1540],{"className":12726},[1539],[1304,12728,12730],{"className":12729},[1507],[1304,12731,12733],{"className":12732,"style":1547},[1511],[1304,12734],{},[1304,12736,8919],{"className":12737},[2749],[1097,12739,12740],{},"再相乘，相当于一次更新 4 个 C 元素：",[1304,12742,12744],{"className":12743},[1307],[1304,12745,12747,12818],{"className":12746},[1311],[1304,12748,12750],{"className":12749},[1315],[1317,12751,12752],{"xmlns":1319,"display":1320},[1322,12753,12754,12815],{},[1325,12755,12756,12777,12779,12781,12801,12803],{},[1431,12757,12758,12760],{},[1328,12759,1330],{},[1325,12761,12762,12764,12767,12769,12771,12773,12775],{},[1328,12763,1439],{},[1332,12765,12766],{},":",[1328,12768,1439],{},[1332,12770,3464],{},[1869,12772,1940],{},[1332,12774,4116],{"separator":1353},[1328,12776,1442],{},[1332,12778,3464],{},[1332,12780,1334],{},[1431,12782,12783,12785],{},[1328,12784,1337],{},[1325,12786,12787,12789,12791,12793,12795,12797,12799],{},[1328,12788,1439],{},[1332,12790,12766],{},[1328,12792,1439],{},[1332,12794,3464],{},[1869,12796,1940],{},[1332,12798,4116],{"separator":1353},[1328,12800,1453],{},[1332,12802,1340],{},[1431,12804,12805,12807],{},[1328,12806,1343],{},[1325,12808,12809,12811,12813],{},[1328,12810,1453],{},[1332,12812,4116],{"separator":1353},[1328,12814,1442],{},[1345,12816,12817],{"encoding":1347},"C_{i:i+3,j} += A_{i:i+3,k} \\times B_{k,j}",[1304,12819,12821,12900,12976],{"className":12820,"ariaHidden":1353},[1352],[1304,12822,12824,12827,12888,12891,12894,12897],{"className":12823},[1357],[1304,12825],{"className":12826,"style":1488},[1361],[1304,12828,12830,12833],{"className":12829},[1366],[1304,12831,1330],{"className":12832,"style":1368},[1366,1367],[1304,12834,12836],{"className":12835},[1498],[1304,12837,12839,12880],{"className":12838},[1502,1503],[1304,12840,12842,12877],{"className":12841},[1507],[1304,12843,12845],{"className":12844,"style":1512},[1511],[1304,12846,12847,12850],{"style":1515},[1304,12848],{"className":12849,"style":1520},[1519],[1304,12851,12853],{"className":12852},[1524,1525,1526,1527],[1304,12854,12856,12859,12862,12865,12868,12871,12874],{"className":12855},[1366,1527],[1304,12857,1439],{"className":12858},[1366,1367,1527],[1304,12860,12766],{"className":12861},[1377,1527],[1304,12863,1439],{"className":12864},[1366,1367,1527],[1304,12866,3464],{"className":12867},[1398,1527],[1304,12869,1940],{"className":12870},[1366,1527],[1304,12872,4116],{"className":12873},[4167,1527],[1304,12875,1442],{"className":12876,"style":1534},[1366,1367,1527],[1304,12878,1540],{"className":12879},[1539],[1304,12881,12883],{"className":12882},[1507],[1304,12884,12886],{"className":12885,"style":1547},[1511],[1304,12887],{},[1304,12889,3464],{"className":12890},[1366],[1304,12892],{"className":12893,"style":1373},[1372],[1304,12895,1334],{"className":12896},[1377],[1304,12898],{"className":12899,"style":1373},[1372],[1304,12901,12903,12906,12967,12970,12973],{"className":12902},[1357],[1304,12904],{"className":12905,"style":1488},[1361],[1304,12907,12909,12912],{"className":12908},[1366],[1304,12910,1337],{"className":12911},[1366,1367],[1304,12913,12915],{"className":12914},[1498],[1304,12916,12918,12959],{"className":12917},[1502,1503],[1304,12919,12921,12956],{"className":12920},[1507],[1304,12922,12924],{"className":12923,"style":1642},[1511],[1304,12925,12926,12929],{"style":1645},[1304,12927],{"className":12928,"style":1520},[1519],[1304,12930,12932],{"className":12931},[1524,1525,1526,1527],[1304,12933,12935,12938,12941,12944,12947,12950,12953],{"className":12934},[1366,1527],[1304,12936,1439],{"className":12937},[1366,1367,1527],[1304,12939,12766],{"className":12940},[1377,1527],[1304,12942,1439],{"className":12943},[1366,1367,1527],[1304,12945,3464],{"className":12946},[1398,1527],[1304,12948,1940],{"className":12949},[1366,1527],[1304,12951,4116],{"className":12952},[4167,1527],[1304,12954,1453],{"className":12955,"style":1594},[1366,1367,1527],[1304,12957,1540],{"className":12958},[1539],[1304,12960,12962],{"className":12961},[1507],[1304,12963,12965],{"className":12964,"style":1547},[1511],[1304,12966],{},[1304,12968],{"className":12969,"style":1394},[1372],[1304,12971,1340],{"className":12972},[1398],[1304,12974],{"className":12975,"style":1394},[1372],[1304,12977,12979,12982],{"className":12978},[1357],[1304,12980],{"className":12981,"style":1488},[1361],[1304,12983,12985,12988],{"className":12984},[1366],[1304,12986,1343],{"className":12987,"style":1411},[1366,1367],[1304,12989,12991],{"className":12990},[1498],[1304,12992,12994,13023],{"className":12993},[1502,1503],[1304,12995,12997,13020],{"className":12996},[1507],[1304,12998,13000],{"className":12999,"style":1642},[1511],[1304,13001,13002,13005],{"style":1706},[1304,13003],{"className":13004,"style":1520},[1519],[1304,13006,13008],{"className":13007},[1524,1525,1526,1527],[1304,13009,13011,13014,13017],{"className":13010},[1366,1527],[1304,13012,1453],{"className":13013,"style":1594},[1366,1367,1527],[1304,13015,4116],{"className":13016},[4167,1527],[1304,13018,1442],{"className":13019,"style":1534},[1366,1367,1527],[1304,13021,1540],{"className":13022},[1539],[1304,13024,13026],{"className":13025},[1507],[1304,13027,13029],{"className":13028,"style":1547},[1511],[1304,13030],{},[1991,13032,13033],{},[1097,13034,13035],{},"也就是把A的前四行和B的第一列，先一起乘加运算之后得到前四个C",[1097,13037,13038],{},"这就是 SIMD 在矩阵乘法里的典型用法。",[1231,13040],{},[978,13042,13044],{"id":13043},"第-45-页向量化性能重要","第 45 页：向量化性能，重要",[1097,13046,13047],{},"课件给出性能表：",[982,13049,13050,13061],{},[985,13051,13052],{},[988,13053,13054,13056,13059],{},[991,13055,1867],{},[991,13057,13058],{},"scalar",[991,13060,8410],{},[1001,13062,13063,13073,13083,13094],{},[988,13064,13065,13067,13070],{},[1006,13066,8576],{},[1006,13068,13069],{},"1.30",[1006,13071,13072],{},"4.56",[988,13074,13075,13078,13080],{},[1006,13076,13077],{},"160",[1006,13079,13069],{},[1006,13081,13082],{},"5.47",[988,13084,13085,13088,13091],{},[1006,13086,13087],{},"480",[1006,13089,13090],{},"1.32",[1006,13092,13093],{},"5.27",[988,13095,13096,13099,13102],{},[1006,13097,13098],{},"960",[1006,13100,13101],{},"0.91",[1006,13103,13104],{},"3.64",[1097,13106,13107],{},"单位是 GFLOPS。",[1097,13109,13110,13111,13116],{},"可以看到 AVX 大约带来 ",[1101,13112,13113],{},[1104,13114,13115],{},"4 倍左右加速","。这很合理，因为 AVX-256 一次能处理 4 个 double。",[1097,13118,13119,13120,13122],{},"但问题来了：理论峰值是 ",[1104,13121,11203],{},"，实际 AVX 只有 3.6–5.5 GFLOPS。\n所以第 45 页的结论是：",[1991,13124,13125],{},[1097,13126,13127],{},"SIMD 已经让程序变快了，但还远没榨干硬件。",[1097,13129,13130,13131,13136,13139,13144],{},"这就引出后面的两个瓶颈：",[1101,13132,13133],{},[1104,13134,13135],{},"流水线冒险",[1101,13137,13138],{},"和",[1101,13140,13141],{},[1104,13142,13143],{},"内存层次结构",[1101,13145,1107],{},[1231,13147],{},[1092,13149,13151],{"id":13150},"第-4649-页流水线冒险与循环展开重点","第 46–49 页：流水线冒险与循环展开，重点",[978,13153,13155],{"id":13154},"第-4647-页为什么没到-25-gflops","第 46–47 页：为什么没到 25 GFLOPS",[1097,13157,13158],{},"第 46 页直接问：为什么没有接近 25 GFLOPS？",[1097,13160,13161],{},"可能原因：",[2284,13163,13164,13167],{},[1212,13165,13166],{},"cache；",[1212,13168,13169],{},"hazard，流水线冒险。",[1097,13171,13172,13173,13175,13176,13179,13180,13179,13185,13179,13187,1107],{},"第 47 页用 intrinsic guide 里的 ",[1071,13174,11138],{"code":11138}," 信息暗示一个点：",[1101,13177,13178],{},"浮点指令有"," ",[1101,13181,13182],{},[1104,13183,13184],{},"latency",[1101,13186,13138],{},[1101,13188,13189],{},[1104,13190,13191],{},"throughput",[1097,13193,13194],{},"这两个词很关键：",[982,13196,13197,13205],{},[985,13198,13199],{},[988,13200,13201,13203],{},[991,13202,3182],{},[991,13204,3185],{},[1001,13206,13207,13214],{},[988,13208,13209,13211],{},[1006,13210,13184],{},[1006,13212,13213],{},"一条指令从开始到结果可用要等多少周期",[988,13215,13216,13218],{},[1006,13217,13191],{},[1006,13219,13220],{},"流水线稳定后，每周期最多能发射\u002F完成多少条",[1097,13222,13223,13224,13226,13227],{},"比如 ",[1071,13225,11138],{"code":11138}," latency 是 5，throughput 可以很好。\n这意味着：",[1104,13228,13229],{},"单条乘法结果要 5 个周期后才能用，但如果有足够多互不依赖的乘法，流水线可以不断塞满。",[1097,13231,13232],{},"问题是 dgemm 里有这种依赖：",[2259,13234,13237],{"className":13235,"code":13236,"language":2768,"meta":2265},[2766],"c0 = c0 + something;\nc0 = c0 + something_else;\nc0 = c0 + ...\n",[1071,13238,13236],{"__ignoreMap":2265},[1097,13240,13241,13242,13245,13246,13249,13250,13253,13254,13256],{},"每次都依赖上一次的 ",[1071,13243,13244],{"code":13244},"c0","，这叫 ",[1104,13247,13248],{},"loop-carried dependency","，也就是",[1101,13251,13252],{},"循环携带依赖","。\n下一次加法要等上一次 ",[1071,13255,13244],{"code":13244}," 算完，所以流水线容易空转。",[1231,13258],{},[978,13260,13262,13263],{"id":13261},"第-48-页loop-unrolling","第 48 页：",[1101,13264,13265],{},"Loop Unrolling",[1097,13267,13268],{},[1246,13269],{"alt":1246,"src":13270},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-14.png",[1097,13272,13273],{},"循环展开的核心目的：",[1991,13275,13276],{},[1097,13277,13278,13279,13281],{},"制造多个独立的累加器，减少对同一个 ",[1071,13280,13244],{"code":13244}," 的连续依赖，让流水线有活干。",[1097,13283,13284,13285,13288],{},"课件中 ",[1071,13286,13287],{"code":13287},"UNROLL = 4"," （4-way 展开通常是一个比较温和的折中），并使用：",[2259,13290,13293],{"className":13291,"code":13292,"language":2768,"meta":2265},[2766],"__m256d c[4];\n",[1071,13294,13292],{"__ignoreMap":2265},[1097,13296,8548,13297,1107],{},[1101,13298,13299],{},"4 个向量寄存器同时累加",[1097,13301,13302],{},"可以把原来的：",[2259,13304,13307],{"className":13305,"code":13306,"language":2768,"meta":2265},[2766],"c0 += ...\nc0 += ...\nc0 += ...\n",[1071,13308,13306],{"__ignoreMap":2265},[1097,13310,13311],{},"变成类似：",[2259,13313,13316],{"className":13314,"code":13315,"language":2768,"meta":2265},[2766],"c0 += ...\nc1 += ...\nc2 += ...\nc3 += ...\n",[1071,13317,13315],{"__ignoreMap":2265},[1097,13319,13320,13179,13323,13179,13328],{},[1101,13321,13322],{},"这样",[1101,13324,13325],{},[1071,13326,13327],{"code":13327},"c0、c1、c2、c3",[1101,13329,13330],{},"之间互不依赖，CPU 可以把它们穿插执行，隐藏 latency。（类似流水线思想）",[1097,13332,13333],{},"这就是循环展开的本质：",[1991,13335,13336],{},[1097,13337,13338],{},"不是减少总计算量，而是改变指令依赖结构，提高流水线利用率。",[1097,13340,13341],{},"第 48 页还问“如何验证生成的代码实际上是展开的？”\n答案一般是看编译器生成的汇编代码，检查循环体是否出现多个独立累加寄存器\u002F多组重复指令。",[1231,13343],{},[978,13345,13347],{"id":13346},"第-49-页循环展开性能重要","第 49 页：循环展开性能，重要",[1097,13349,13350],{},"课件性能表：",[982,13352,13353,13366],{},[985,13354,13355],{},[988,13356,13357,13359,13361,13363],{},[991,13358,1867],{},[991,13360,13058],{},[991,13362,8410],{},[991,13364,13365],{},"unroll",[1001,13367,13368,13379,13390,13401],{},[988,13369,13370,13372,13374,13376],{},[1006,13371,8576],{},[1006,13373,13069],{},[1006,13375,13072],{},[1006,13377,13378],{},"12.95",[988,13380,13381,13383,13385,13387],{},[1006,13382,13077],{},[1006,13384,13069],{},[1006,13386,13082],{},[1006,13388,13389],{},"19.70",[988,13391,13392,13394,13396,13398],{},[1006,13393,13087],{},[1006,13395,13090],{},[1006,13397,13093],{},[1006,13399,13400],{},"14.50",[988,13402,13403,13405,13407,13409],{},[1006,13404,13098],{},[1006,13406,13101],{},[1006,13408,13104],{},[1006,13410,13411],{},"6.91",[1097,13413,13414,13415,13418],{},"可以看出 unroll 后性能大幅提升，尤其 (N=160) 时到 ",[1104,13416,13417],{},"19.70 GFLOPS","，已经接近 24.8 GFLOPS 的理论峰值。",[1097,13420,13421,13422,13425],{},"但 (N=960) 时只有 ",[1104,13423,13424],{},"6.91 GFLOPS","，又掉下来了。",[1097,13427,13428,13429,13432,13433,13179,13436,1107],{},"这说明：\n",[1101,13430,13431],{},"小\u002F中等矩阵时，主要瓶颈可能是流水线利用率","；\n",[1101,13434,13435],{},"大矩阵时，主要瓶颈逐渐变成",[1101,13437,13438],{},[1104,13439,13440],{},"cache\u002Fmemory",[1231,13442],{},[1092,13444,13446],{"id":13445},"第-5055-页内存访问与-blocking缓存分块","第 50–55 页：内存访问与 Blocking（缓存分块）",[1097,13448,13449,13450],{},"这几页是性能优化的第二个核心：",[1104,13451,13452],{},"不是算得不够快，而是数据喂不够快。",[978,13454,13456],{"id":13455},"第-50-页fpu-vs-memory-access重要","第 50 页：FPU vs Memory Access，重要",[1097,13458,13459],{},"课件先做了一个理想分析。",[1097,13461,13462],{},"矩阵乘法浮点运算数：",[1304,13464,13466],{"className":13465},[1307],[1304,13467,13469,13493],{"className":13468},[1311],[1304,13470,13472],{"className":13471},[1315],[1317,13473,13474],{"xmlns":1319,"display":1320},[1322,13475,13476,13490],{},[1325,13477,13478,13480,13482,13484],{},[1328,13479,2517],{},[1332,13481,1334],{},[1869,13483,1871],{},[1863,13485,13486,13488],{},[1328,13487,1867],{},[1869,13489,1940],{},[1345,13491,13492],{"encoding":1347},"F = 2N^3",[1304,13494,13496,13514],{"className":13495,"ariaHidden":1353},[1352],[1304,13497,13499,13502,13505,13508,13511],{"className":13498},[1357],[1304,13500],{"className":13501,"style":1362},[1361],[1304,13503,2517],{"className":13504,"style":2573},[1366,1367],[1304,13506],{"className":13507,"style":1373},[1372],[1304,13509,1334],{"className":13510},[1377],[1304,13512],{"className":13513,"style":1373},[1372],[1304,13515,13517,13520,13523],{"className":13516},[1357],[1304,13518],{"className":13519,"style":1953},[1361],[1304,13521,1871],{"className":13522},[1366],[1304,13524,13526,13529],{"className":13525},[1366],[1304,13527,1867],{"className":13528,"style":1891},[1366,1367],[1304,13530,13532],{"className":13531},[1498],[1304,13533,13535],{"className":13534},[1502],[1304,13536,13538],{"className":13537},[1507],[1304,13539,13541],{"className":13540,"style":1953},[1511],[1304,13542,13543,13546],{"style":1977},[1304,13544],{"className":13545,"style":1520},[1519],[1304,13547,13549],{"className":13548},[1524,1525,1526,1527],[1304,13550,1940],{"className":13551},[1366,1527],[1097,13553,13554],{},"因为有 (N^3) 次乘法和 (N^3) 次加法。",[1097,13556,13557,13558,13561],{},"如果",[1101,13559,13560],{},"理想情况下"," A、B、C 每个元素只从内存访问一次，那么内存访问量大约是：",[1304,13563,13565],{"className":13564},[1307],[1304,13566,13568,13593],{"className":13567},[1311],[1304,13569,13571],{"className":13570},[1315],[1317,13572,13573],{"xmlns":1319,"display":1320},[1322,13574,13575,13590],{},[1325,13576,13577,13580,13582,13584],{},[1328,13578,13579],{},"M",[1332,13581,1334],{},[1869,13583,1940],{},[1863,13585,13586,13588],{},[1328,13587,1867],{},[1869,13589,1871],{},[1345,13591,13592],{"encoding":1347},"M = 3N^2",[1304,13594,13596,13614],{"className":13595,"ariaHidden":1353},[1352],[1304,13597,13599,13602,13605,13608,13611],{"className":13598},[1357],[1304,13600],{"className":13601,"style":1362},[1361],[1304,13603,13579],{"className":13604,"style":1891},[1366,1367],[1304,13606],{"className":13607,"style":1373},[1372],[1304,13609,1334],{"className":13610},[1377],[1304,13612],{"className":13613,"style":1373},[1372],[1304,13615,13617,13620,13623],{"className":13616},[1357],[1304,13618],{"className":13619,"style":1953},[1361],[1304,13621,1940],{"className":13622},[1366],[1304,13624,13626,13629],{"className":13625},[1366],[1304,13627,1867],{"className":13628,"style":1891},[1366,1367],[1304,13630,13632],{"className":13631},[1498],[1304,13633,13635],{"className":13634},[1502],[1304,13636,13638],{"className":13637},[1507],[1304,13639,13641],{"className":13640,"style":1953},[1511],[1304,13642,13643,13646],{"style":1977},[1304,13644],{"className":13645,"style":1520},[1519],[1304,13647,13649],{"className":13648},[1524,1525,1526,1527],[1304,13650,1871],{"className":13651},[1366,1527],[1097,13653,13654],{},"于是运算访存比：",[1304,13656,13658],{"className":13657},[1307],[1304,13659,13661,13718],{"className":13660},[1311],[1304,13662,13664],{"className":13663},[1315],[1317,13665,13666],{"xmlns":1319,"display":1320},[1322,13667,13668,13715],{},[1325,13669,13670,13673,13675,13681,13683,13705,13707,13713],{},[1328,13671,13672],{},"q",[1332,13674,1334],{},[2533,13676,13677,13679],{},[1328,13678,2517],{},[1328,13680,13579],{},[1332,13682,1334],{},[2533,13684,13685,13695],{},[1325,13686,13687,13689],{},[1869,13688,1871],{},[1863,13690,13691,13693],{},[1328,13692,1867],{},[1869,13694,1940],{},[1325,13696,13697,13699],{},[1869,13698,1940],{},[1863,13700,13701,13703],{},[1328,13702,1867],{},[1869,13704,1871],{},[1332,13706,1334],{},[2533,13708,13709,13711],{},[1869,13710,1871],{},[1869,13712,1940],{},[1328,13714,1867],{},[1345,13716,13717],{"encoding":1347},"q = \\frac{F}{M} = \\frac{2N^3}{3N^2} = \\frac{2}{3}N",[1304,13719,13721,13741,13818,13954],{"className":13720,"ariaHidden":1353},[1352],[1304,13722,13724,13728,13732,13735,13738],{"className":13723},[1357],[1304,13725],{"className":13726,"style":13727},[1361],"height:0.625em;vertical-align:-0.1944em;",[1304,13729,13672],{"className":13730,"style":13731},[1366,1367],"margin-right:0.0359em;",[1304,13733],{"className":13734,"style":1373},[1372],[1304,13736,1334],{"className":13737},[1377],[1304,13739],{"className":13740,"style":1373},[1372],[1304,13742,13744,13747,13809,13812,13815],{"className":13743},[1357],[1304,13745],{"className":13746,"style":4013},[1361],[1304,13748,13750,13753,13806],{"className":13749},[1366],[1304,13751],{"className":13752},[2611,2612],[1304,13754,13756],{"className":13755},[2533],[1304,13757,13759,13798],{"className":13758},[1502,1503],[1304,13760,13762,13795],{"className":13761},[1507],[1304,13763,13765,13776,13784],{"className":13764,"style":4032},[1511],[1304,13766,13767,13770],{"style":2628},[1304,13768],{"className":13769,"style":2632},[1519],[1304,13771,13773],{"className":13772},[1366],[1304,13774,13579],{"className":13775,"style":1891},[1366,1367],[1304,13777,13778,13781],{"style":2684},[1304,13779],{"className":13780,"style":2632},[1519],[1304,13782],{"className":13783,"style":2692},[2691],[1304,13785,13786,13789],{"style":2695},[1304,13787],{"className":13788,"style":2632},[1519],[1304,13790,13792],{"className":13791},[1366],[1304,13793,2517],{"className":13794,"style":2573},[1366,1367],[1304,13796,1540],{"className":13797},[1539],[1304,13799,13801],{"className":13800},[1507],[1304,13802,13804],{"className":13803,"style":4073},[1511],[1304,13805],{},[1304,13807],{"className":13808},[2749,2612],[1304,13810],{"className":13811,"style":1373},[1372],[1304,13813,1334],{"className":13814},[1377],[1304,13816],{"className":13817,"style":1373},[1372],[1304,13819,13821,13825,13945,13948,13951],{"className":13820},[1357],[1304,13822],{"className":13823,"style":13824},[1361],"height:2.1771em;vertical-align:-0.686em;",[1304,13826,13828,13831,13942],{"className":13827},[1366],[1304,13829],{"className":13830},[2611,2612],[1304,13832,13834],{"className":13833},[2533],[1304,13835,13837,13934],{"className":13836},[1502,1503],[1304,13838,13840,13931],{"className":13839},[1507],[1304,13841,13843,13883,13891],{"className":13842,"style":2625},[1511],[1304,13844,13845,13848],{"style":2628},[1304,13846],{"className":13847,"style":2632},[1519],[1304,13849,13851,13854],{"className":13850},[1366],[1304,13852,1940],{"className":13853},[1366],[1304,13855,13857,13860],{"className":13856},[1366],[1304,13858,1867],{"className":13859,"style":1891},[1366,1367],[1304,13861,13863],{"className":13862},[1498],[1304,13864,13866],{"className":13865},[1502],[1304,13867,13869],{"className":13868},[1507],[1304,13870,13872],{"className":13871,"style":2669},[1511],[1304,13873,13874,13877],{"style":2672},[1304,13875],{"className":13876,"style":1520},[1519],[1304,13878,13880],{"className":13879},[1524,1525,1526,1527],[1304,13881,1871],{"className":13882},[1366,1527],[1304,13884,13885,13888],{"style":2684},[1304,13886],{"className":13887,"style":2632},[1519],[1304,13889],{"className":13890,"style":2692},[2691],[1304,13892,13893,13896],{"style":2695},[1304,13894],{"className":13895,"style":2632},[1519],[1304,13897,13899,13902],{"className":13898},[1366],[1304,13900,1871],{"className":13901},[1366],[1304,13903,13905,13908],{"className":13904},[1366],[1304,13906,1867],{"className":13907,"style":1891},[1366,1367],[1304,13909,13911],{"className":13910},[1498],[1304,13912,13914],{"className":13913},[1502],[1304,13915,13917],{"className":13916},[1507],[1304,13918,13920],{"className":13919,"style":1884},[1511],[1304,13921,13922,13925],{"style":1906},[1304,13923],{"className":13924,"style":1520},[1519],[1304,13926,13928],{"className":13927},[1524,1525,1526,1527],[1304,13929,1940],{"className":13930},[1366,1527],[1304,13932,1540],{"className":13933},[1539],[1304,13935,13937],{"className":13936},[1507],[1304,13938,13940],{"className":13939,"style":4073},[1511],[1304,13941],{},[1304,13943],{"className":13944},[2749,2612],[1304,13946],{"className":13947,"style":1373},[1372],[1304,13949,1334],{"className":13950},[1377],[1304,13952],{"className":13953,"style":1373},[1372],[1304,13955,13957,13960,14022],{"className":13956},[1357],[1304,13958],{"className":13959,"style":4608},[1361],[1304,13961,13963,13966,14019],{"className":13962},[1366],[1304,13964],{"className":13965},[2611,2612],[1304,13967,13969],{"className":13968},[2533],[1304,13970,13972,14011],{"className":13971},[1502,1503],[1304,13973,13975,14008],{"className":13974},[1507],[1304,13976,13978,13989,13997],{"className":13977,"style":3542},[1511],[1304,13979,13980,13983],{"style":2628},[1304,13981],{"className":13982,"style":2632},[1519],[1304,13984,13986],{"className":13985},[1366],[1304,13987,1940],{"className":13988},[1366],[1304,13990,13991,13994],{"style":2684},[1304,13992],{"className":13993,"style":2632},[1519],[1304,13995],{"className":13996,"style":2692},[2691],[1304,13998,13999,14002],{"style":2695},[1304,14000],{"className":14001,"style":2632},[1519],[1304,14003,14005],{"className":14004},[1366],[1304,14006,1871],{"className":14007},[1366],[1304,14009,1540],{"className":14010},[1539],[1304,14012,14014],{"className":14013},[1507],[1304,14015,14017],{"className":14016,"style":4073},[1511],[1304,14018],{},[1304,14020],{"className":14021},[2749,2612],[1304,14023,1867],{"className":14024,"style":1891},[1366,1367],[1097,14026,14027],{},"这个 (q) 越大越好，表示每次内存访问能换来很多计算。",[1097,14029,14030],{},"按这个理想模型，矩阵越大，(q) 越大，应该越适合高速计算。\n但现实马上打脸。",[1231,14032],{},[978,14034,14036],{"id":14035},"第-51-页但是内存被反复访问必须懂","第 51 页：但是内存被反复访问，必须懂",[1097,14038,14039],{},"第 51 页指出，在实际内层循环里：",[2259,14041,14044],{"className":14042,"code":14043,"language":2768,"meta":2265},[2766],"for (int k = 0; k \u003C N; k++) {\n    c0 = c0 + load(A) * broadcast(B);\n}\n",[1071,14045,14043],{"__ignoreMap":2265},[1097,14047,14048],{},"每次循环大致有：",[2284,14050,14051,14054],{},[1212,14052,14053],{},"2 个浮点操作：乘法 + 加法；",[1212,14055,14056],{},"2 个加载：加载 A，加载 B。",[1097,14058,5489],{},[1304,14060,14062],{"className":14061},[1307],[1304,14063,14065,14091],{"className":14064},[1311],[1304,14066,14068],{"className":14067},[1315],[1317,14069,14070],{"xmlns":1319,"display":1320},[1322,14071,14072,14088],{},[1325,14073,14074,14076,14078,14080,14082,14084,14086],{},[1328,14075,13672],{},[1332,14077,1334],{},[1328,14079,2517],{},[1328,14081,3469],{"mathvariant":2802},[1328,14083,13579],{},[1332,14085,5707],{},[1869,14087,2327],{},[1345,14089,14090],{"encoding":1347},"q = F\u002FM \\approx 1",[1304,14092,14094,14112,14136],{"className":14093,"ariaHidden":1353},[1352],[1304,14095,14097,14100,14103,14106,14109],{"className":14096},[1357],[1304,14098],{"className":14099,"style":13727},[1361],[1304,14101,13672],{"className":14102,"style":13731},[1366,1367],[1304,14104],{"className":14105,"style":1373},[1372],[1304,14107,1334],{"className":14108},[1377],[1304,14110],{"className":14111,"style":1373},[1372],[1304,14113,14115,14118,14121,14124,14127,14130,14133],{"className":14114},[1357],[1304,14116],{"className":14117,"style":3714},[1361],[1304,14119,2517],{"className":14120,"style":2573},[1366,1367],[1304,14122,3469],{"className":14123},[1366],[1304,14125,13579],{"className":14126,"style":1891},[1366,1367],[1304,14128],{"className":14129,"style":1373},[1372],[1304,14131,5707],{"className":14132},[1377],[1304,14134],{"className":14135,"style":1373},[1372],[1304,14137,14139,14142],{"className":14138},[1357],[1304,14140],{"className":14141,"style":4230},[1361],[1304,14143,2327],{"className":14144},[1366],[1097,14146,14147,14148,14256,14257,1107],{},"也就是说，实际代码没有达到理想的 (",[1304,14149,14151,14171],{"className":14150},[1311],[1304,14152,14154],{"className":14153},[1315],[1317,14155,14156],{"xmlns":1319},[1322,14157,14158,14168],{},[1325,14159,14160,14166],{},[2533,14161,14162,14164],{},[1869,14163,1871],{},[1869,14165,1940],{},[1328,14167,1867],{},[1345,14169,14170],{"encoding":1347},"\\frac{2}{3}N",[1304,14172,14174],{"className":14173,"ariaHidden":1353},[1352],[1304,14175,14177,14181,14253],{"className":14176},[1357],[1304,14178],{"className":14179,"style":14180},[1361],"height:1.1901em;vertical-align:-0.345em;",[1304,14182,14184,14187,14250],{"className":14183},[1366],[1304,14185],{"className":14186},[2611,2612],[1304,14188,14190],{"className":14189},[2533],[1304,14191,14193,14241],{"className":14192},[1502,1503],[1304,14194,14196,14238],{"className":14195},[1507],[1304,14197,14200,14215,14223],{"className":14198,"style":14199},[1511],"height:0.8451em;",[1304,14201,14203,14206],{"style":14202},"top:-2.655em;",[1304,14204],{"className":14205,"style":2632},[1519],[1304,14207,14209],{"className":14208},[1524,1525,1526,1527],[1304,14210,14212],{"className":14211},[1366,1527],[1304,14213,1940],{"className":14214},[1366,1527],[1304,14216,14217,14220],{"style":2684},[1304,14218],{"className":14219,"style":2632},[1519],[1304,14221],{"className":14222,"style":2692},[2691],[1304,14224,14226,14229],{"style":14225},"top:-3.394em;",[1304,14227],{"className":14228,"style":2632},[1519],[1304,14230,14232],{"className":14231},[1524,1525,1526,1527],[1304,14233,14235],{"className":14234},[1366,1527],[1304,14236,1871],{"className":14237},[1366,1527],[1304,14239,1540],{"className":14240},[1539],[1304,14242,14244],{"className":14243},[1507],[1304,14245,14248],{"className":14246,"style":14247},[1511],"height:0.345em;",[1304,14249],{},[1304,14251],{"className":14252},[2749,2612],[1304,14254,1867],{"className":14255,"style":1891},[1366,1367],")，因为 A、B 的元素被反复从内存层次中取出来，",[1101,14258,14259],{},"数据复用没有做好",[1991,14261,14262],{},[1097,14263,14264],{},"理论上矩阵乘法计算密度很高，但朴素实现会重复访存，导致实际性能受内存层次限制。",[1231,14266],{},[978,14268,14270],{"id":14269},"第-52-页存储器层次结构重要","第 52 页：存储器层次结构，重要",[1097,14272,14273],{},"课件展示了典型存储器层次：",[1097,14275,14276],{},[1246,14277],{"alt":1246,"src":14278},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-15.png",[982,14280,14281,14297],{},[985,14282,14283],{},[988,14284,14285,14288,14291,14294],{},[991,14286,14287],{},"层次",[991,14289,14290],{},"速度",[991,14292,14293],{},"容量",[991,14295,14296],{},"单 bit 成本",[1001,14298,14299,14312,14325],{},[988,14300,14301,14304,14307,14310],{},[1006,14302,14303],{},"register\u002Fcache",[1006,14305,14306],{},"快",[1006,14308,14309],{},"小",[1006,14311,7484],{},[988,14313,14314,14317,14320,14323],{},[1006,14315,14316],{},"DRAM",[1006,14318,14319],{},"慢",[1006,14321,14322],{},"大",[1006,14324,7498],{},[988,14326,14327,14330,14333,14336],{},[1006,14328,14329],{},"disk\u002Fflash",[1006,14331,14332],{},"极慢",[1006,14334,14335],{},"很大",[1006,14337,14338],{},"更低",[1097,14340,14341],{},"优化矩阵乘法的关键就是：",[1991,14343,14344],{},[1097,14345,14346],{},"让经常重复使用的数据尽量待在 register\u002Fcache 里，而不是每次都去 DRAM 拿。",[1097,14348,14349],{},"这就是 blocking 的动机。",[1231,14351],{},[978,14353,14355],{"id":14354},"第-5354-页blocking","第 53–54 页：Blocking",[1097,14357,14358],{},"第 53 页给出 blocking 的定义：",[1991,14360,14361],{},[1097,14362,14363],{},"重新排列代码，使已经加载到 cache 里的值被多次使用，从而减少慢速 DRAM 访问。",[1097,14365,14366],{},"普通矩阵乘法像是：",[2259,14368,14371],{"className":14369,"code":14370,"language":2768,"meta":2265},[2766],"for i\n  for j\n    for k\n      C[i][j] += A[i][k] * B[k][j];\n",[1071,14372,14370],{"__ignoreMap":2265},[1097,14374,14375,14376,6178],{},"blocking 的思路是不要一次看整个矩阵，而是",[1101,14377,14378],{},"分成小块",[2259,14380,14383],{"className":14381,"code":14382,"language":2768,"meta":2265},[2766],"for sj in blocks\n  for si in blocks\n    for sk in blocks\n      do_block(si, sj, sk);\n",[1071,14384,14382],{"__ignoreMap":2265},[1097,14386,14387,14388],{},"每次处理一个小块，",[1101,14389,14390],{},"让 A 的一小块、B 的一小块、C 的一小块尽量留在 cache 里。",[1231,14392],{},[978,14394,14396],{"id":14395},"第-55-页blocking-性能重要","第 55 页：Blocking 性能，重要",[1097,14398,13350],{},[982,14400,14401,14416],{},[985,14402,14403],{},[988,14404,14405,14407,14409,14411,14413],{},[991,14406,1867],{},[991,14408,13058],{},[991,14410,8410],{},[991,14412,13365],{},[991,14414,14415],{},"blocking",[1001,14417,14418,14431,14444,14457],{},[988,14419,14420,14422,14424,14426,14428],{},[1006,14421,8576],{},[1006,14423,13069],{},[1006,14425,13072],{},[1006,14427,13378],{},[1006,14429,14430],{},"13.80",[988,14432,14433,14435,14437,14439,14441],{},[1006,14434,13077],{},[1006,14436,13069],{},[1006,14438,13082],{},[1006,14440,13389],{},[1006,14442,14443],{},"21.79",[988,14445,14446,14448,14450,14452,14454],{},[1006,14447,13087],{},[1006,14449,13090],{},[1006,14451,13093],{},[1006,14453,13400],{},[1006,14455,14456],{},"20.17",[988,14458,14459,14461,14463,14465,14467],{},[1006,14460,13098],{},[1006,14462,13101],{},[1006,14464,13104],{},[1006,14466,13411],{},[1006,14468,14469],{},"15.82",[1097,14471,14472],{},"非常关键的观察：",[2284,14474,14475,14480,14485],{},[1212,14476,14477,3279],{},[1101,14478,14479],{},"对小矩阵，blocking 提升不算特别夸张，因为本来就可能放得进 cache",[1212,14481,14482,3279],{},[1101,14483,14484],{},"对大矩阵，blocking 提升明显，(N=960) 从 unroll 的 6.91 提升到 15.82",[1212,14486,14487],{},"说明大矩阵的主要瓶颈是内存层次，而不是浮点硬件本身。",[1097,14489,14490],{},"所以这个模块的优化路线可以总结成：",[1304,14492,14494],{"className":14493},[1307],[1304,14495,14497,14581],{"className":14496},[1311],[1304,14498,14500],{"className":14499},[1315],[1317,14501,14502],{"xmlns":1319,"display":1320},[1322,14503,14504,14578],{},[1325,14505,14506,14508,14510,14512,14514,14516,14518,14520,14522,14525,14528,14530,14532,14535,14537,14539,14541,14543,14545,14547,14549,14551,14553,14555,14557,14560,14562,14564,14566,14568,14570,14572,14574,14576],{},[1328,14507,2825],{},[1328,14509,2768],{},[1328,14511,2830],{},[1328,14513,10533],{},[1328,14515,2830],{},[1328,14517,2833],{},[1332,14519,4761],{},[1328,14521,1337],{},[1328,14523,14524],{},"V",[1328,14526,14527],{},"X",[1332,14529,4761],{},[1328,14531,10533],{},[1328,14533,14534],{},"o",[1328,14536,14534],{},[1328,14538,1097],{},[3995,14540,7582],{},[1328,14542,3439],{},[1328,14544,2817],{},[1328,14546,2833],{},[1328,14548,14534],{},[1328,14550,10533],{},[1328,14552,10533],{},[1328,14554,1439],{},[1328,14556,2817],{},[1328,14558,14559],{},"g",[1332,14561,4761],{},[1328,14563,9960],{},[1328,14565,10533],{},[1328,14567,14534],{},[1328,14569,2768],{},[1328,14571,1453],{},[1328,14573,1439],{},[1328,14575,2817],{},[1328,14577,14559],{},[1345,14579,14580],{"encoding":1347},"scalar \\rightarrow AVX \\rightarrow loop\\ unrolling \\rightarrow blocking",[1304,14582,14584,14615,14640,14693],{"className":14583,"ariaHidden":1353},[1352],[1304,14585,14587,14590,14594,14597,14600,14603,14606,14609,14612],{"className":14586},[1357],[1304,14588],{"className":14589,"style":1845},[1361],[1304,14591,14593],{"className":14592},[1366,1367],"sc",[1304,14595,2830],{"className":14596},[1366,1367],[1304,14598,10533],{"className":14599,"style":10717},[1366,1367],[1304,14601,2830],{"className":14602},[1366,1367],[1304,14604,2833],{"className":14605,"style":2581},[1366,1367],[1304,14607],{"className":14608,"style":1373},[1372],[1304,14610,4761],{"className":14611},[1377],[1304,14613],{"className":14614,"style":1373},[1372],[1304,14616,14618,14621,14624,14627,14631,14634,14637],{"className":14617},[1357],[1304,14619],{"className":14620,"style":1362},[1361],[1304,14622,1337],{"className":14623},[1366,1367],[1304,14625,14524],{"className":14626,"style":1394},[1366,1367],[1304,14628,14527],{"className":14629,"style":14630},[1366,1367],"margin-right:0.0785em;",[1304,14632],{"className":14633,"style":1373},[1372],[1304,14635,4761],{"className":14636},[1377],[1304,14638],{"className":14639,"style":1373},[1372],[1304,14641,14643,14646,14649,14653,14656,14659,14662,14665,14668,14671,14674,14677,14681,14684,14687,14690],{"className":14642},[1357],[1304,14644],{"className":14645,"style":3488},[1361],[1304,14647,10533],{"className":14648,"style":10717},[1366,1367],[1304,14650,14652],{"className":14651},[1366,1367],"oo",[1304,14654,1097],{"className":14655},[1366,1367],[1304,14657,7582],{"className":14658},[1372],[1304,14660,3439],{"className":14661},[1366,1367],[1304,14663,2817],{"className":14664},[1366,1367],[1304,14666,2833],{"className":14667,"style":2581},[1366,1367],[1304,14669,14534],{"className":14670},[1366,1367],[1304,14672,10533],{"className":14673,"style":10717},[1366,1367],[1304,14675,10533],{"className":14676,"style":10717},[1366,1367],[1304,14678,14680],{"className":14679},[1366,1367],"in",[1304,14682,14559],{"className":14683,"style":13731},[1366,1367],[1304,14685],{"className":14686,"style":1373},[1372],[1304,14688,4761],{"className":14689},[1377],[1304,14691],{"className":14692,"style":1373},[1372],[1304,14694,14696,14699,14702,14705,14709,14712,14715],{"className":14695},[1357],[1304,14697],{"className":14698,"style":3488},[1361],[1304,14700,9960],{"className":14701},[1366,1367],[1304,14703,10533],{"className":14704,"style":10717},[1366,1367],[1304,14706,14708],{"className":14707},[1366,1367],"oc",[1304,14710,1453],{"className":14711,"style":1594},[1366,1367],[1304,14713,14680],{"className":14714},[1366,1367],[1304,14716,14559],{"className":14717,"style":13731},[1366,1367],[1097,14719,14720],{},"分别解决：",[982,14722,14723,14733],{},[985,14724,14725],{},[988,14726,14727,14730],{},[991,14728,14729],{},"优化",[991,14731,14732],{},"解决的问题",[1001,14734,14735,14742,14750],{},[988,14736,14737,14739],{},[1006,14738,8410],{},[1006,14740,14741],{},"一条指令处理多个数据",[988,14743,14744,14747],{},[1006,14745,14746],{},"loop unrolling（流水线优化）",[1006,14748,14749],{},"缓解流水线依赖，提高指令吞吐",[988,14751,14752,14755],{},[1006,14753,14754],{},"blocking（缓存分块）",[1006,14756,14757],{},"增强 cache 复用，减少 DRAM 访问",[1231,14759],{},[1092,14761,14763],{"id":14762},"第-5659-页gemm-的真实高性能实现略中带重点","第 56–59 页：GEMM 的真实高性能实现，略中带重点",[1097,14765,14766,14767,14770],{},"最后讲 ",[1104,14768,14769],{},"GEMM","，想把前面 SIMD、AVX、loop unrolling、blocking 这些零散优化串成一个完整故事",[978,14772,14774],{"id":14773},"第-56-页gemm-和阻塞算法","第 56 页：GEMM 和阻塞算法",[1097,14776,14777],{},"GEMM 是：",[1991,14779,14780],{},[1097,14781,14782],{},"General Matrix-Matrix Multiplication，一般矩阵-矩阵乘法。",[1097,14784,14785],{},"形式通常是：",[1304,14787,14789],{"className":14788},[1307],[1304,14790,14792,14820],{"className":14791},[1311],[1304,14793,14795],{"className":14794},[1315],[1317,14796,14797],{"xmlns":1319,"display":1320},[1322,14798,14799,14817],{},[1325,14800,14801,14803,14805,14807,14809,14811,14813,14815],{},[1328,14802,1330],{},[1332,14804,12766],{},[1332,14806,1334],{},[1328,14808,1330],{},[1332,14810,3464],{},[1328,14812,1337],{},[1332,14814,1340],{},[1328,14816,1343],{},[1345,14818,14819],{"encoding":1347},"C := C + A \\times B",[1304,14821,14823,14842,14860,14878],{"className":14822,"ariaHidden":1353},[1352],[1304,14824,14826,14829,14832,14835,14839],{"className":14825},[1357],[1304,14827],{"className":14828,"style":1362},[1361],[1304,14830,1330],{"className":14831,"style":1368},[1366,1367],[1304,14833],{"className":14834,"style":1373},[1372],[1304,14836,14838],{"className":14837},[1377],":=",[1304,14840],{"className":14841,"style":1373},[1372],[1304,14843,14845,14848,14851,14854,14857],{"className":14844},[1357],[1304,14846],{"className":14847,"style":1387},[1361],[1304,14849,1330],{"className":14850,"style":1368},[1366,1367],[1304,14852],{"className":14853,"style":1394},[1372],[1304,14855,3464],{"className":14856},[1398],[1304,14858],{"className":14859,"style":1394},[1372],[1304,14861,14863,14866,14869,14872,14875],{"className":14862},[1357],[1304,14864],{"className":14865,"style":1387},[1361],[1304,14867,1337],{"className":14868},[1366,1367],[1304,14870],{"className":14871,"style":1394},[1372],[1304,14873,1340],{"className":14874},[1398],[1304,14876],{"className":14877,"style":1394},[1372],[1304,14879,14881,14884],{"className":14880},[1357],[1304,14882],{"className":14883,"style":1362},[1361],[1304,14885,1343],{"className":14886,"style":1411},[1366,1367],[1097,14888,14889],{},"课件提到阻塞算法变体，最快的通用实现来自类似 GotoBLAS 这样的高性能库。",[1097,14891,14892],{},"这里要抓住一句话：",[1991,14894,14895],{},[1097,14896,14897],{},"真正高性能的 GEMM 不是简单三层循环，而是围绕存储器层次做多级 blocking。",[1231,14899],{},[978,14901,14903],{"id":14902},"第-5758-页多级存储器层次-gemm-循环","第 57–58 页：多级存储器层次 + GEMM 循环",[1097,14905,14906],{},"第 57 页的图说明了优化 GEMM 会把数据分层处理：",[1097,14908,14909],{},[1246,14910],{"alt":1246,"src":14911},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-16.png",[2284,14913,14914,14917,14920,14923],{},[1212,14915,14916],{},"主存里有完整 A、B、C；",[1212,14918,14919],{},"cache \u002F shared memory 里放 packed A、packed B；",[1212,14921,14922],{},"register 里放正在计算的小块；",[1212,14924,14925],{},"微内核 micro-kernel 负责最核心的小矩阵计算。",[1097,14927,14928],{},"第 58 页展示了 GEMM 的多层循环。大概可以理解成：",[1097,14930,14931],{},[1246,14932],{"alt":1246,"src":14933},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-17.png",[982,14935,14936,14945],{},[985,14937,14938],{},[988,14939,14940,14942],{},[991,14941,14287],{},[991,14943,14944],{},"目标",[1001,14946,14947,14955,14963,14971],{},[988,14948,14949,14952],{},[1006,14950,14951],{},"外层 blocking",[1006,14953,14954],{},"让数据适配 L3 cache",[988,14956,14957,14960],{},[1006,14958,14959],{},"中层 blocking",[1006,14961,14962],{},"让数据适配 L2 cache",[988,14964,14965,14968],{},[1006,14966,14967],{},"内层 blocking",[1006,14969,14970],{},"让数据适配 L1 cache",[988,14972,14973,14976],{},[1006,14974,14975],{},"micro-kernel",[1006,14977,14978],{},"让数据适配 registers",[1991,14980,14981],{},[1097,14982,14983],{},"高性能 GEMM 会针对 register、L1、L2、L3 分别设计块大小，使数据在每一层都尽可能复用。",[1097,14985,14986],{},"“packed A\u002FB”的意思是把矩阵块重新排列成更连续、更适合 SIMD 加载的形式。代价是多一次打包，但收益是后续计算更快、cache 更友好。",[1231,14988],{},[978,14990,14992],{"id":14991},"第-59-页micro-kernel","第 59 页：Micro-Kernel",[1097,14994,14995,14996,15072,15073,15207],{},"第 59 页展示 micro-kernel 计算。核心是：\n一次不是只算一个 (",[1304,14997,14999,15020],{"className":14998},[1311],[1304,15000,15002],{"className":15001},[1315],[1317,15003,15004],{"xmlns":1319},[1322,15005,15006,15018],{},[1325,15007,15008],{},[1431,15009,15010,15012],{},[1328,15011,1330],{},[1325,15013,15014,15016],{},[1328,15015,1439],{},[1328,15017,1442],{},[1345,15019,1766],{"encoding":1347},[1304,15021,15023],{"className":15022,"ariaHidden":1353},[1352],[1304,15024,15026,15029],{"className":15025},[1357],[1304,15027],{"className":15028,"style":1488},[1361],[1304,15030,15032,15035],{"className":15031},[1366],[1304,15033,1330],{"className":15034,"style":1368},[1366,1367],[1304,15036,15038],{"className":15037},[1498],[1304,15039,15041,15064],{"className":15040},[1502,1503],[1304,15042,15044,15061],{"className":15043},[1507],[1304,15045,15047],{"className":15046,"style":1512},[1511],[1304,15048,15049,15052],{"style":1515},[1304,15050],{"className":15051,"style":1520},[1519],[1304,15053,15055],{"className":15054},[1524,1525,1526,1527],[1304,15056,15058],{"className":15057},[1366,1527],[1304,15059,1535],{"className":15060,"style":1534},[1366,1367,1527],[1304,15062,1540],{"className":15063},[1539],[1304,15065,15067],{"className":15066},[1507],[1304,15068,15070],{"className":15069,"style":1547},[1511],[1304,15071],{},")，而是算一个小块 (",[1304,15074,15076,15102],{"className":15075},[1311],[1304,15077,15079],{"className":15078},[1315],[1317,15080,15081],{"xmlns":1319},[1322,15082,15083,15099],{},[1325,15084,15085,15091,15093],{},[1431,15086,15087,15089],{},[1328,15088,13579],{},[1328,15090,2862],{},[1332,15092,1340],{},[1431,15094,15095,15097],{},[1328,15096,1867],{},[1328,15098,2862],{},[1345,15100,15101],{"encoding":1347},"M_R \\times N_R",[1304,15103,15105,15161],{"className":15104,"ariaHidden":1353},[1352],[1304,15106,15108,15111,15152,15155,15158],{"className":15107},[1357],[1304,15109],{"className":15110,"style":3367},[1361],[1304,15112,15114,15117],{"className":15113},[1366],[1304,15115,13579],{"className":15116,"style":1891},[1366,1367],[1304,15118,15120],{"className":15119},[1498],[1304,15121,15123,15144],{"className":15122},[1502,1503],[1304,15124,15126,15141],{"className":15125},[1507],[1304,15127,15129],{"className":15128,"style":2963},[1511],[1304,15130,15132,15135],{"style":15131},"top:-2.55em;margin-left:-0.109em;margin-right:0.05em;",[1304,15133],{"className":15134,"style":1520},[1519],[1304,15136,15138],{"className":15137},[1524,1525,1526,1527],[1304,15139,2862],{"className":15140,"style":2996},[1366,1367,1527],[1304,15142,1540],{"className":15143},[1539],[1304,15145,15147],{"className":15146},[1507],[1304,15148,15150],{"className":15149,"style":1668},[1511],[1304,15151],{},[1304,15153],{"className":15154,"style":1394},[1372],[1304,15156,1340],{"className":15157},[1398],[1304,15159],{"className":15160,"style":1394},[1372],[1304,15162,15164,15167],{"className":15163},[1357],[1304,15165],{"className":15166,"style":3367},[1361],[1304,15168,15170,15173],{"className":15169},[1366],[1304,15171,1867],{"className":15172,"style":1891},[1366,1367],[1304,15174,15176],{"className":15175},[1498],[1304,15177,15179,15199],{"className":15178},[1502,1503],[1304,15180,15182,15196],{"className":15181},[1507],[1304,15183,15185],{"className":15184,"style":2963},[1511],[1304,15186,15187,15190],{"style":15131},[1304,15188],{"className":15189,"style":1520},[1519],[1304,15191,15193],{"className":15192},[1524,1525,1526,1527],[1304,15194,2862],{"className":15195,"style":2996},[1366,1367,1527],[1304,15197,1540],{"className":15198},[1539],[1304,15200,15202],{"className":15201},[1507],[1304,15203,15205],{"className":15204,"style":1668},[1511],[1304,15206],{},") 的 C。",[1097,15209,15210,15211,15267],{},"比如一次算 (",[1304,15212,15214,15234],{"className":15213},[1311],[1304,15215,15217],{"className":15216},[1315],[1317,15218,15219],{"xmlns":1319},[1322,15220,15221,15231],{},[1325,15222,15223,15225,15227,15229],{},[1869,15224,8511],{},[1332,15226,1340],{},[1869,15228,8511],{},[1332,15230,3461],{"stretchy":3452},[1345,15232,15233],{"encoding":1347},"4 \\times 4)",[1304,15235,15237,15255],{"className":15236,"ariaHidden":1353},[1352],[1304,15238,15240,15243,15246,15249,15252],{"className":15239},[1357],[1304,15241],{"className":15242,"style":3312},[1361],[1304,15244,8511],{"className":15245},[1366],[1304,15247],{"className":15248,"style":1394},[1372],[1304,15250,1340],{"className":15251},[1398],[1304,15253],{"className":15254,"style":1394},[1372],[1304,15256,15258,15261,15264],{"className":15257},[1357],[1304,15259],{"className":15260,"style":3714},[1361],[1304,15262,8511],{"className":15263},[1366],[1304,15265,3461],{"className":15266},[2749]," 的 C 小块。\nA 提供一列\u002F一小块，B 提供一行\u002F一小块，然后做 outer product 更新整个 C 小块。",[1097,15269,15270],{},[1246,15271],{"alt":1246,"src":15272},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-18.png",[1097,15274,15275],{},"下一页是详细解读",[1231,15277],{},[1092,15279,15281],{"id":15280},"第-60-页标量点积-vs-分块外积重点非常可能考","第 60 页：标量点积 vs 分块外积，重点，非常可能考",[1097,15283,15284],{},"这一页很有价值，它回答：",[1991,15286,15287],{},[1097,15288,15289,15290,15422],{},"为什么 GEMM 微内核要算 (",[1304,15291,15293,15318],{"className":15292},[1311],[1304,15294,15296],{"className":15295},[1315],[1317,15297,15298],{"xmlns":1319},[1322,15299,15300,15316],{},[1325,15301,15302,15308,15310],{},[1431,15303,15304,15306],{},[1328,15305,13579],{},[1328,15307,2862],{},[1332,15309,1340],{},[1431,15311,15312,15314],{},[1328,15313,1867],{},[1328,15315,2862],{},[1345,15317,15101],{"encoding":1347},[1304,15319,15321,15376],{"className":15320,"ariaHidden":1353},[1352],[1304,15322,15324,15327,15367,15370,15373],{"className":15323},[1357],[1304,15325],{"className":15326,"style":3367},[1361],[1304,15328,15330,15333],{"className":15329},[1366],[1304,15331,13579],{"className":15332,"style":1891},[1366,1367],[1304,15334,15336],{"className":15335},[1498],[1304,15337,15339,15359],{"className":15338},[1502,1503],[1304,15340,15342,15356],{"className":15341},[1507],[1304,15343,15345],{"className":15344,"style":2963},[1511],[1304,15346,15347,15350],{"style":15131},[1304,15348],{"className":15349,"style":1520},[1519],[1304,15351,15353],{"className":15352},[1524,1525,1526,1527],[1304,15354,2862],{"className":15355,"style":2996},[1366,1367,1527],[1304,15357,1540],{"className":15358},[1539],[1304,15360,15362],{"className":15361},[1507],[1304,15363,15365],{"className":15364,"style":1668},[1511],[1304,15366],{},[1304,15368],{"className":15369,"style":1394},[1372],[1304,15371,1340],{"className":15372},[1398],[1304,15374],{"className":15375,"style":1394},[1372],[1304,15377,15379,15382],{"className":15378},[1357],[1304,15380],{"className":15381,"style":3367},[1361],[1304,15383,15385,15388],{"className":15384},[1366],[1304,15386,1867],{"className":15387,"style":1891},[1366,1367],[1304,15389,15391],{"className":15390},[1498],[1304,15392,15394,15414],{"className":15393},[1502,1503],[1304,15395,15397,15411],{"className":15396},[1507],[1304,15398,15400],{"className":15399,"style":2963},[1511],[1304,15401,15402,15405],{"style":15131},[1304,15403],{"className":15404,"style":1520},[1519],[1304,15406,15408],{"className":15407},[1524,1525,1526,1527],[1304,15409,2862],{"className":15410,"style":2996},[1366,1367,1527],[1304,15412,1540],{"className":15413},[1539],[1304,15415,15417],{"className":15416},[1507],[1304,15418,15420],{"className":15419,"style":1668},[1511],[1304,15421],{},") 的小块，而不是简单算一个标量点积？",[978,15424,15426],{"id":15425},"标量点积一次只算一个-c-元素","标量点积：一次只算一个 C 元素",[1097,15428,15429],{},"比如算：",[1304,15431,15433],{"className":15432},[1307],[1304,15434,15436,15497],{"className":15435},[1311],[1304,15437,15439],{"className":15438},[1315],[1317,15440,15441],{"xmlns":1319,"display":1320},[1322,15442,15443,15494],{},[1325,15444,15445,15453,15455,15480,15487],{},[1431,15446,15447,15450],{},[1328,15448,15449],{},"γ",[1869,15451,15452],{},"00",[1332,15454,1334],{},[15456,15457,15458,15460,15468],"munderover",{},[1332,15459,1450],{},[1325,15461,15462,15464,15466],{},[1328,15463,1453],{},[1332,15465,1334],{},[1869,15467,2334],{},[1325,15469,15470,15476,15478],{},[1431,15471,15472,15474],{},[1328,15473,2848],{},[1328,15475,1330],{},[1332,15477,2154],{},[1869,15479,2327],{},[1431,15481,15482,15485],{},[1328,15483,15484],{},"α",[1328,15486,1453],{},[1431,15488,15489,15492],{},[1328,15490,15491],{},"β",[1328,15493,1453],{},[1345,15495,15496],{"encoding":1347},"\\gamma_{00} = \\sum_{k=0}^{K_C-1} \\alpha_k \\beta_k",[1304,15498,15500,15560],{"className":15499,"ariaHidden":1353},[1352],[1304,15501,15503,15506,15551,15554,15557],{"className":15502},[1357],[1304,15504],{"className":15505,"style":13727},[1361],[1304,15507,15509,15513],{"className":15508},[1366],[1304,15510,15449],{"className":15511,"style":15512},[1366,1367],"margin-right:0.0556em;",[1304,15514,15516],{"className":15515},[1498],[1304,15517,15519,15543],{"className":15518},[1502,1503],[1304,15520,15522,15540],{"className":15521},[1507],[1304,15523,15525],{"className":15524,"style":7663},[1511],[1304,15526,15528,15531],{"style":15527},"top:-2.55em;margin-left:-0.0556em;margin-right:0.05em;",[1304,15529],{"className":15530,"style":1520},[1519],[1304,15532,15534],{"className":15533},[1524,1525,1526,1527],[1304,15535,15537],{"className":15536},[1366,1527],[1304,15538,15452],{"className":15539},[1366,1527],[1304,15541,1540],{"className":15542},[1539],[1304,15544,15546],{"className":15545},[1507],[1304,15547,15549],{"className":15548,"style":1668},[1511],[1304,15550],{},[1304,15552],{"className":15553,"style":1373},[1372],[1304,15555,1334],{"className":15556},[1377],[1304,15558],{"className":15559,"style":1373},[1372],[1304,15561,15563,15567,15685,15688,15730],{"className":15562},[1357],[1304,15564],{"className":15565,"style":15566},[1361],"height:3.1418em;vertical-align:-1.3021em;",[1304,15568,15570],{"className":15569},[1569,1570],[1304,15571,15573,15677],{"className":15572},[1502,1503],[1304,15574,15576,15674],{"className":15575},[1507],[1304,15577,15580,15600,15610],{"className":15578,"style":15579},[1511],"height:1.8396em;",[1304,15581,15582,15585],{"style":1583},[1304,15583],{"className":15584,"style":1587},[1519],[1304,15586,15588],{"className":15587},[1524,1525,1526,1527],[1304,15589,15591,15594,15597],{"className":15590},[1366,1527],[1304,15592,1453],{"className":15593,"style":1594},[1366,1367,1527],[1304,15595,1334],{"className":15596},[1377,1527],[1304,15598,2334],{"className":15599},[1366,1527],[1304,15601,15602,15605],{"style":1597},[1304,15603],{"className":15604,"style":1587},[1519],[1304,15606,15607],{},[1304,15608,1450],{"className":15609},[1569,1606,1607],[1304,15611,15613,15616],{"style":15612},"top:-4.3113em;margin-left:0em;",[1304,15614],{"className":15615,"style":1587},[1519],[1304,15617,15619],{"className":15618},[1524,1525,1526,1527],[1304,15620,15622,15668,15671],{"className":15621},[1366,1527],[1304,15623,15625,15628],{"className":15624},[1366,1527],[1304,15626,2848],{"className":15627,"style":1368},[1366,1367,1527],[1304,15629,15631],{"className":15630},[1498],[1304,15632,15634,15659],{"className":15633},[1502,1503],[1304,15635,15637,15656],{"className":15636},[1507],[1304,15638,15641],{"className":15639,"style":15640},[1511],"height:0.3448em;",[1304,15642,15644,15648],{"style":15643},"top:-2.3567em;margin-left:-0.0715em;margin-right:0.0714em;",[1304,15645],{"className":15646,"style":15647},[1519],"height:2.5em;",[1304,15649,15653],{"className":15650},[1524,15651,15652,1527],"reset-size3","size1",[1304,15654,1330],{"className":15655,"style":1368},[1366,1367,1527],[1304,15657,1540],{"className":15658},[1539],[1304,15660,15662],{"className":15661},[1507],[1304,15663,15666],{"className":15664,"style":15665},[1511],"height:0.1433em;",[1304,15667],{},[1304,15669,2154],{"className":15670},[1398,1527],[1304,15672,2327],{"className":15673},[1366,1527],[1304,15675,1540],{"className":15676},[1539],[1304,15678,15680],{"className":15679},[1507],[1304,15681,15683],{"className":15682,"style":1617},[1511],[1304,15684],{},[1304,15686],{"className":15687,"style":1623},[1372],[1304,15689,15691,15695],{"className":15690},[1366],[1304,15692,15484],{"className":15693,"style":15694},[1366,1367],"margin-right:0.0037em;",[1304,15696,15698],{"className":15697},[1498],[1304,15699,15701,15722],{"className":15700},[1502,1503],[1304,15702,15704,15719],{"className":15703},[1507],[1304,15705,15707],{"className":15706,"style":1642},[1511],[1304,15708,15710,15713],{"style":15709},"top:-2.55em;margin-left:-0.0037em;margin-right:0.05em;",[1304,15711],{"className":15712,"style":1520},[1519],[1304,15714,15716],{"className":15715},[1524,1525,1526,1527],[1304,15717,1453],{"className":15718,"style":1594},[1366,1367,1527],[1304,15720,1540],{"className":15721},[1539],[1304,15723,15725],{"className":15724},[1507],[1304,15726,15728],{"className":15727,"style":1668},[1511],[1304,15729],{},[1304,15731,15733,15737],{"className":15732},[1366],[1304,15734,15491],{"className":15735,"style":15736},[1366,1367],"margin-right:0.0528em;",[1304,15738,15740],{"className":15739},[1498],[1304,15741,15743,15764],{"className":15742},[1502,1503],[1304,15744,15746,15761],{"className":15745},[1507],[1304,15747,15749],{"className":15748,"style":1642},[1511],[1304,15750,15752,15755],{"style":15751},"top:-2.55em;margin-left:-0.0528em;margin-right:0.05em;",[1304,15753],{"className":15754,"style":1520},[1519],[1304,15756,15758],{"className":15757},[1524,1525,1526,1527],[1304,15759,1453],{"className":15760,"style":1594},[1366,1367,1527],[1304,15762,1540],{"className":15763},[1539],[1304,15765,15767],{"className":15766},[1507],[1304,15768,15770],{"className":15769,"style":1668},[1511],[1304,15771],{},[1097,15773,15774],{},"乘加次数：",[1304,15776,15778],{"className":15777},[1307],[1304,15779,15781,15801],{"className":15780},[1311],[1304,15782,15784],{"className":15783},[1315],[1317,15785,15786],{"xmlns":1319,"display":1320},[1322,15787,15788,15798],{},[1325,15789,15790,15792],{},[1869,15791,1871],{},[1431,15793,15794,15796],{},[1328,15795,2848],{},[1328,15797,1330],{},[1345,15799,15800],{"encoding":1347},"2K_C",[1304,15802,15804],{"className":15803,"ariaHidden":1353},[1352],[1304,15805,15807,15810,15813],{"className":15806},[1357],[1304,15808],{"className":15809,"style":3367},[1361],[1304,15811,1871],{"className":15812},[1366],[1304,15814,15816,15819],{"className":15815},[1366],[1304,15817,2848],{"className":15818,"style":1368},[1366,1367],[1304,15820,15822],{"className":15821},[1498],[1304,15823,15825,15845],{"className":15824},[1502,1503],[1304,15826,15828,15842],{"className":15827},[1507],[1304,15829,15831],{"className":15830,"style":2963},[1511],[1304,15832,15833,15836],{"style":1515},[1304,15834],{"className":15835,"style":1520},[1519],[1304,15837,15839],{"className":15838},[1524,1525,1526,1527],[1304,15840,1330],{"className":15841,"style":1368},[1366,1367,1527],[1304,15843,1540],{"className":15844},[1539],[1304,15846,15848],{"className":15847},[1507],[1304,15849,15851],{"className":15850,"style":1668},[1511],[1304,15852],{},[1097,15854,15855],{},"读取次数大约：",[1304,15857,15859],{"className":15858},[1307],[1304,15860,15862,15888],{"className":15861},[1311],[1304,15863,15865],{"className":15864},[1315],[1317,15866,15867],{"xmlns":1319,"display":1320},[1322,15868,15869,15885],{},[1325,15870,15871,15877,15879],{},[1431,15872,15873,15875],{},[1328,15874,2848],{},[1328,15876,1330],{},[1332,15878,3464],{},[1431,15880,15881,15883],{},[1328,15882,2848],{},[1328,15884,1330],{},[1345,15886,15887],{"encoding":1347},"K_C + K_C",[1304,15889,15891,15946],{"className":15890,"ariaHidden":1353},[1352],[1304,15892,15894,15897,15937,15940,15943],{"className":15893},[1357],[1304,15895],{"className":15896,"style":3367},[1361],[1304,15898,15900,15903],{"className":15899},[1366],[1304,15901,2848],{"className":15902,"style":1368},[1366,1367],[1304,15904,15906],{"className":15905},[1498],[1304,15907,15909,15929],{"className":15908},[1502,1503],[1304,15910,15912,15926],{"className":15911},[1507],[1304,15913,15915],{"className":15914,"style":2963},[1511],[1304,15916,15917,15920],{"style":1515},[1304,15918],{"className":15919,"style":1520},[1519],[1304,15921,15923],{"className":15922},[1524,1525,1526,1527],[1304,15924,1330],{"className":15925,"style":1368},[1366,1367,1527],[1304,15927,1540],{"className":15928},[1539],[1304,15930,15932],{"className":15931},[1507],[1304,15933,15935],{"className":15934,"style":1668},[1511],[1304,15936],{},[1304,15938],{"className":15939,"style":1394},[1372],[1304,15941,3464],{"className":15942},[1398],[1304,15944],{"className":15945,"style":1394},[1372],[1304,15947,15949,15952],{"className":15948},[1357],[1304,15950],{"className":15951,"style":3367},[1361],[1304,15953,15955,15958],{"className":15954},[1366],[1304,15956,2848],{"className":15957,"style":1368},[1366,1367],[1304,15959,15961],{"className":15960},[1498],[1304,15962,15964,15984],{"className":15963},[1502,1503],[1304,15965,15967,15981],{"className":15966},[1507],[1304,15968,15970],{"className":15969,"style":2963},[1511],[1304,15971,15972,15975],{"style":1515},[1304,15973],{"className":15974,"style":1520},[1519],[1304,15976,15978],{"className":15977},[1524,1525,1526,1527],[1304,15979,1330],{"className":15980,"style":1368},[1366,1367,1527],[1304,15982,1540],{"className":15983},[1539],[1304,15985,15987],{"className":15986},[1507],[1304,15988,15990],{"className":15989,"style":1668},[1511],[1304,15991],{},[1097,15993,15994],{},"再加上 C 的读写 2 次，所以运算访存比大约：",[1304,15996,15998],{"className":15997},[1307],[1304,15999,16001,16043],{"className":16000},[1311],[1304,16002,16004],{"className":16003},[1315],[1317,16005,16006],{"xmlns":1319,"display":1320},[1322,16007,16008,16040],{},[1325,16009,16010,16036,16038],{},[2533,16011,16012,16022],{},[1325,16013,16014,16016],{},[1869,16015,1871],{},[1431,16017,16018,16020],{},[1328,16019,2848],{},[1328,16021,1330],{},[1325,16023,16024,16026,16032,16034],{},[1869,16025,1871],{},[1431,16027,16028,16030],{},[1328,16029,2848],{},[1328,16031,1330],{},[1332,16033,3464],{},[1869,16035,1871],{},[1332,16037,5707],{},[1869,16039,2327],{},[1345,16041,16042],{"encoding":1347},"\\frac{2K_C}{2K_C+2} \\approx 1",[1304,16044,16046,16216],{"className":16045,"ariaHidden":1353},[1352],[1304,16047,16049,16053,16207,16210,16213],{"className":16048},[1357],[1304,16050],{"className":16051,"style":16052},[1361],"height:2.1963em;vertical-align:-0.836em;",[1304,16054,16056,16059,16204],{"className":16055},[1366],[1304,16057],{"className":16058},[2611,2612],[1304,16060,16062],{"className":16061},[2533],[1304,16063,16065,16196],{"className":16064},[1502,1503],[1304,16066,16068,16193],{"className":16067},[1507],[1304,16069,16071,16134,16142],{"className":16070,"style":4032},[1511],[1304,16072,16073,16076],{"style":2628},[1304,16074],{"className":16075,"style":2632},[1519],[1304,16077,16079,16082,16122,16125,16128,16131],{"className":16078},[1366],[1304,16080,1871],{"className":16081},[1366],[1304,16083,16085,16088],{"className":16084},[1366],[1304,16086,2848],{"className":16087,"style":1368},[1366,1367],[1304,16089,16091],{"className":16090},[1498],[1304,16092,16094,16114],{"className":16093},[1502,1503],[1304,16095,16097,16111],{"className":16096},[1507],[1304,16098,16100],{"className":16099,"style":2963},[1511],[1304,16101,16102,16105],{"style":1515},[1304,16103],{"className":16104,"style":1520},[1519],[1304,16106,16108],{"className":16107},[1524,1525,1526,1527],[1304,16109,1330],{"className":16110,"style":1368},[1366,1367,1527],[1304,16112,1540],{"className":16113},[1539],[1304,16115,16117],{"className":16116},[1507],[1304,16118,16120],{"className":16119,"style":1668},[1511],[1304,16121],{},[1304,16123],{"className":16124,"style":1394},[1372],[1304,16126,3464],{"className":16127},[1398],[1304,16129],{"className":16130,"style":1394},[1372],[1304,16132,1871],{"className":16133},[1366],[1304,16135,16136,16139],{"style":2684},[1304,16137],{"className":16138,"style":2632},[1519],[1304,16140],{"className":16141,"style":2692},[2691],[1304,16143,16144,16147],{"style":2695},[1304,16145],{"className":16146,"style":2632},[1519],[1304,16148,16150,16153],{"className":16149},[1366],[1304,16151,1871],{"className":16152},[1366],[1304,16154,16156,16159],{"className":16155},[1366],[1304,16157,2848],{"className":16158,"style":1368},[1366,1367],[1304,16160,16162],{"className":16161},[1498],[1304,16163,16165,16185],{"className":16164},[1502,1503],[1304,16166,16168,16182],{"className":16167},[1507],[1304,16169,16171],{"className":16170,"style":2963},[1511],[1304,16172,16173,16176],{"style":1515},[1304,16174],{"className":16175,"style":1520},[1519],[1304,16177,16179],{"className":16178},[1524,1525,1526,1527],[1304,16180,1330],{"className":16181,"style":1368},[1366,1367,1527],[1304,16183,1540],{"className":16184},[1539],[1304,16186,16188],{"className":16187},[1507],[1304,16189,16191],{"className":16190,"style":1668},[1511],[1304,16192],{},[1304,16194,1540],{"className":16195},[1539],[1304,16197,16199],{"className":16198},[1507],[1304,16200,16202],{"className":16201,"style":3096},[1511],[1304,16203],{},[1304,16205],{"className":16206},[2749,2612],[1304,16208],{"className":16209,"style":1373},[1372],[1304,16211,5707],{"className":16212},[1377],[1304,16214],{"className":16215,"style":1373},[1372],[1304,16217,16219,16222],{"className":16218},[1357],[1304,16220],{"className":16221,"style":4230},[1361],[1304,16223,2327],{"className":16224},[1366],[1097,16226,16227],{},"也就是每次访存换来的计算不多。",[1231,16229],{},[978,16231,16233,16234,16366],{"id":16232},"分块外积一次算-mrnrm_r-times-n_rmrnr-个-c-元素","分块外积：一次算 (",[1304,16235,16237,16262],{"className":16236},[1311],[1304,16238,16240],{"className":16239},[1315],[1317,16241,16242],{"xmlns":1319},[1322,16243,16244,16260],{},[1325,16245,16246,16252,16254],{},[1431,16247,16248,16250],{},[1328,16249,13579],{},[1328,16251,2862],{},[1332,16253,1340],{},[1431,16255,16256,16258],{},[1328,16257,1867],{},[1328,16259,2862],{},[1345,16261,15101],{"encoding":1347},[1304,16263,16265,16320],{"className":16264,"ariaHidden":1353},[1352],[1304,16266,16268,16271,16311,16314,16317],{"className":16267},[1357],[1304,16269],{"className":16270,"style":3367},[1361],[1304,16272,16274,16277],{"className":16273},[1366],[1304,16275,13579],{"className":16276,"style":1891},[1366,1367],[1304,16278,16280],{"className":16279},[1498],[1304,16281,16283,16303],{"className":16282},[1502,1503],[1304,16284,16286,16300],{"className":16285},[1507],[1304,16287,16289],{"className":16288,"style":2963},[1511],[1304,16290,16291,16294],{"style":15131},[1304,16292],{"className":16293,"style":1520},[1519],[1304,16295,16297],{"className":16296},[1524,1525,1526,1527],[1304,16298,2862],{"className":16299,"style":2996},[1366,1367,1527],[1304,16301,1540],{"className":16302},[1539],[1304,16304,16306],{"className":16305},[1507],[1304,16307,16309],{"className":16308,"style":1668},[1511],[1304,16310],{},[1304,16312],{"className":16313,"style":1394},[1372],[1304,16315,1340],{"className":16316},[1398],[1304,16318],{"className":16319,"style":1394},[1372],[1304,16321,16323,16326],{"className":16322},[1357],[1304,16324],{"className":16325,"style":3367},[1361],[1304,16327,16329,16332],{"className":16328},[1366],[1304,16330,1867],{"className":16331,"style":1891},[1366,1367],[1304,16333,16335],{"className":16334},[1498],[1304,16336,16338,16358],{"className":16337},[1502,1503],[1304,16339,16341,16355],{"className":16340},[1507],[1304,16342,16344],{"className":16343,"style":2963},[1511],[1304,16345,16346,16349],{"style":15131},[1304,16347],{"className":16348,"style":1520},[1519],[1304,16350,16352],{"className":16351},[1524,1525,1526,1527],[1304,16353,2862],{"className":16354,"style":2996},[1366,1367,1527],[1304,16356,1540],{"className":16357},[1539],[1304,16359,16361],{"className":16360},[1507],[1304,16362,16364],{"className":16363,"style":1668},[1511],[1304,16365],{},") 个 C 元素",[1097,16368,16369,16370,2493],{},"分块外积一次更新一个 C 小块，比如 (",[1304,16371,16373,16391],{"className":16372},[1311],[1304,16374,16376],{"className":16375},[1315],[1317,16377,16378],{"xmlns":1319},[1322,16379,16380,16388],{},[1325,16381,16382,16384,16386],{},[1869,16383,8511],{},[1332,16385,1340],{},[1869,16387,8511],{},[1345,16389,16390],{"encoding":1347},"4 \\times 4",[1304,16392,16394,16412],{"className":16393,"ariaHidden":1353},[1352],[1304,16395,16397,16400,16403,16406,16409],{"className":16396},[1357],[1304,16398],{"className":16399,"style":3312},[1361],[1304,16401,8511],{"className":16402},[1366],[1304,16404],{"className":16405,"style":1394},[1372],[1304,16407,1340],{"className":16408},[1398],[1304,16410],{"className":16411,"style":1394},[1372],[1304,16413,16415,16418],{"className":16414},[1357],[1304,16416],{"className":16417,"style":4230},[1361],[1304,16419,8511],{"className":16420},[1366],[1097,16422,16423],{},[1246,16424],{"alt":1246,"src":16425},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-19.png",[1097,16427,16428],{},"计算量：",[1304,16430,16432],{"className":16431},[1307],[1304,16433,16435,16467],{"className":16434},[1311],[1304,16436,16438],{"className":16437},[1315],[1317,16439,16440],{"xmlns":1319,"display":1320},[1322,16441,16442,16464],{},[1325,16443,16444,16446,16452,16458],{},[1869,16445,1871],{},[1431,16447,16448,16450],{},[1328,16449,13579],{},[1328,16451,2862],{},[1431,16453,16454,16456],{},[1328,16455,1867],{},[1328,16457,2862],{},[1431,16459,16460,16462],{},[1328,16461,2848],{},[1328,16463,1330],{},[1345,16465,16466],{"encoding":1347},"2M_RN_RK_C",[1304,16468,16470],{"className":16469,"ariaHidden":1353},[1352],[1304,16471,16473,16476,16479,16519,16559],{"className":16472},[1357],[1304,16474],{"className":16475,"style":3367},[1361],[1304,16477,1871],{"className":16478},[1366],[1304,16480,16482,16485],{"className":16481},[1366],[1304,16483,13579],{"className":16484,"style":1891},[1366,1367],[1304,16486,16488],{"className":16487},[1498],[1304,16489,16491,16511],{"className":16490},[1502,1503],[1304,16492,16494,16508],{"className":16493},[1507],[1304,16495,16497],{"className":16496,"style":2963},[1511],[1304,16498,16499,16502],{"style":15131},[1304,16500],{"className":16501,"style":1520},[1519],[1304,16503,16505],{"className":16504},[1524,1525,1526,1527],[1304,16506,2862],{"className":16507,"style":2996},[1366,1367,1527],[1304,16509,1540],{"className":16510},[1539],[1304,16512,16514],{"className":16513},[1507],[1304,16515,16517],{"className":16516,"style":1668},[1511],[1304,16518],{},[1304,16520,16522,16525],{"className":16521},[1366],[1304,16523,1867],{"className":16524,"style":1891},[1366,1367],[1304,16526,16528],{"className":16527},[1498],[1304,16529,16531,16551],{"className":16530},[1502,1503],[1304,16532,16534,16548],{"className":16533},[1507],[1304,16535,16537],{"className":16536,"style":2963},[1511],[1304,16538,16539,16542],{"style":15131},[1304,16540],{"className":16541,"style":1520},[1519],[1304,16543,16545],{"className":16544},[1524,1525,1526,1527],[1304,16546,2862],{"className":16547,"style":2996},[1366,1367,1527],[1304,16549,1540],{"className":16550},[1539],[1304,16552,16554],{"className":16553},[1507],[1304,16555,16557],{"className":16556,"style":1668},[1511],[1304,16558],{},[1304,16560,16562,16565],{"className":16561},[1366],[1304,16563,2848],{"className":16564,"style":1368},[1366,1367],[1304,16566,16568],{"className":16567},[1498],[1304,16569,16571,16591],{"className":16570},[1502,1503],[1304,16572,16574,16588],{"className":16573},[1507],[1304,16575,16577],{"className":16576,"style":2963},[1511],[1304,16578,16579,16582],{"style":1515},[1304,16580],{"className":16581,"style":1520},[1519],[1304,16583,16585],{"className":16584},[1524,1525,1526,1527],[1304,16586,1330],{"className":16587,"style":1368},[1366,1367,1527],[1304,16589,1540],{"className":16590},[1539],[1304,16592,16594],{"className":16593},[1507],[1304,16595,16597],{"className":16596,"style":1668},[1511],[1304,16598],{},[1097,16600,16601],{},"访存量大约：",[1097,16603,16604,16907],{},[1304,16605,16607,16659],{"className":16606},[1311],[1304,16608,16610],{"className":16609},[1315],[1317,16611,16612],{"xmlns":1319},[1322,16613,16614,16656],{},[1325,16615,16616,16618,16624,16626,16632,16634,16640,16642,16644,16650],{},[1332,16617,3247],{"stretchy":3452},[1431,16619,16620,16622],{},[1328,16621,13579],{},[1328,16623,2862],{},[1332,16625,3464],{},[1431,16627,16628,16630],{},[1328,16629,1867],{},[1328,16631,2862],{},[1332,16633,3461],{"stretchy":3452},[1431,16635,16636,16638],{},[1328,16637,2848],{},[1328,16639,1330],{},[1332,16641,3464],{},[1869,16643,1871],{},[1431,16645,16646,16648],{},[1328,16647,13579],{},[1328,16649,2862],{},[1431,16651,16652,16654],{},[1328,16653,1867],{},[1328,16655,2862],{},[1345,16657,16658],{"encoding":1347},"(M_R + N_R)K_C + 2M_RN_R",[1304,16660,16662,16720,16818],{"className":16661,"ariaHidden":1353},[1352],[1304,16663,16665,16668,16671,16711,16714,16717],{"className":16664},[1357],[1304,16666],{"className":16667,"style":3714},[1361],[1304,16669,3247],{"className":16670},[2611],[1304,16672,16674,16677],{"className":16673},[1366],[1304,16675,13579],{"className":16676,"style":1891},[1366,1367],[1304,16678,16680],{"className":16679},[1498],[1304,16681,16683,16703],{"className":16682},[1502,1503],[1304,16684,16686,16700],{"className":16685},[1507],[1304,16687,16689],{"className":16688,"style":2963},[1511],[1304,16690,16691,16694],{"style":15131},[1304,16692],{"className":16693,"style":1520},[1519],[1304,16695,16697],{"className":16696},[1524,1525,1526,1527],[1304,16698,2862],{"className":16699,"style":2996},[1366,1367,1527],[1304,16701,1540],{"className":16702},[1539],[1304,16704,16706],{"className":16705},[1507],[1304,16707,16709],{"className":16708,"style":1668},[1511],[1304,16710],{},[1304,16712],{"className":16713,"style":1394},[1372],[1304,16715,3464],{"className":16716},[1398],[1304,16718],{"className":16719,"style":1394},[1372],[1304,16721,16723,16726,16766,16769,16809,16812,16815],{"className":16722},[1357],[1304,16724],{"className":16725,"style":3714},[1361],[1304,16727,16729,16732],{"className":16728},[1366],[1304,16730,1867],{"className":16731,"style":1891},[1366,1367],[1304,16733,16735],{"className":16734},[1498],[1304,16736,16738,16758],{"className":16737},[1502,1503],[1304,16739,16741,16755],{"className":16740},[1507],[1304,16742,16744],{"className":16743,"style":2963},[1511],[1304,16745,16746,16749],{"style":15131},[1304,16747],{"className":16748,"style":1520},[1519],[1304,16750,16752],{"className":16751},[1524,1525,1526,1527],[1304,16753,2862],{"className":16754,"style":2996},[1366,1367,1527],[1304,16756,1540],{"className":16757},[1539],[1304,16759,16761],{"className":16760},[1507],[1304,16762,16764],{"className":16763,"style":1668},[1511],[1304,16765],{},[1304,16767,3461],{"className":16768},[2749],[1304,16770,16772,16775],{"className":16771},[1366],[1304,16773,2848],{"className":16774,"style":1368},[1366,1367],[1304,16776,16778],{"className":16777},[1498],[1304,16779,16781,16801],{"className":16780},[1502,1503],[1304,16782,16784,16798],{"className":16783},[1507],[1304,16785,16787],{"className":16786,"style":2963},[1511],[1304,16788,16789,16792],{"style":1515},[1304,16790],{"className":16791,"style":1520},[1519],[1304,16793,16795],{"className":16794},[1524,1525,1526,1527],[1304,16796,1330],{"className":16797,"style":1368},[1366,1367,1527],[1304,16799,1540],{"className":16800},[1539],[1304,16802,16804],{"className":16803},[1507],[1304,16805,16807],{"className":16806,"style":1668},[1511],[1304,16808],{},[1304,16810],{"className":16811,"style":1394},[1372],[1304,16813,3464],{"className":16814},[1398],[1304,16816],{"className":16817,"style":1394},[1372],[1304,16819,16821,16824,16827,16867],{"className":16820},[1357],[1304,16822],{"className":16823,"style":3367},[1361],[1304,16825,1871],{"className":16826},[1366],[1304,16828,16830,16833],{"className":16829},[1366],[1304,16831,13579],{"className":16832,"style":1891},[1366,1367],[1304,16834,16836],{"className":16835},[1498],[1304,16837,16839,16859],{"className":16838},[1502,1503],[1304,16840,16842,16856],{"className":16841},[1507],[1304,16843,16845],{"className":16844,"style":2963},[1511],[1304,16846,16847,16850],{"style":15131},[1304,16848],{"className":16849,"style":1520},[1519],[1304,16851,16853],{"className":16852},[1524,1525,1526,1527],[1304,16854,2862],{"className":16855,"style":2996},[1366,1367,1527],[1304,16857,1540],{"className":16858},[1539],[1304,16860,16862],{"className":16861},[1507],[1304,16863,16865],{"className":16864,"style":1668},[1511],[1304,16866],{},[1304,16868,16870,16873],{"className":16869},[1366],[1304,16871,1867],{"className":16872,"style":1891},[1366,1367],[1304,16874,16876],{"className":16875},[1498],[1304,16877,16879,16899],{"className":16878},[1502,1503],[1304,16880,16882,16896],{"className":16881},[1507],[1304,16883,16885],{"className":16884,"style":2963},[1511],[1304,16886,16887,16890],{"style":15131},[1304,16888],{"className":16889,"style":1520},[1519],[1304,16891,16893],{"className":16892},[1524,1525,1526,1527],[1304,16894,2862],{"className":16895,"style":2996},[1366,1367,1527],[1304,16897,1540],{"className":16898},[1539],[1304,16900,16902],{"className":16901},[1507],[1304,16903,16905],{"className":16904,"style":1668},[1511],[1304,16906],{},"  （2的原因是读一次写一次）",[1097,16909,16910],{},"所以运算访存比：",[1304,16912,16914],{"className":16913},[1307],[1304,16915,16917,16995],{"className":16916},[1311],[1304,16918,16920],{"className":16919},[1315],[1317,16921,16922],{"xmlns":1319,"display":1320},[1322,16923,16924,16992],{},[1325,16925,16926],{},[2533,16927,16928,16950],{},[1325,16929,16930,16932,16938,16944],{},[1869,16931,1871],{},[1431,16933,16934,16936],{},[1328,16935,13579],{},[1328,16937,2862],{},[1431,16939,16940,16942],{},[1328,16941,1867],{},[1328,16943,2862],{},[1431,16945,16946,16948],{},[1328,16947,2848],{},[1328,16949,1330],{},[1325,16951,16952,16954,16960,16962,16968,16970,16976,16978,16980,16986],{},[1332,16953,3247],{"stretchy":3452},[1431,16955,16956,16958],{},[1328,16957,13579],{},[1328,16959,2862],{},[1332,16961,3464],{},[1431,16963,16964,16966],{},[1328,16965,1867],{},[1328,16967,2862],{},[1332,16969,3461],{"stretchy":3452},[1431,16971,16972,16974],{},[1328,16973,2848],{},[1328,16975,1330],{},[1332,16977,3464],{},[1869,16979,1871],{},[1431,16981,16982,16984],{},[1328,16983,13579],{},[1328,16985,2862],{},[1431,16987,16988,16990],{},[1328,16989,1867],{},[1328,16991,2862],{},[1345,16993,16994],{"encoding":1347},"\\frac{2M_RN_RK_C}{(M_R+N_R)K_C + 2M_RN_R}",[1304,16996,16998],{"className":16997,"ariaHidden":1353},[1352],[1304,16999,17001,17005],{"className":17000},[1357],[1304,17002],{"className":17003,"style":17004},[1361],"height:2.2963em;vertical-align:-0.936em;",[1304,17006,17008,17011,17408],{"className":17007},[1366],[1304,17009],{"className":17010},[2611,2612],[1304,17012,17014],{"className":17013},[2533],[1304,17015,17017,17400],{"className":17016},[1502,1503],[1304,17018,17020,17397],{"className":17019},[1507],[1304,17021,17023,17258,17266],{"className":17022,"style":4032},[1511],[1304,17024,17025,17028],{"style":2628},[1304,17026],{"className":17027,"style":2632},[1519],[1304,17029,17031,17034,17074,17077,17080,17083,17123,17126,17166,17169,17172,17175,17178,17218],{"className":17030},[1366],[1304,17032,3247],{"className":17033},[2611],[1304,17035,17037,17040],{"className":17036},[1366],[1304,17038,13579],{"className":17039,"style":1891},[1366,1367],[1304,17041,17043],{"className":17042},[1498],[1304,17044,17046,17066],{"className":17045},[1502,1503],[1304,17047,17049,17063],{"className":17048},[1507],[1304,17050,17052],{"className":17051,"style":2963},[1511],[1304,17053,17054,17057],{"style":15131},[1304,17055],{"className":17056,"style":1520},[1519],[1304,17058,17060],{"className":17059},[1524,1525,1526,1527],[1304,17061,2862],{"className":17062,"style":2996},[1366,1367,1527],[1304,17064,1540],{"className":17065},[1539],[1304,17067,17069],{"className":17068},[1507],[1304,17070,17072],{"className":17071,"style":1668},[1511],[1304,17073],{},[1304,17075],{"className":17076,"style":1394},[1372],[1304,17078,3464],{"className":17079},[1398],[1304,17081],{"className":17082,"style":1394},[1372],[1304,17084,17086,17089],{"className":17085},[1366],[1304,17087,1867],{"className":17088,"style":1891},[1366,1367],[1304,17090,17092],{"className":17091},[1498],[1304,17093,17095,17115],{"className":17094},[1502,1503],[1304,17096,17098,17112],{"className":17097},[1507],[1304,17099,17101],{"className":17100,"style":2963},[1511],[1304,17102,17103,17106],{"style":15131},[1304,17104],{"className":17105,"style":1520},[1519],[1304,17107,17109],{"className":17108},[1524,1525,1526,1527],[1304,17110,2862],{"className":17111,"style":2996},[1366,1367,1527],[1304,17113,1540],{"className":17114},[1539],[1304,17116,17118],{"className":17117},[1507],[1304,17119,17121],{"className":17120,"style":1668},[1511],[1304,17122],{},[1304,17124,3461],{"className":17125},[2749],[1304,17127,17129,17132],{"className":17128},[1366],[1304,17130,2848],{"className":17131,"style":1368},[1366,1367],[1304,17133,17135],{"className":17134},[1498],[1304,17136,17138,17158],{"className":17137},[1502,1503],[1304,17139,17141,17155],{"className":17140},[1507],[1304,17142,17144],{"className":17143,"style":2963},[1511],[1304,17145,17146,17149],{"style":1515},[1304,17147],{"className":17148,"style":1520},[1519],[1304,17150,17152],{"className":17151},[1524,1525,1526,1527],[1304,17153,1330],{"className":17154,"style":1368},[1366,1367,1527],[1304,17156,1540],{"className":17157},[1539],[1304,17159,17161],{"className":17160},[1507],[1304,17162,17164],{"className":17163,"style":1668},[1511],[1304,17165],{},[1304,17167],{"className":17168,"style":1394},[1372],[1304,17170,3464],{"className":17171},[1398],[1304,17173],{"className":17174,"style":1394},[1372],[1304,17176,1871],{"className":17177},[1366],[1304,17179,17181,17184],{"className":17180},[1366],[1304,17182,13579],{"className":17183,"style":1891},[1366,1367],[1304,17185,17187],{"className":17186},[1498],[1304,17188,17190,17210],{"className":17189},[1502,1503],[1304,17191,17193,17207],{"className":17192},[1507],[1304,17194,17196],{"className":17195,"style":2963},[1511],[1304,17197,17198,17201],{"style":15131},[1304,17199],{"className":17200,"style":1520},[1519],[1304,17202,17204],{"className":17203},[1524,1525,1526,1527],[1304,17205,2862],{"className":17206,"style":2996},[1366,1367,1527],[1304,17208,1540],{"className":17209},[1539],[1304,17211,17213],{"className":17212},[1507],[1304,17214,17216],{"className":17215,"style":1668},[1511],[1304,17217],{},[1304,17219,17221,17224],{"className":17220},[1366],[1304,17222,1867],{"className":17223,"style":1891},[1366,1367],[1304,17225,17227],{"className":17226},[1498],[1304,17228,17230,17250],{"className":17229},[1502,1503],[1304,17231,17233,17247],{"className":17232},[1507],[1304,17234,17236],{"className":17235,"style":2963},[1511],[1304,17237,17238,17241],{"style":15131},[1304,17239],{"className":17240,"style":1520},[1519],[1304,17242,17244],{"className":17243},[1524,1525,1526,1527],[1304,17245,2862],{"className":17246,"style":2996},[1366,1367,1527],[1304,17248,1540],{"className":17249},[1539],[1304,17251,17253],{"className":17252},[1507],[1304,17254,17256],{"className":17255,"style":1668},[1511],[1304,17257],{},[1304,17259,17260,17263],{"style":2684},[1304,17261],{"className":17262,"style":2632},[1519],[1304,17264],{"className":17265,"style":2692},[2691],[1304,17267,17268,17271],{"style":2695},[1304,17269],{"className":17270,"style":2632},[1519],[1304,17272,17274,17277,17317,17357],{"className":17273},[1366],[1304,17275,1871],{"className":17276},[1366],[1304,17278,17280,17283],{"className":17279},[1366],[1304,17281,13579],{"className":17282,"style":1891},[1366,1367],[1304,17284,17286],{"className":17285},[1498],[1304,17287,17289,17309],{"className":17288},[1502,1503],[1304,17290,17292,17306],{"className":17291},[1507],[1304,17293,17295],{"className":17294,"style":2963},[1511],[1304,17296,17297,17300],{"style":15131},[1304,17298],{"className":17299,"style":1520},[1519],[1304,17301,17303],{"className":17302},[1524,1525,1526,1527],[1304,17304,2862],{"className":17305,"style":2996},[1366,1367,1527],[1304,17307,1540],{"className":17308},[1539],[1304,17310,17312],{"className":17311},[1507],[1304,17313,17315],{"className":17314,"style":1668},[1511],[1304,17316],{},[1304,17318,17320,17323],{"className":17319},[1366],[1304,17321,1867],{"className":17322,"style":1891},[1366,1367],[1304,17324,17326],{"className":17325},[1498],[1304,17327,17329,17349],{"className":17328},[1502,1503],[1304,17330,17332,17346],{"className":17331},[1507],[1304,17333,17335],{"className":17334,"style":2963},[1511],[1304,17336,17337,17340],{"style":15131},[1304,17338],{"className":17339,"style":1520},[1519],[1304,17341,17343],{"className":17342},[1524,1525,1526,1527],[1304,17344,2862],{"className":17345,"style":2996},[1366,1367,1527],[1304,17347,1540],{"className":17348},[1539],[1304,17350,17352],{"className":17351},[1507],[1304,17353,17355],{"className":17354,"style":1668},[1511],[1304,17356],{},[1304,17358,17360,17363],{"className":17359},[1366],[1304,17361,2848],{"className":17362,"style":1368},[1366,1367],[1304,17364,17366],{"className":17365},[1498],[1304,17367,17369,17389],{"className":17368},[1502,1503],[1304,17370,17372,17386],{"className":17371},[1507],[1304,17373,17375],{"className":17374,"style":2963},[1511],[1304,17376,17377,17380],{"style":1515},[1304,17378],{"className":17379,"style":1520},[1519],[1304,17381,17383],{"className":17382},[1524,1525,1526,1527],[1304,17384,1330],{"className":17385,"style":1368},[1366,1367,1527],[1304,17387,1540],{"className":17388},[1539],[1304,17390,17392],{"className":17391},[1507],[1304,17393,17395],{"className":17394,"style":1668},[1511],[1304,17396],{},[1304,17398,1540],{"className":17399},[1539],[1304,17401,17403],{"className":17402},[1507],[1304,17404,17406],{"className":17405,"style":3655},[1511],[1304,17407],{},[1304,17409],{"className":17410},[2749,2612],[1097,17412,17413,17414,17484],{},"当 (",[1304,17415,17417,17435],{"className":17416},[1311],[1304,17418,17420],{"className":17419},[1315],[1317,17421,17422],{"xmlns":1319},[1322,17423,17424,17432],{},[1325,17425,17426],{},[1431,17427,17428,17430],{},[1328,17429,2848],{},[1328,17431,1330],{},[1345,17433,17434],{"encoding":1347},"K_C",[1304,17436,17438],{"className":17437,"ariaHidden":1353},[1352],[1304,17439,17441,17444],{"className":17440},[1357],[1304,17442],{"className":17443,"style":3367},[1361],[1304,17445,17447,17450],{"className":17446},[1366],[1304,17448,2848],{"className":17449,"style":1368},[1366,1367],[1304,17451,17453],{"className":17452},[1498],[1304,17454,17456,17476],{"className":17455},[1502,1503],[1304,17457,17459,17473],{"className":17458},[1507],[1304,17460,17462],{"className":17461,"style":2963},[1511],[1304,17463,17464,17467],{"style":1515},[1304,17465],{"className":17466,"style":1520},[1519],[1304,17468,17470],{"className":17469},[1524,1525,1526,1527],[1304,17471,1330],{"className":17472,"style":1368},[1366,1367,1527],[1304,17474,1540],{"className":17475},[1539],[1304,17477,17479],{"className":17478},[1507],[1304,17480,17482],{"className":17481,"style":1668},[1511],[1304,17483],{},") 比较大时，可以近似为：",[1304,17486,17488],{"className":17487},[1307],[1304,17489,17491,17537],{"className":17490},[1311],[1304,17492,17494],{"className":17493},[1315],[1317,17495,17496],{"xmlns":1319,"display":1320},[1322,17497,17498,17534],{},[1325,17499,17500],{},[2533,17501,17502,17518],{},[1325,17503,17504,17506,17512],{},[1869,17505,1871],{},[1431,17507,17508,17510],{},[1328,17509,13579],{},[1328,17511,2862],{},[1431,17513,17514,17516],{},[1328,17515,1867],{},[1328,17517,2862],{},[1325,17519,17520,17526,17528],{},[1431,17521,17522,17524],{},[1328,17523,13579],{},[1328,17525,2862],{},[1332,17527,3464],{},[1431,17529,17530,17532],{},[1328,17531,1867],{},[1328,17533,2862],{},[1345,17535,17536],{"encoding":1347},"\\frac{2M_RN_R}{M_R+N_R}",[1304,17538,17540],{"className":17539,"ariaHidden":1353},[1352],[1304,17541,17543,17546],{"className":17542},[1357],[1304,17544],{"className":17545,"style":16052},[1361],[1304,17547,17549,17552,17771],{"className":17548},[1366],[1304,17550],{"className":17551},[2611,2612],[1304,17553,17555],{"className":17554},[2533],[1304,17556,17558,17763],{"className":17557},[1502,1503],[1304,17559,17561,17760],{"className":17560},[1507],[1304,17562,17564,17661,17669],{"className":17563,"style":4032},[1511],[1304,17565,17566,17569],{"style":2628},[1304,17567],{"className":17568,"style":2632},[1519],[1304,17570,17572,17612,17615,17618,17621],{"className":17571},[1366],[1304,17573,17575,17578],{"className":17574},[1366],[1304,17576,13579],{"className":17577,"style":1891},[1366,1367],[1304,17579,17581],{"className":17580},[1498],[1304,17582,17584,17604],{"className":17583},[1502,1503],[1304,17585,17587,17601],{"className":17586},[1507],[1304,17588,17590],{"className":17589,"style":2963},[1511],[1304,17591,17592,17595],{"style":15131},[1304,17593],{"className":17594,"style":1520},[1519],[1304,17596,17598],{"className":17597},[1524,1525,1526,1527],[1304,17599,2862],{"className":17600,"style":2996},[1366,1367,1527],[1304,17602,1540],{"className":17603},[1539],[1304,17605,17607],{"className":17606},[1507],[1304,17608,17610],{"className":17609,"style":1668},[1511],[1304,17611],{},[1304,17613],{"className":17614,"style":1394},[1372],[1304,17616,3464],{"className":17617},[1398],[1304,17619],{"className":17620,"style":1394},[1372],[1304,17622,17624,17627],{"className":17623},[1366],[1304,17625,1867],{"className":17626,"style":1891},[1366,1367],[1304,17628,17630],{"className":17629},[1498],[1304,17631,17633,17653],{"className":17632},[1502,1503],[1304,17634,17636,17650],{"className":17635},[1507],[1304,17637,17639],{"className":17638,"style":2963},[1511],[1304,17640,17641,17644],{"style":15131},[1304,17642],{"className":17643,"style":1520},[1519],[1304,17645,17647],{"className":17646},[1524,1525,1526,1527],[1304,17648,2862],{"className":17649,"style":2996},[1366,1367,1527],[1304,17651,1540],{"className":17652},[1539],[1304,17654,17656],{"className":17655},[1507],[1304,17657,17659],{"className":17658,"style":1668},[1511],[1304,17660],{},[1304,17662,17663,17666],{"style":2684},[1304,17664],{"className":17665,"style":2632},[1519],[1304,17667],{"className":17668,"style":2692},[2691],[1304,17670,17671,17674],{"style":2695},[1304,17672],{"className":17673,"style":2632},[1519],[1304,17675,17677,17680,17720],{"className":17676},[1366],[1304,17678,1871],{"className":17679},[1366],[1304,17681,17683,17686],{"className":17682},[1366],[1304,17684,13579],{"className":17685,"style":1891},[1366,1367],[1304,17687,17689],{"className":17688},[1498],[1304,17690,17692,17712],{"className":17691},[1502,1503],[1304,17693,17695,17709],{"className":17694},[1507],[1304,17696,17698],{"className":17697,"style":2963},[1511],[1304,17699,17700,17703],{"style":15131},[1304,17701],{"className":17702,"style":1520},[1519],[1304,17704,17706],{"className":17705},[1524,1525,1526,1527],[1304,17707,2862],{"className":17708,"style":2996},[1366,1367,1527],[1304,17710,1540],{"className":17711},[1539],[1304,17713,17715],{"className":17714},[1507],[1304,17716,17718],{"className":17717,"style":1668},[1511],[1304,17719],{},[1304,17721,17723,17726],{"className":17722},[1366],[1304,17724,1867],{"className":17725,"style":1891},[1366,1367],[1304,17727,17729],{"className":17728},[1498],[1304,17730,17732,17752],{"className":17731},[1502,1503],[1304,17733,17735,17749],{"className":17734},[1507],[1304,17736,17738],{"className":17737,"style":2963},[1511],[1304,17739,17740,17743],{"style":15131},[1304,17741],{"className":17742,"style":1520},[1519],[1304,17744,17746],{"className":17745},[1524,1525,1526,1527],[1304,17747,2862],{"className":17748,"style":2996},[1366,1367,1527],[1304,17750,1540],{"className":17751},[1539],[1304,17753,17755],{"className":17754},[1507],[1304,17756,17758],{"className":17757,"style":1668},[1511],[1304,17759],{},[1304,17761,1540],{"className":17762},[1539],[1304,17764,17766],{"className":17765},[1507],[1304,17767,17769],{"className":17768,"style":3096},[1511],[1304,17770],{},[1304,17772],{"className":17773},[2749,2612],[1097,17775,17776,17777,17932],{},"如果 (",[1304,17778,17780,17810],{"className":17779},[1311],[1304,17781,17783],{"className":17782},[1315],[1317,17784,17785],{"xmlns":1319},[1322,17786,17787,17807],{},[1325,17788,17789,17795,17797,17803,17805],{},[1431,17790,17791,17793],{},[1328,17792,13579],{},[1328,17794,2862],{},[1332,17796,1334],{},[1431,17798,17799,17801],{},[1328,17800,1867],{},[1328,17802,2862],{},[1332,17804,1334],{},[1869,17806,8511],{},[1345,17808,17809],{"encoding":1347},"M_R=N_R=4",[1304,17811,17813,17868,17923],{"className":17812,"ariaHidden":1353},[1352],[1304,17814,17816,17819,17859,17862,17865],{"className":17815},[1357],[1304,17817],{"className":17818,"style":3367},[1361],[1304,17820,17822,17825],{"className":17821},[1366],[1304,17823,13579],{"className":17824,"style":1891},[1366,1367],[1304,17826,17828],{"className":17827},[1498],[1304,17829,17831,17851],{"className":17830},[1502,1503],[1304,17832,17834,17848],{"className":17833},[1507],[1304,17835,17837],{"className":17836,"style":2963},[1511],[1304,17838,17839,17842],{"style":15131},[1304,17840],{"className":17841,"style":1520},[1519],[1304,17843,17845],{"className":17844},[1524,1525,1526,1527],[1304,17846,2862],{"className":17847,"style":2996},[1366,1367,1527],[1304,17849,1540],{"className":17850},[1539],[1304,17852,17854],{"className":17853},[1507],[1304,17855,17857],{"className":17856,"style":1668},[1511],[1304,17858],{},[1304,17860],{"className":17861,"style":1373},[1372],[1304,17863,1334],{"className":17864},[1377],[1304,17866],{"className":17867,"style":1373},[1372],[1304,17869,17871,17874,17914,17917,17920],{"className":17870},[1357],[1304,17872],{"className":17873,"style":3367},[1361],[1304,17875,17877,17880],{"className":17876},[1366],[1304,17878,1867],{"className":17879,"style":1891},[1366,1367],[1304,17881,17883],{"className":17882},[1498],[1304,17884,17886,17906],{"className":17885},[1502,1503],[1304,17887,17889,17903],{"className":17888},[1507],[1304,17890,17892],{"className":17891,"style":2963},[1511],[1304,17893,17894,17897],{"style":15131},[1304,17895],{"className":17896,"style":1520},[1519],[1304,17898,17900],{"className":17899},[1524,1525,1526,1527],[1304,17901,2862],{"className":17902,"style":2996},[1366,1367,1527],[1304,17904,1540],{"className":17905},[1539],[1304,17907,17909],{"className":17908},[1507],[1304,17910,17912],{"className":17911,"style":1668},[1511],[1304,17913],{},[1304,17915],{"className":17916,"style":1373},[1372],[1304,17918,1334],{"className":17919},[1377],[1304,17921],{"className":17922,"style":1373},[1372],[1304,17924,17926,17929],{"className":17925},[1357],[1304,17927],{"className":17928,"style":4230},[1361],[1304,17930,8511],{"className":17931},[1366],")，那么：",[1304,17934,17936],{"className":17935},[1307],[1304,17937,17939,17977],{"className":17938},[1311],[1304,17940,17942],{"className":17941},[1315],[1317,17943,17944],{"xmlns":1319,"display":1320},[1322,17945,17946,17974],{},[1325,17947,17948,17970,17972],{},[2533,17949,17950,17962],{},[1325,17951,17952,17954,17956,17958,17960],{},[1869,17953,1871],{},[1332,17955,1340],{},[1869,17957,8511],{},[1332,17959,1340],{},[1869,17961,8511],{},[1325,17963,17964,17966,17968],{},[1869,17965,8511],{},[1332,17967,3464],{},[1869,17969,8511],{},[1332,17971,1334],{},[1869,17973,8511],{},[1345,17975,17976],{"encoding":1347},"\\frac{2 \\times 4 \\times 4}{4+4} = 4",[1304,17978,17980,18093],{"className":17979,"ariaHidden":1353},[1352],[1304,17981,17983,17986,18084,18087,18090],{"className":17982},[1357],[1304,17984],{"className":17985,"style":4485},[1361],[1304,17987,17989,17992,18081],{"className":17988},[1366],[1304,17990],{"className":17991},[2611,2612],[1304,17993,17995],{"className":17994},[2533],[1304,17996,17998,18073],{"className":17997},[1502,1503],[1304,17999,18001,18070],{"className":18000},[1507],[1304,18002,18004,18027,18035],{"className":18003,"style":3542},[1511],[1304,18005,18006,18009],{"style":2628},[1304,18007],{"className":18008,"style":2632},[1519],[1304,18010,18012,18015,18018,18021,18024],{"className":18011},[1366],[1304,18013,8511],{"className":18014},[1366],[1304,18016],{"className":18017,"style":1394},[1372],[1304,18019,3464],{"className":18020},[1398],[1304,18022],{"className":18023,"style":1394},[1372],[1304,18025,8511],{"className":18026},[1366],[1304,18028,18029,18032],{"style":2684},[1304,18030],{"className":18031,"style":2632},[1519],[1304,18033],{"className":18034,"style":2692},[2691],[1304,18036,18037,18040],{"style":2695},[1304,18038],{"className":18039,"style":2632},[1519],[1304,18041,18043,18046,18049,18052,18055,18058,18061,18064,18067],{"className":18042},[1366],[1304,18044,1871],{"className":18045},[1366],[1304,18047],{"className":18048,"style":1394},[1372],[1304,18050,1340],{"className":18051},[1398],[1304,18053],{"className":18054,"style":1394},[1372],[1304,18056,8511],{"className":18057},[1366],[1304,18059],{"className":18060,"style":1394},[1372],[1304,18062,1340],{"className":18063},[1398],[1304,18065],{"className":18066,"style":1394},[1372],[1304,18068,8511],{"className":18069},[1366],[1304,18071,1540],{"className":18072},[1539],[1304,18074,18076],{"className":18075},[1507],[1304,18077,18079],{"className":18078,"style":2743},[1511],[1304,18080],{},[1304,18082],{"className":18083},[2749,2612],[1304,18085],{"className":18086,"style":1373},[1372],[1304,18088,1334],{"className":18089},[1377],[1304,18091],{"className":18092,"style":1373},[1372],[1304,18094,18096,18099],{"className":18095},[1357],[1304,18097],{"className":18098,"style":4230},[1361],[1304,18100,8511],{"className":18101},[1366],[1097,18103,18104],{},"这比标量点积的约 1 好很多。",[1097,18106,18107],{},"结论：",[1991,18109,18110],{},[1097,18111,18112],{},"分块外积通过一次加载 A 和 B 的小块，更新多个 C 元素，提高了计算操作与内存操作的比率，也就是减少访存压力。",[1097,18114,18115],{},[1104,18116,18117],{},"为什么高性能 GEMM 使用 register blocking \u002F outer product micro-kernel，而不是普通 dot product？",[1097,18119,18120],{},"可以答：",[1991,18122,18123],{},[1097,18124,18125],{},"因为外积形式能复用加载到寄存器\u002Fcache 的 A、B 数据，一次更新多个 C 元素，提高 arithmetic intensity，减少慢速内存访问，从而更接近浮点硬件峰值性能。",[1231,18127],{},[1087,18129,18131],{"id":18130},"第-3-模块指令级并行-ilp","第 3 模块：指令级并行 ILP",[1097,18133,8305,18134,1107],{},[1104,18135,18136],{},"下一板块：第 3 模块——指令级并行 ILP，约第 61–89 页",[1097,18138,18139],{},"这一块比上一块 SIMD 更“体系结构味”。不用每个 IA-64 细节都死磕，考试重点主要是：",[1097,18141,18142],{},[1104,18143,18144],{},"ILP 是什么 → VLIW 是什么 → 编译器怎么调度 → loop unrolling \u002F software pipelining → trace scheduling → 为什么 VLIW\u002FItanium 没成功。",[1231,18146],{},[1092,18148,18150],{"id":18149},"第-6163-页ilp-总览重要","第 61–63 页：ILP 总览，重要",[978,18152,18154],{"id":18153},"第-61-页标题页","第 61 页：标题页",[1097,18156,18157,18158,1107],{},"进入 ",[1104,18159,18160],{},"Instruction Level Parallelism，指令级并行",[1991,18162,18163],{},[1097,18164,18165,18166,18169],{},"ILP 是在",[1104,18167,18168],{},"同一个线程\u002F程序内部","，让多条互不依赖的指令同时执行。",[1231,18171],{},[978,18173,18175],{"id":18174},"第-62-页ilp-的硬件软件设计空间略中带重要","第 62 页：ILP 的硬件\u002F软件设计空间，略中带重要",[1097,18177,18178],{},[1246,18179],{"alt":1246,"src":18180},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-20.png",[1097,18182,18183],{},"谁来负责发现和利用指令之间的并行性？",[1097,18185,18186],{},"大概有两条路线：",[982,18188,18189,18202],{},[985,18190,18191],{},[988,18192,18193,18196,18199],{},[991,18194,18195],{},"路线",[991,18197,18198],{},"谁负责找并行？",[991,18200,18201],{},"代表",[1001,18203,18204,18215],{},[988,18205,18206,18209,18212],{},[1006,18207,18208],{},"动态调度",[1006,18210,18211],{},"硬件运行时判断哪些指令能并行",[1006,18213,18214],{},"Superscalar，超标量",[988,18216,18217,18220,18223],{},[1006,18218,18219],{},"静态调度",[1006,18221,18222],{},"编译器提前安排哪些操作并行",[1006,18224,18225],{},"VLIW",[1097,18227,18228],{},"这页不用背图，但要抓住一个核心对比：",[1991,18230,18231],{},[1097,18232,18233],{},[1104,18234,18235],{},"超标量 Superscalar：硬件聪明。VLIW：编译器聪明。",[1097,18237,18238],{},"超标量处理器会在运行时检查依赖、乱序发射、动态调度。VLIW 则把并行性显式写进指令字里，硬件相对简单，但编译器压力巨大。",[1991,18240,18241],{},[1097,18242,18243],{},"本章主要讲的是编译器角度的静态调度",[1231,18245],{},[978,18247,18249],{"id":18248},"第-63-页顺序-isa-瓶颈从超标量处理器的角度","第 63 页：顺序 ISA 瓶颈（从超标量处理器的角度）",[1097,18251,18252],{},"传统 ISA 是顺序机器代码：程序看起来是一条条指令排队执行。\n但处理器内部其实想问：",[1991,18254,18255],{},[1097,18256,18257],{},"有没有一些指令其实互不依赖，可以一起做？",[1097,18259,18260],{},[1246,18261],{"alt":1246,"src":18262},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-21.png",[1097,18264,18265],{},"第 63 页把流程分成两部分：",[1209,18267,18268,18274],{},[1212,18269,18270,18273],{},[1104,18271,18272],{},"Superscalar 编译器","：寻找独立运算、做操作调度；",[1212,18275,18276,18279],{},[1104,18277,18278],{},"Superscalar processor","：运行时检查依赖关系、执行调度。",[1097,18281,18282],{},"所以顺序 ISA 的问题是：机器码本身没有显式告诉硬件“这几条可以并行”，硬件需要自己猜、自己检查、自己调度，复杂度很高。",[18284,18285,18287],"alert",{"type":18286},"tip",[1097,18288,18289,18290],{},"超标量和 VLIW在ILP中 通常是 ",[1104,18291,18292],{},"二选一作为主要设计路线",[1231,18294],{},[1092,18296,18298],{"id":18297},"第-6466-页vliw核心概念必须掌握","第 64–66 页：VLIW，核心概念，必须掌握",[978,18300,18302],{"id":18301},"第-64-页vliw-是什么最重要","第 64 页：VLIW 是什么，最重要",[1097,18304,18305],{},[1101,18306,18307],{},[1104,18308,18309],{},"VLIW = Very Long Instruction Word，超长指令字。",[1097,18311,18312],{},"它的想法很直接：\n把多个操作打包到一条很长的指令里，每个槽位对应一个固定功能单元。",[1097,18314,18315],{},[1246,18316],{"alt":1246,"src":18317},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-22.png",[1097,18319,18320],{},"也就是说，一条 VLIW 指令里面可能同时包含多个操作。硬件看到这一整条长指令，就把里面的多个操作同时发给不同功能单元执行。课件强调 VLIW 会把多个操作打包到一条指令中，每个槽对应固定功能，并假设操作延迟是恒定的。",[1097,18322,18323],{},"这和 superscalar 的区别非常关键：",[982,18325,18326,18338],{},[985,18327,18328],{},[988,18329,18330,18333,18336],{},[991,18331,18332],{},"对比",[991,18334,18335],{},"Superscalar",[991,18337,18225],{},[1001,18339,18340,18351,18362,18372,18383],{},[988,18341,18342,18345,18348],{},[1006,18343,18344],{},"指令格式",[1006,18346,18347],{},"普通顺序指令",[1006,18349,18350],{},"一条长指令含多个操作",[988,18352,18353,18356,18359],{},[1006,18354,18355],{},"并行性发现",[1006,18357,18358],{},"硬件运行时发现",[1006,18360,18361],{},"编译器提前安排",[988,18363,18364,18367,18369],{},[1006,18365,18366],{},"硬件复杂度",[1006,18368,7484],{},[1006,18370,18371],{},"相对低",[988,18373,18374,18377,18380],{},[1006,18375,18376],{},"编译器压力",[1006,18378,18379],{},"较低",[1006,18381,18382],{},"很高",[988,18384,18385,18388,18391],{},[1006,18386,18387],{},"依赖检查",[1006,18389,18390],{},"硬件做 RAW 等检查",[1006,18392,18393],{},"编译器保证安全",[1097,18395,18396],{},"VLIW编译器的压力大，VLIW 架构希望编译器已经安排好",[2284,18398,18399,18402],{},[1212,18400,18401],{},"指令内的并行度 → 没有交叉操作的RAW（read after write）检查",[1212,18403,18404],{},"在数据准备好之前不使用数据 → 无数据联锁",[1231,18406],{},[978,18408,18410],{"id":18409},"第-65-页早期-vliw-机器","第 65 页：早期 VLIW 机器",[1097,18412,18413],{},"这一页是历史背景：",[2284,18415,18416,18419,18422],{},[1212,18417,18418],{},"FPS AP120B；",[1212,18420,18421],{},"Multiflow Trace；",[1212,18423,18424],{},"Cydrome Cydra-5。",[1097,18426,18427],{},"你只要知道：VLIW 不是 Intel Itanium 才出现的，它之前已经在科学计算、DSP、阵列处理器等场景尝试过。",[1097,18429,18430,18431,18434],{},"其中 Cydra-5 的 ",[1104,18432,18433],{},"rotating register file，旋转寄存器文件"," 后面 IA-64 还会讲。",[1231,18436],{},[978,18438,18440],{"id":18439},"第-66-页vliw-编译器职责重要","第 66 页：VLIW 编译器职责，重要",[1097,18442,18443],{},"VLIW 的编译器要做三件事：",[1209,18445,18446,18449,18452],{},[1212,18447,18448],{},"调度操作，让并行执行最大化；",[1212,18450,18451],{},"保证同一条 VLIW 指令内部的操作确实能并行；",[1212,18453,18454,18455,1107],{},"避免数据冒险，必要时插入显式 ",[1071,18456,18457],{"code":18457},"nop",[1097,18459,18460,18461,18463],{},"这里的 ",[1071,18462,18457],{"code":18457}," 是 no operation，空操作。",[1097,18465,18466],{},"比如一个结果要 4 个周期后才能用，但下一条马上要用它，编译器就得插入空槽或安排别的无关指令填进去。否则硬件不会像复杂超标量那样帮你兜底。",[1991,18468,18469],{},[1097,18470,18471],{},"VLIW 把动态调度压力从硬件转移到编译器，编译器必须静态发现并行性、安排功能单元、避免数据冒险和结构冒险。",[1231,18473],{},[1092,18475,18477],{"id":18476},"第-6771-页循环展开与软件流水线最重要","第 67–71 页：循环展开与软件流水线，最重要",[1097,18479,18480],{},"这几页是本模块最有价值的部分，建议认真看。",[978,18482,18484],{"id":18483},"第-67-页普通循环执行必须懂","第 67 页：普通循环执行，必须懂",[1097,18486,18487],{},"例子：",[2259,18489,18492],{"className":18490,"code":18491,"language":2768,"meta":2265},[2766],"for (i = 0; i \u003C N; i++)\n    B[i] = A[i] + C;\n",[1071,18493,18491],{"__ignoreMap":2265},[1097,18495,18496],{},"编译后大概是：",[2259,18498,18503],{"className":18499,"code":18501,"language":18502},[18500],"language-text","loop:\n    fld  f1, 0(x1)      \u002F\u002F load A[i]\n    add  x1, 8          \u002F\u002F A 指针加 8\n    fadd f2, f0, f1     \u002F\u002F A[i] + C\n    fsd  f2, 0(x2)      \u002F\u002F store B[i]\n    add  x2, 8          \u002F\u002F B 指针加 8\n    bne  x1, x3, loop   \u002F\u002F 判断循环\n","text",[1071,18504,18501],{"__ignoreMap":2265},[1097,18506,18507],{},"课件调度后给出的效果是：",[1304,18509,18511],{"className":18510},[1307],[1304,18512,18514,18543],{"className":18513},[1311],[1304,18515,18517],{"className":18516},[1315],[1317,18518,18519],{"xmlns":1319,"display":1320},[1322,18520,18521,18540],{},[1325,18522,18523,18525,18528,18530,18532,18535,18537],{},[1869,18524,2327],{},[3995,18526,18527],{}," fadd",[1328,18529,3469],{"mathvariant":2802},[1869,18531,8581],{},[3995,18533,18534],{}," cycles",[1332,18536,1334],{},[1869,18538,18539],{},"0.125",[1345,18541,18542],{"encoding":1347},"1 \\text{ fadd} \u002F 8 \\text{ cycles} = 0.125",[1304,18544,18546,18580],{"className":18545,"ariaHidden":1353},[1352],[1304,18547,18549,18552,18555,18561,18565,18571,18574,18577],{"className":18548},[1357],[1304,18550],{"className":18551,"style":3714},[1361],[1304,18553,2327],{"className":18554},[1366],[1304,18556,18558],{"className":18557},[1366,18502],[1304,18559,18527],{"className":18560},[1366],[1304,18562,18564],{"className":18563},[1366],"\u002F8",[1304,18566,18568],{"className":18567},[1366,18502],[1304,18569,18534],{"className":18570},[1366],[1304,18572],{"className":18573,"style":1373},[1372],[1304,18575,1334],{"className":18576},[1377],[1304,18578],{"className":18579,"style":1373},[1372],[1304,18581,18583,18586],{"className":18582},[1357],[1304,18584],{"className":18585,"style":4230},[1361],[1304,18587,18539],{"className":18588},[1366],[1097,18590,18591],{},"也就是 8 个周期才完成 1 个浮点加法。\n这很浪费，因为功能单元很多时候是空着的。",[1097,18593,18594],{},"为什么浪费？因为单次循环里指令太少，load、fadd、store、branch 之间还有延迟和依赖，很难把所有功能单元填满。",[1231,18596],{},[978,18598,18600],{"id":18599},"第-68-页loop-unrolling循环展开","第 68 页：Loop Unrolling，循环展开",[1097,18602,18603],{},"循环展开就是一次处理多个迭代。",[1097,18605,18606],{},"原来：",[2259,18608,18610],{"className":18609,"code":18491,"language":2768,"meta":2265},[2766],[1071,18611,18491],{"__ignoreMap":2265},[1097,18613,18614],{},"4 路展开后：",[2259,18616,18619],{"className":18617,"code":18618,"language":2768,"meta":2265},[2766],"for (i = 0; i \u003C N; i += 4) {\n    B[i]   = A[i]   + C;\n    B[i+1] = A[i+1] + C;\n    B[i+2] = A[i+2] + C;\n    B[i+3] = A[i+3] + C;\n}\n",[1071,18620,18618],{"__ignoreMap":2265},[1097,18622,18623,18624],{},"这和上一模块的 loop unrolling 是同一个思想：\n",[1104,18625,18626],{},"一次展开多个迭代，暴露更多互不依赖的指令。",[1097,18628,18629],{},[1104,18630,18631],{},"它没有凭空创造并行性。它只是把原来分散在 4 次迭代里的独立工作，放进一个更大的基本块里，让编译器\u002F硬件更容易看见。（本质是共用一个分支预测，减少了循环结构的延时）",[1097,18633,18634],{},"注意一个小细节：如果 (N) 不是展开因子，比如不是 4 的倍数，要额外处理尾巴部分。课件也提醒了这一点。",[1231,18636],{},[978,18638,18640],{"id":18639},"第-69-页调度循环展开后的代码重要","第 69 页：调度循环展开后的代码，重要",[1097,18642,18643],{},"4 路展开后，循环体里有 4 次 load、4 次 fadd、4 次 store。",[1097,18645,18646],{},[1246,18647],{"alt":1246,"src":18648},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-23.png",[1097,18650,18651],{},"编译器可以把它们重新排序，比如先连续 load，再连续 fadd，再 store。",[1097,18653,18654],{},"课件给出的性能是：",[1304,18656,18658],{"className":18657},[1307],[1304,18659,18661,18690],{"className":18660},[1311],[1304,18662,18664],{"className":18663},[1315],[1317,18665,18666],{"xmlns":1319,"display":1320},[1322,18667,18668,18687],{},[1325,18669,18670,18672,18675,18677,18680,18682,18684],{},[1869,18671,8511],{},[3995,18673,18674],{}," fadds",[1328,18676,3469],{"mathvariant":2802},[1869,18678,18679],{},"11",[3995,18681,18534],{},[1332,18683,1334],{},[1869,18685,18686],{},"0.36",[1345,18688,18689],{"encoding":1347},"4 \\text{ fadds} \u002F 11 \\text{ cycles} = 0.36",[1304,18691,18693,18727],{"className":18692,"ariaHidden":1353},[1352],[1304,18694,18696,18699,18702,18708,18712,18718,18721,18724],{"className":18695},[1357],[1304,18697],{"className":18698,"style":3714},[1361],[1304,18700,8511],{"className":18701},[1366],[1304,18703,18705],{"className":18704},[1366,18502],[1304,18706,18674],{"className":18707},[1366],[1304,18709,18711],{"className":18710},[1366],"\u002F11",[1304,18713,18715],{"className":18714},[1366,18502],[1304,18716,18534],{"className":18717},[1366],[1304,18719],{"className":18720,"style":1373},[1372],[1304,18722,1334],{"className":18723},[1377],[1304,18725],{"className":18726,"style":1373},[1372],[1304,18728,18730,18733],{"className":18729},[1357],[1304,18731],{"className":18732,"style":4230},[1361],[1304,18734,18686],{"className":18735},[1366],[1097,18737,18738],{},"相比第 67 页：",[1304,18740,18742],{"className":18741},[1307],[1304,18743,18745,18763],{"className":18744},[1311],[1304,18746,18748],{"className":18747},[1315],[1317,18749,18750],{"xmlns":1319,"display":1320},[1322,18751,18752,18760],{},[1325,18753,18754,18756,18758],{},[1869,18755,18539],{},[1332,18757,4761],{},[1869,18759,18686],{},[1345,18761,18762],{"encoding":1347},"0.125 \\rightarrow 0.36",[1304,18764,18766,18784],{"className":18765,"ariaHidden":1353},[1352],[1304,18767,18769,18772,18775,18778,18781],{"className":18768},[1357],[1304,18770],{"className":18771,"style":4230},[1361],[1304,18773,18539],{"className":18774},[1366],[1304,18776],{"className":18777,"style":1373},[1372],[1304,18779,4761],{"className":18780},[1377],[1304,18782],{"className":18783,"style":1373},[1372],[1304,18785,18787,18790],{"className":18786},[1357],[1304,18788],{"className":18789,"style":4230},[1361],[1304,18791,18686],{"className":18792},[1366],[1097,18794,18795],{},"提升明显。",[1097,18797,18798],{},"原因不是计算量少了，而是：",[1209,18800,18801,18804,18807,18810],{},[1212,18802,18803],{},"循环控制开销摊薄了；",[1212,18805,18806],{},"编译器看到更多独立指令；",[1212,18808,18809],{},"不同迭代之间的 load \u002F fadd \u002F store 可以交错；",[1212,18811,18812],{},"功能单元更不容易空着。",[1097,18814,18815],{},"这一页很适合出问答：",[1097,18817,18818],{},[1104,18819,18820],{},"问：为什么循环展开能提高 ILP？",[1097,18822,18823],{},"答：",[1991,18825,18826],{},[1097,18827,18828],{},"循环展开把多个迭代放进一个更大的循环体中，暴露跨迭代的独立指令，使编译器\u002F硬件能更好地调度 load、compute、store，并减少循环分支开销。",[1231,18830],{},[978,18832,18834],{"id":18833},"第-70-页software-pipelining软件流水线最重要","第 70 页：Software Pipelining，软件流水线，最重要",[1097,18836,18837],{},"软件流水线比循环展开更进一步。",[1097,18839,18840],{},"普通循环像这样：",[2259,18842,18845],{"className":18843,"code":18844,"language":18502},[18500],"第 i 次迭代：load → add → store\n第 i+1 次迭代：load → add → store\n第 i+2 次迭代：load → add → store\n",[1071,18846,18844],{"__ignoreMap":2265},[1097,18848,18849],{},"软件流水线会把不同迭代的不同阶段重叠起来：",[2259,18851,18854],{"className":18852,"code":18853,"language":18502},[18500],"普通 loop unrolling：\n[第 i 轮完整做完] [第 i+1 轮完整做完] [第 i+2 轮完整做完]\n\n软件流水线：\n第 i 轮：        load → add → store\n第 i+1 轮：          load → add → store\n第 i+2 轮：                load → add → store\n第 i+3 轮：                      load → add → store\n",[1071,18855,18853],{"__ignoreMap":2265},[1097,18857,18858],{},"也就是在同一个循环周期里，同时做：",[2284,18860,18861,18864,18867],{},[1212,18862,18863],{},"当前迭代的 store；",[1212,18865,18866],{},"前一\u002F后一迭代的 fadd；",[1212,18868,18869],{},"更后一迭代的 load。",[18284,18871,18872,18875],{"type":18286},[1097,18873,18874],{},"这里的流水线其实和硬件的流水线是一样的",[1097,18876,18877],{},"其实本质是硬件流水线是硬件基础，软件流水线尽量跑满整个流程",[1097,18879,18880],{},"课件第 70 页的结果是：",[1304,18882,18884],{"className":18883},[1307],[1304,18885,18887,18913],{"className":18886},[1311],[1304,18888,18890],{"className":18889},[1315],[1317,18891,18892],{"xmlns":1319,"display":1320},[1322,18893,18894,18910],{},[1325,18895,18896,18898,18900,18902,18904,18906,18908],{},[1869,18897,8511],{},[3995,18899,18674],{},[1328,18901,3469],{"mathvariant":2802},[1869,18903,8511],{},[3995,18905,18534],{},[1332,18907,1334],{},[1869,18909,2327],{},[1345,18911,18912],{"encoding":1347},"4 \\text{ fadds} \u002F 4 \\text{ cycles} = 1",[1304,18914,18916,18950],{"className":18915,"ariaHidden":1353},[1352],[1304,18917,18919,18922,18925,18931,18935,18941,18944,18947],{"className":18918},[1357],[1304,18920],{"className":18921,"style":3714},[1361],[1304,18923,8511],{"className":18924},[1366],[1304,18926,18928],{"className":18927},[1366,18502],[1304,18929,18674],{"className":18930},[1366],[1304,18932,18934],{"className":18933},[1366],"\u002F4",[1304,18936,18938],{"className":18937},[1366,18502],[1304,18939,18534],{"className":18940},[1366],[1304,18942],{"className":18943,"style":1373},[1372],[1304,18945,1334],{"className":18946},[1377],[1304,18948],{"className":18949,"style":1373},[1372],[1304,18951,18953,18956],{"className":18952},[1357],[1304,18954],{"className":18955,"style":4230},[1361],[1304,18957,2327],{"className":18958},[1366],[1097,18960,18961],{},"这比循环展开的：",[1304,18963,18965],{"className":18964},[1307],[1304,18966,18968,18990],{"className":18967},[1311],[1304,18969,18971],{"className":18970},[1315],[1317,18972,18973],{"xmlns":1319,"display":1320},[1322,18974,18975,18987],{},[1325,18976,18977,18979,18981,18983,18985],{},[1869,18978,8511],{},[1328,18980,3469],{"mathvariant":2802},[1869,18982,18679],{},[1332,18984,1334],{},[1869,18986,18686],{},[1345,18988,18989],{"encoding":1347},"4 \u002F 11 = 0.36",[1304,18991,18993,19012],{"className":18992,"ariaHidden":1353},[1352],[1304,18994,18996,18999,19003,19006,19009],{"className":18995},[1357],[1304,18997],{"className":18998,"style":3714},[1361],[1304,19000,19002],{"className":19001},[1366],"4\u002F11",[1304,19004],{"className":19005,"style":1373},[1372],[1304,19007,1334],{"className":19008},[1377],[1304,19010],{"className":19011,"style":1373},[1372],[1304,19013,19015,19018],{"className":19014},[1357],[1304,19016],{"className":19017,"style":4230},[1361],[1304,19019,18686],{"className":19020},[1366],[1097,19022,19023],{},"又高很多。",[1231,19025],{},[978,19027,19029],{"id":19028},"第-71-页software-pipelining-vs-loop-unrolling","第 71 页：Software Pipelining vs Loop Unrolling",[1097,19031,19032],{},"第 71 页的核心结论：",[1991,19034,19035],{},[1097,19036,19037],{},"软件流水线只在整个循环中支付一次启动\u002F结束成本，而不是每个迭代都支付一次。",[1097,19039,19040],{},"这句话很重要。",[1097,19042,19043],{},[1246,19044],{"alt":1246,"src":19045},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-24.png",[1097,19047,19048,19049,19052],{},"循环展开虽然也能提高并行度，但每个展开后的大循环体内部",[1101,19050,19051],{},"仍然有启动和收尾的浪费","。软件流水线把不同迭代叠起来，让稳定阶段持续运行，吞吐率更高。",[1097,19054,19055],{},"考试可以这样比较：",[982,19057,19058,19071],{},[985,19059,19060],{},[988,19061,19062,19065,19068],{},[991,19063,19064],{},"方法",[991,19066,19067],{},"优点",[991,19069,19070],{},"缺点",[1001,19072,19073,19083],{},[988,19074,19075,19077,19080],{},[1006,19076,13265],{},[1006,19078,19079],{},"简单，暴露更多独立指令，减少分支",[1006,19081,19082],{},"代码变大，尾部处理麻烦",[988,19084,19085,19088,19091],{},[1006,19086,19087],{},"Software Pipelining",[1006,19089,19090],{},"稳定阶段吞吐率高，更充分利用功能单元",[1006,19092,19093],{},"调度复杂，需要 prolog\u002Fepilog，寄存器压力大",[1097,19095,19096],{},"这几页是本模块最核心的“会考”区域。",[1231,19098],{},[1092,19100,19102],{"id":19101},"第-7275-页非循环代码与-trace-scheduling","第 72–75 页：非循环代码与 Trace Scheduling",[978,19104,19106],{"id":19105},"第-72-页如果没有循环呢","第 72 页：如果没有循环呢？",[1097,19108,19109,19110,19113],{},"循环好优化，因为模式重复，编译器容易从很多迭代里挖出 ILP。\n但如果代码是大量 ",[1071,19111,19112],{"code":19112},"if-else","、分支、跳转，就麻烦了。",[1097,19115,19116],{},"第 72 页说：分支会限制控制流密集型、不规则代码里的基本块大小，而在单独的基本块中很难找到足够的 ILP。",[1097,19118,19119,6178],{},[1104,19120,19121],{},"Basic block，基本块",[1991,19123,19124],{},[1097,19125,19126],{},"一段只有一个入口、一个出口，中间没有分支跳转的连续指令序列。",[1097,19128,19129],{},"基本块太短，就没有多少指令可调度。处理器\u002F编译器再聪明，也没米下锅。",[1231,19131],{},[978,19133,19135],{"id":19134},"第-73-页trace-scheduling跟踪调度","第 73 页：Trace Scheduling，跟踪调度",[982,19137,19138],{"style":7396},[1001,19139,19140],{},[988,19141,7402,19142,7402,19150],{"style":7401},[1006,19143,19145,7402],{"style":19144},"width: 57.0%; text-align: center; border: none; padding: 0.3em; margin: 0;",[1097,19146,19147],{},[1246,19148],{"alt":1246,"src":19149},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-25.png",[1006,19151,19153,7402],{"style":19152},"width: 42.0%; text-align: center; border: none; padding: 0.3em; margin: 0;",[1097,19154,19155],{},[1246,19156],{"alt":1246,"src":19157},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-26.png",[1097,19159,19160],{},"Trace scheduling 的思路是：",[1991,19162,19163],{},[1097,19164,19165],{},"不只看一个基本块，而是选一串最常走的基本块路径，把它们当成一个大的 trace 一起调度。",[1097,19167,19168],{},"它通常需要：",[2284,19170,19171,19174],{},[1212,19172,19173],{},"profiling feedback，运行时统计反馈；",[1212,19175,19176],{},"或 compiler heuristics，编译器启发式判断。",[1097,19178,19179],{},"然后编译器对整个 trace 做统一调度。\n如果程序真的沿着这条常见路径走，就很快；如果中途跳出了 trace，就需要补偿代码 compensation code 来修正状态。课件第 73 页明确提到选择最频繁分支路径、一次性调度整个 trace，并添加修复代码处理跳出 trace 的情况。",[1097,19181,19182],{},"这块可以这样记：",[1991,19184,19185],{},[1097,19186,19187],{},"Trace scheduling 是为了解决“基本块太小，ILP 不够”的问题；它跨越多个基本块找常见路径，但代价是需要补偿代码，编译器复杂度上升。",[978,19189,19191],{"id":19190},"第-7475-页例子和补偿代码略","第 74–75 页：例子和补偿代码，略",[1097,19193,19194],{},"这两页主要是图示。",[982,19196,19197],{"style":7396},[1001,19198,19199],{},[988,19200,7402,19201,7402,19209],{"style":7401},[1006,19202,19204,7402],{"style":19203},"width: 53.0%; text-align: center; border: none; padding: 0.3em; margin: 0;",[1097,19205,19206],{},[1246,19207],{"alt":1246,"src":19208},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-27.png",[1006,19210,19212,7402],{"style":19211},"width: 46.0%; text-align: center; border: none; padding: 0.3em; margin: 0;",[1097,19213,19214],{},[1246,19215],{"alt":1246,"src":19216},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-28.png",[1097,19218,19219],{},"抓住两个词就行：",[2284,19221,19222,19228],{},[1212,19223,19224,19227],{},[1104,19225,19226],{},"trace","：常走路径；",[1212,19229,19230,19233],{},[1104,19231,19232],{},"compensation code","：当执行偏离常走路径时，用来修正语义的补偿代码。",[1231,19235],{},[1092,19237,19239,19240],{"id":19238},"第-7677-页经典-vliw-的问题","第 76–77 页：",[1101,19241,19242],{},"经典 VLIW 的问题",[1097,19244,19245],{},"第 76 页很重要，因为它解释了为什么 VLIW 听起来很美，但通用计算领域很难成功。",[1097,19247,19248],{},"经典问题有五个：",[978,19250,19252],{"id":19251},"_1-目标代码兼容性差","1. 目标代码兼容性差",[1097,19254,19255],{},"VLIW 把功能单元数量、延迟、槽位结构等暴露给编译器。\n如果换一代机器，功能单元数量或延迟变了，原来的代码调度就不一定合适，甚至需要重新编译。",[1097,19257,19258],{},"这就很尴尬：\n普通 x86 程序可以跨很多处理器跑，VLIW 程序可能对具体机器太敏感。",[978,19260,19262],{"id":19261},"_2-目标代码大小变大","2. 目标代码大小变大",[1097,19264,19265,19266,19268],{},"VLIW 指令有很多槽位。\n如果某些槽没事做，就要填 ",[1071,19267,18457],{"code":18457},"，浪费指令空间。",[1097,19270,19271],{},"再加上循环展开、软件流水线会复制代码，代码体积更大，可能浪费 instruction cache。",[978,19273,19275],{"id":19274},"_3-可变延迟内存操作难调度","3. 可变延迟内存操作难调度",[1097,19277,19278],{},"编译器静态调度时，很希望知道：load 之后几周期数据可用？",[1097,19280,19281],{},"但现实里 load 可能命中 L1，也可能 L2\u002FL3，也可能 cache miss 去 DRAM。\n延迟不是固定的，编译器很难提前安排好。",[978,19283,19285],{"id":19284},"_4-分支概率难知道","4. 分支概率难知道",[1097,19287,19288],{},"Trace scheduling 需要知道哪条路径最常走。\n这可能需要 profile 反馈，增加构建流程复杂度。",[978,19290,19292],{"id":19291},"_5-不可预测分支难调度","5. 不可预测分支难调度",[1097,19294,19295],{},"不同分支路径的最佳调度可能完全不同。\n一个静态调度很难同时适配所有路径。",[1231,19297],{},[978,19299,19301],{"id":19300},"第-77-页vliw-指令编码","第 77 页：VLIW 指令编码",[1097,19303,19304],{},"这页讲如何减少 VLIW 未使用字段带来的浪费。",[1097,19306,19307],{},"方法包括：",[1209,19309,19310,19313,19316],{},[1212,19311,19312],{},"内存中压缩格式，填入 I-cache 时展开；",[1212,19314,19315],{},"标记并行组；",[1212,19317,19318],{},"提供单操作的 VLIW 指令。",[1097,19320,19321],{},"这页不太像重点计算题。记住一个结论：",[1991,19323,19324],{},[1097,19325,19326],{},"VLIW 指令很宽，容易浪费空间，所以需要编码技巧减少空槽和代码膨胀。",[1231,19328],{},[1092,19330,19332],{"id":19331},"第-7884-页itanium-ia-64-与旋转寄存器了解为主","第 78–84 页：Itanium \u002F IA-64 与旋转寄存器，了解为主",[1097,19334,19335],{},"这一段比较偏历史和具体架构。考试更可能考概念，不太会考具体参数。",[978,19337,19339],{"id":19338},"第-7880-页itanium-epic-ia-64了解即可","第 78–80 页：Itanium \u002F EPIC \u002F IA-64，了解即可",[1097,19341,19342],{},"第 78 页列了 Itanium “Poulson” 的硬件参数，比如 8 核、L1\u002FL2\u002FL3 cache、最多执行 12 指令\u002F周期等。参数不用背。",[1097,19344,19345],{},"第 79 页有几个词要分清：",[982,19347,19348,19357],{},[985,19349,19350],{},[988,19351,19352,19355],{},[991,19353,19354],{},"名词",[991,19356,3185],{},[1001,19358,19359,19367,19379,19387],{},[988,19360,19361,19364],{},[1006,19362,19363],{},"EPIC",[1006,19365,19366],{},"Explicitly Parallel Instruction Computing，显式并行指令计算",[988,19368,19369,19374],{},[1006,19370,19371],{},[1101,19372,19373],{},"IA-64",[1006,19375,19376],{},[1101,19377,19378],{},"Intel 的 64 位 ISA",[988,19380,19381,19384],{},[1006,19382,19383],{},"Itanium",[1006,19385,19386],{},"Intel 的处理器产品线",[988,19388,19389,19392],{},[1006,19390,19391],{},"Merced",[1006,19393,19394],{},"第一代 Itanium 产品",[1097,19396,19397],{},"课件说 EPIC 实际上就是一种 VLIW 风格，IA-64 是 Intel 选择的 ISA。",[1097,19399,19400],{},"第 80 页讲 IA-64 指令格式：",[2284,19402,19403,19406,19409,19412],{},[1212,19404,19405],{},"128-bit 指令束；",[1212,19407,19408],{},"包含 3 条指令 + template；",[1212,19410,19411],{},"template 描述这些指令和相邻 bundle 的分组；",[1212,19413,19414],{},"每个 group 中的指令可以并行执行。",[1097,19416,19417,19418],{},"这和 VLIW 的思想一致：",[1104,19419,19420],{},"把可并行关系显式编码进指令格式。",[1231,19422],{},[978,19424,19426],{"id":19425},"第-8184-页旋转寄存器文件理解概念即可","第 81–84 页：旋转寄存器文件，理解概念即可",[1097,19428,19429],{},"IA-64 有很多寄存器：",[2284,19431,19432,19435,19438,19441],{},[1212,19433,19434],{},"128 个通用整数寄存器；",[1212,19436,19437],{},"128 个浮点寄存器；",[1212,19439,19440],{},"64 个 1-bit 预测寄存器；",[1212,19442,19443],{},"GPRs（ General Purpose Registers通用寄存器） 可以 rotate，用来减少软件流水线循环的代码大小。",[1097,19445,19446,13179,19451,1107],{},[1101,19447,19448],{},[1104,19449,19450],{},"旋转寄存器文件 Rotating Register File",[1101,19452,19453],{},"是为软件流水线服务的",[1097,19455,19456],{},"软件流水线会把多个迭代重叠执行，于是不同迭代需要不同寄存器保存中间结果。\n如果手工写，会出现大量 prolog\u002Fepilog 和寄存器重命名代码。",[1097,19458,19459],{},[1246,19460],{"alt":1246,"src":19461},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-29.png",[1097,19463,19464],{},"旋转寄存器的思路是：",[1991,19466,19467],{},[1097,19468,19469],{},"每次循环迭代时，逻辑寄存器名自动映射到不同的物理寄存器组。",[1097,19471,19472],{},"这样同一段循环代码可以在不同迭代中使用“看起来一样”的寄存器名，但背后对应不同物理寄存器，减少代码膨胀。",[1097,19474,19475,19476,19479],{},"可以这么理解：\n你写的是 ",[1071,19477,19478],{"code":19478},"f1, f5, f9","，但每次循环硬件把“抽屉编号”自动旋转一下，避免不同迭代互相覆盖。挺像酒店前台把同一个“房型”分配给不同房间，顾客不用知道具体门牌号。",[1231,19481],{},[1092,19483,19485],{"id":19484},"第-8587-页预测执行推测执行数据推测概念重要","第 85–87 页：预测执行、推测执行、数据推测，概念重要",[1097,19487,19488],{},"这几页是 IA-64 为了帮助静态调度设计的机制。你不用记具体指令名，但要明白它们解决什么问题。",[978,19490,19492],{"id":19491},"第-85-页predicated-execution预测执行重要","第 85 页：Predicated Execution，预测执行，重要",[1097,19494,19495],{},"问题：",[1991,19497,19498],{},[1097,19499,19500],{},"分支会限制 ILP。",[1097,19502,19503,19504,19506],{},"因为 ",[1071,19505,19112],{"code":19112}," 会把代码切成多个基本块，基本块短，调度空间小。",[1097,19508,19509],{},"预测执行的做法是：\n把分支两边的指令都放到同一个基本块里，但给每条指令加一个谓词条件。",[1097,19511,19512],{},"类似：",[2259,19514,19517],{"className":19515,"code":19516,"language":18502},[18500],"(p1) Inst 3\n(p2) Inst 5\n",[1071,19518,19516],{"__ignoreMap":2265},[1097,19520,9955,19521,19524,19525,19528,19529,19531],{},[1071,19522,19523],{"code":19523},"p1"," 为真，就执行 ",[1071,19526,19527],{"code":19527},"Inst 3","；如果 ",[1071,19530,19523],{"code":19523}," 为假，这条指令就变成 NOP。",[1097,19533,19534],{},"这样可以减少分支，把多个基本块合成一个更大的调度区域。课件也说 IA-64 中几乎所有指令都可以在预测寄存器下有条件执行，预测寄存器为假时指令变成 NOP。",[1097,19536,19537],{},"但代价是：",[2284,19539,19540,19543],{},[1212,19541,19542],{},"可能执行一些最终无用的指令；",[1212,19544,19545],{},"前递、依赖、异常处理变复杂。",[1231,19547],{},[978,19549,19551],{"id":19550},"第-86-页speculative-execution推测执行重要度中等","第 86 页：Speculative Execution，推测执行，重要度中等",[1097,19553,19495],{},[1991,19555,19556],{},[1097,19557,19558],{},"分支限制了编译器移动代码的自由。",[1097,19560,19561],{},"比如某个 load 在分支后面。编译器想把它提前到分支前面，以便早点开始内存访问，隐藏 load latency。",[1097,19563,19564],{},"但普通 load 不能乱提前，因为它可能触发异常。\n比如本来这条路径不会执行 load，结果你提前执行了，却访问非法地址，产生“虚假异常”。",[1097,19566,19567,19568,6178],{},"IA-64 的解决方式是 ",[1104,19569,19570],{},"speculative load",[2284,19572,19573,19576,19579,19582],{},[1212,19574,19575],{},"推测 load 不立即抛异常；",[1212,19577,19578],{},"如果有问题，就在目标寄存器上设置 poison 位；",[1212,19580,19581],{},"后面用 check 指令检查；",[1212,19583,19584],{},"如果真的出错，再跳到修复代码。",[1097,19586,19587],{},"这对提前调度长延迟 load 很有用。",[1231,19589],{},[978,19591,19593],{"id":19592},"第-87-页data-speculation数据推测了解","第 87 页：Data Speculation，数据推测，了解",[1097,19595,19495],{},[1991,19597,19598],{},[1097,19599,19600],{},"可能的内存冒险限制代码调度。",[1097,19602,8741],{},[2259,19604,19607],{"className":19605,"code":19606,"language":18502},[18500],"store [addr]\nload  r1, [addr2]\n",[1071,19608,19606],{"__ignoreMap":2265},[1097,19610,19611,19612,8799,19615,19618],{},"编译器不知道 ",[1071,19613,19614],{"code":19614},"addr",[1071,19616,19617],{"code":19617},"addr2"," 会不会相同。\n如果相同，load 不能提前到 store 前面；如果不同，提前其实没问题。",[1097,19620,19621],{},"数据推测的做法是：\n允许 load 先提前执行，但硬件用 address check table 检查后面的 store 是否和它冲突。若冲突，则跳转到修复代码。",[1097,19623,19624],{},"这页的重点不是细节，而是：",[1991,19626,19627],{},[1097,19628,19629],{},"IA-64 为了支持编译器静态调度，加入了很多硬件机制来处理分支和内存不确定性。",[1097,19631,19632],{},"这也反过来说明：VLIW\u002FEPIC 想让硬件简单，但为了应付真实程序，最后硬件又复杂起来了。",[1231,19634],{},[1092,19636,19638],{"id":19637},"第-8889-页静态调度的限制与-itanium-结局","第 88–89 页：静态调度的限制与 Itanium 结局",[1097,19640,19641],{},"第 88 页是本模块的总结，非常重要。",[1097,19643,19644],{},"静态调度的限制包括：",[1209,19646,19647,19650,19653,19656],{},[1212,19648,19649],{},"不可预知的分支；",[1212,19651,19652],{},"不可预测的 cache miss；",[1212,19654,19655],{},"代码量爆炸；",[1212,19657,19658],{},"编译器复杂性。",[1097,19660,19661,19662,19665],{},"课件明确说：",[1101,19663,19664],{},"尽管多次尝试，VLIW 在通用计算领域到目前为止都失败了","；更复杂的 VLIW 架构在复杂性上接近有序超标量，但在大型复杂应用上没有真正优势。不过 VLIW 在嵌入式 DSP 市场更成功，因为那里的环境更简单、更受约束、代码更友好。",[1097,19667,19668],{},"第 89 页讲 Intel 放弃 Itanium。重点不是背日期，而是理解原因：",[1991,19670,19671],{},[1097,19672,19673],{},"Itanium\u002FIA-64 的核心困难在于，它太依赖编译器把并行性提前挖出来，但现实程序有分支、cache miss、指针别名、可变延迟，编译器很难静态预测一切。",[1097,19675,19676],{},"这一页可以作为简答题结尾：",[1991,19678,19679],{},[1097,19680,19681],{},"VLIW 的思想是用编译器静态暴露 ILP，降低硬件动态调度复杂度；但通用程序中的动态行为太多，使静态调度难以可靠高效，因此 VLIW\u002FItanium 在通用计算中失败，而在嵌入式 DSP 等受控环境中较成功。",[1231,19683],{},[1092,19685,19686],{"id":19686},"一页纸版总结",[1097,19688,19689],{},"这模块可以用一条线串起来：",[1097,19691,19692],{},[1104,19693,19694],{},"ILP 想让一个线程里的多条指令并行执行。",[1097,19696,19697],{},"实现 ILP 有两种典型路线：",[1209,19699,19700,19705],{},[1212,19701,19702,19704],{},[1104,19703,18335],{},"：硬件动态找并行；",[1212,19706,19707,19709],{},[1104,19708,18225],{},"：编译器静态安排并行。",[1097,19711,19712,19713,19716],{},"VLIW 的优点是",[1101,19714,19715],{},"硬件调度逻辑可以更简单；缺点是编译器压力巨大","，而且现实程序有分支、cache miss、指针别名等动态不确定性。",[1097,19718,19719],{},"循环里比较容易找 ILP，所以有：",[2284,19721,19722,19730],{},[1212,19723,19724,6178,19727,3279],{},[1104,19725,19726],{},"Loop unrolling",[1101,19728,19729],{},"展开多个迭代，暴露更多独立指令",[1212,19731,19732,19735],{},[1104,19733,19734],{},"Software pipelining","：把不同迭代的 load \u002F compute \u002F store 重叠起来，提高稳定阶段吞吐率。",[1097,19737,19738],{},"非循环代码由于分支导致基本块短，ILP 不够，所以有：",[2284,19740,19741,19747],{},[1212,19742,19743,19746],{},[1104,19744,19745],{},"Trace scheduling","：选常见路径跨基本块调度；",[1212,19748,19749,19752],{},[1104,19750,19751],{},"Compensation code","：偏离 trace 时修正语义。",[1097,19754,19755],{},"IA-64\u002FItanium 为支持 VLIW\u002FEPIC 加入了：",[2284,19757,19758,19761,19764,19767,19770],{},[1212,19759,19760],{},"instruction bundle；",[1212,19762,19763],{},"rotating registers；",[1212,19765,19766],{},"predicated execution；",[1212,19768,19769],{},"speculative execution；",[1212,19771,19772],{},"data speculation。",[1097,19774,19775],{},"但最后通用计算领域没成功，因为：",[1991,19777,19778],{},[1097,19779,19780],{},"静态调度很难预测真实程序的分支、cache miss 和内存依赖，代码量和编译器复杂度都太高。",[1231,19782],{},[1087,19784,19786],{"id":19785},"第-4-模块线程级并行-tlp","第 4 模块：线程级并行 TLP",[1097,19788,8305,19789,1107],{},[1104,19790,19791],{},"第 4 模块：线程级并行 TLP，Thread Level Parallelism，第 90–125 页",[1097,19793,19794],{},"这一板块的第一性原理是：",[1991,19796,19797],{},[1097,19798,19799,19800,19803,19808,19811,19816],{},"一个 CPU 核本质上一次只能沿着一个 PC 指向的指令流往前执行。\n要同时推进多个任务，",[1101,19801,19802],{},"要么",[1101,19804,19805],{},[1104,19806,19807],{},"复制核心",[1101,19809,19810],{},"，要么",[1101,19812,19813],{},[1104,19814,19815],{},"复制线程状态并共享核心资源","，要么由操作系统把很多软件线程轮流塞进少量硬件线程里。",[1097,19818,19819,19820],{},"所以这一章不是单纯讲“多开几个线程”，而是在讲：",[1104,19821,19822],{},"线程是什么、核心是什么、硬件线程是什么、操作系统怎么制造“同时运行”的幻觉、超线程到底为什么有时有用有时没用。",[1231,19824],{},[1092,19826,19828],{"id":19827},"第-90-页标题页","第 90 页：标题页",[1097,19830,18157,19831,1107],{},[1104,19832,19833],{},"线程级并行 Thread Level Parallelism",[1097,19835,19836],{},"前面 DLP 是“一条指令处理多个数据”，ILP 是“一个线程内部多条指令并行”。\n现在 TLP 是：",[1991,19838,19839],{},[1097,19840,19841],{},"多个线程 \u002F 多个任务 \u002F 多个指令流同时推进。",[1097,19843,19844,19845,19847],{},"它对应 Flynn 分类里的 ",[1104,19846,7503],{},"：多个指令流，多个数据流。",[1231,19849],{},[1092,19851,19853],{"id":19852},"第-91-页改进性能的三条路重要","第 91 页：改进性能的三条路，重要",[1097,19855,19856],{},"程序运行时间大概可以写成：",[1304,19858,19860],{"className":19859},[1307],[1304,19861,19863,19955],{"className":19862},[1311],[1304,19864,19866],{"className":19865},[1315],[1317,19867,19868],{"xmlns":1319,"display":1320},[1322,19869,19870,19952],{},[1325,19871,19872,19875,19877,19879,19881,19883],{},[1328,19873,19874],{},"T",[1328,19876,1439],{},[1328,19878,4970],{},[1328,19880,2814],{},[1332,19882,1334],{},[2533,19884,19885,19930],{},[1325,19886,19887,19890,19892,19894,19896,19898,19900,19902,19904,19906,19908,19910,19912,19914,19916,19918,19920,19922,19924,19926,19928],{},[1328,19888,19889],{},"I",[1328,19891,2817],{},[1328,19893,2825],{},[1328,19895,2549],{},[1328,19897,2833],{},[1328,19899,3439],{},[1328,19901,2768],{},[1328,19903,2549],{},[1328,19905,1439],{},[1328,19907,14534],{},[1328,19909,2817],{},[3995,19911,7582],{},[1328,19913,1330],{},[1328,19915,14534],{},[1328,19917,3439],{},[1328,19919,2817],{},[1328,19921,2549],{},[1332,19923,1340],{},[1328,19925,1330],{},[1328,19927,2526],{},[1328,19929,19889],{},[1325,19931,19932,19934,19936,19938,19940,19942,19944,19946,19948,19950],{},[1328,19933,1330],{},[1328,19935,10533],{},[1328,19937,14534],{},[1328,19939,2768],{},[1328,19941,1453],{},[3995,19943,7582],{},[1328,19945,2862],{},[1328,19947,2830],{},[1328,19949,2549],{},[1328,19951,2814],{},[1345,19953,19954],{"encoding":1347},"Time = \\frac{Instruction\\ Count \\times CPI}{Clock\\ Rate}",[1304,19956,19958,19983],{"className":19957,"ariaHidden":1353},[1352],[1304,19959,19961,19964,19967,19971,19974,19977,19980],{"className":19960},[1357],[1304,19962],{"className":19963,"style":1362},[1361],[1304,19965,19874],{"className":19966,"style":2573},[1366,1367],[1304,19968,19970],{"className":19969},[1366,1367],"im",[1304,19972,2814],{"className":19973},[1366,1367],[1304,19975],{"className":19976,"style":1373},[1372],[1304,19978,1334],{"className":19979},[1377],[1304,19981],{"className":19982,"style":1373},[1372],[1304,19984,19986,19989],{"className":19985},[1357],[1304,19987],{"className":19988,"style":4013},[1361],[1304,19990,19992,19995,20138],{"className":19991},[1366],[1304,19993],{"className":19994},[2611,2612],[1304,19996,19998],{"className":19997},[2533],[1304,19999,20001,20130],{"className":20000},[1502,1503],[1304,20002,20004,20127],{"className":20003},[1507],[1304,20005,20007,20042,20050],{"className":20006,"style":4032},[1511],[1304,20008,20009,20012],{"style":2628},[1304,20010],{"className":20011,"style":2632},[1519],[1304,20013,20015,20018,20021,20024,20027,20030,20033,20036,20039],{"className":20014},[1366],[1304,20016,1330],{"className":20017,"style":1368},[1366,1367],[1304,20019,10533],{"className":20020,"style":10717},[1366,1367],[1304,20022,14708],{"className":20023},[1366,1367],[1304,20025,1453],{"className":20026,"style":1594},[1366,1367],[1304,20028,7582],{"className":20029},[1372],[1304,20031,2862],{"className":20032,"style":2996},[1366,1367],[1304,20034,2830],{"className":20035},[1366,1367],[1304,20037,2549],{"className":20038},[1366,1367],[1304,20040,2814],{"className":20041},[1366,1367],[1304,20043,20044,20047],{"style":2684},[1304,20045],{"className":20046,"style":2632},[1519],[1304,20048],{"className":20049,"style":2692},[2691],[1304,20051,20052,20055],{"style":2695},[1304,20053],{"className":20054,"style":2632},[1519],[1304,20056,20058,20061,20064,20067,20070,20073,20076,20079,20082,20085,20088,20091,20094,20097,20100,20103,20106,20109,20112,20115,20118,20121,20124],{"className":20057},[1366],[1304,20059,19889],{"className":20060,"style":14630},[1366,1367],[1304,20062,2817],{"className":20063},[1366,1367],[1304,20065,2825],{"className":20066},[1366,1367],[1304,20068,2549],{"className":20069},[1366,1367],[1304,20071,2833],{"className":20072,"style":2581},[1366,1367],[1304,20074,3439],{"className":20075},[1366,1367],[1304,20077,2768],{"className":20078},[1366,1367],[1304,20080,2549],{"className":20081},[1366,1367],[1304,20083,1439],{"className":20084},[1366,1367],[1304,20086,14534],{"className":20087},[1366,1367],[1304,20089,2817],{"className":20090},[1366,1367],[1304,20092,7582],{"className":20093},[1372],[1304,20095,1330],{"className":20096,"style":1368},[1366,1367],[1304,20098,14534],{"className":20099},[1366,1367],[1304,20101,3439],{"className":20102},[1366,1367],[1304,20104,2817],{"className":20105},[1366,1367],[1304,20107,2549],{"className":20108},[1366,1367],[1304,20110],{"className":20111,"style":1394},[1372],[1304,20113,1340],{"className":20114},[1398],[1304,20116],{"className":20117,"style":1394},[1372],[1304,20119,1330],{"className":20120,"style":1368},[1366,1367],[1304,20122,2526],{"className":20123,"style":2573},[1366,1367],[1304,20125,19889],{"className":20126,"style":14630},[1366,1367],[1304,20128,1540],{"className":20129},[1539],[1304,20131,20133],{"className":20132},[1507],[1304,20134,20136],{"className":20135,"style":4073},[1511],[1304,20137],{},[1304,20139],{"className":20140},[2749,2612],[1097,20142,20143],{},"所以想让程序更快，理论上有三条路：",[1209,20145,20146,20227,20233],{},[1212,20147,20148,20151,20224,20226],{},[1104,20149,20150],{},"提高时钟频率 (",[1304,20152,20154,20173],{"className":20153},[1311],[1304,20155,20157],{"className":20156},[1315],[1317,20158,20159],{"xmlns":1319},[1322,20160,20161,20170],{},[1325,20162,20163],{},[1431,20164,20165,20168],{},[1328,20166,20167],{},"f",[1328,20169,2825],{},[1345,20171,20172],{"encoding":1347},"f_s",[1304,20174,20176],{"className":20175,"ariaHidden":1353},[1352],[1304,20177,20179,20182],{"className":20178},[1357],[1304,20180],{"className":20181,"style":3488},[1361],[1304,20183,20185,20189],{"className":20184},[1366],[1304,20186,20167],{"className":20187,"style":20188},[1366,1367],"margin-right:0.1076em;",[1304,20190,20192],{"className":20191},[1498],[1304,20193,20195,20216],{"className":20194},[1502,1503],[1304,20196,20198,20213],{"className":20197},[1507],[1304,20199,20201],{"className":20200,"style":5020},[1511],[1304,20202,20204,20207],{"style":20203},"top:-2.55em;margin-left:-0.1076em;margin-right:0.05em;",[1304,20205],{"className":20206,"style":1520},[1519],[1304,20208,20210],{"className":20209},[1524,1525,1526,1527],[1304,20211,2825],{"className":20212},[1366,1367,1527],[1304,20214,1540],{"className":20215},[1539],[1304,20217,20219],{"className":20218},[1507],[1304,20220,20222],{"className":20221,"style":1668},[1511],[1304,20223],{},[1104,20225,3461],{},"\n也就是 CPU 主频更高。但课件说当今通用计算机已经接近实用极限，一般用途 CPU 很难继续靠主频暴涨。",[1212,20228,20229,20232],{},[1104,20230,20231],{},"降低 CPI","\nCPI 是每条指令平均需要多少周期。SIMD、流水线、乱序执行、ILP 都在干这件事：让单个核心每周期做更多事。",[1212,20234,20235,20238],{},[1104,20236,20237],{},"同时执行多个任务","\n这就是本板块：多个 CPU\u002Fcore 同时跑多个指令流。",[1097,20240,20241],{},"这里要注意：TLP 有两种场景。",[1097,20243,20244,20245,20248,20249,20252],{},"一种是",[1104,20246,20247],{},"相关任务","，例如把一个大矩阵乘法切成几块，每个核心算一部分。另一种是",[1104,20250,20251],{},"无关任务","，例如一个核心跑浏览器，一个核心跑 PPT，一个核心处理后台服务。课件最后说真正现代机器是“都要”：高主频、SIMD、多任务并行一起用。",[1991,20254,20255],{},[1097,20256,20257],{},"这章主要是相关任务",[1097,20259,20260],{},"考试问“为什么需要 TLP？”可以答：",[1991,20262,20263],{},[1097,20264,20265],{},"主频提升遇到功耗和散热限制，单核 CPI 也有极限，所以需要通过多个核心\u002F线程同时推进多个任务来继续提高吞吐量。",[1231,20267],{},[1092,20269,20271],{"id":20270},"第-92-页并行计算机体系结构重要度中等","第 92 页：并行计算机体系结构，重要度中等",[1097,20273,20274],{},"这页是在把“线程级并行”放到不同规模的机器里看。",[1097,20276,20277],{},"从小到大：",[982,20279,20280,20290],{},[985,20281,20282],{},[988,20283,20284,20287],{},[991,20285,20286],{},"结构",[991,20288,20289],{},"第一性原理理解",[1001,20291,20292,20299,20307,20315],{},[988,20293,20294,20296],{},[1006,20295,1149],{},[1006,20297,20298],{},"在一个芯片上放多个处理核心，共享部分缓存、内存和外设",[988,20300,20301,20304],{},[1006,20302,20303],{},"GPU",[1006,20305,20306],{},"大量更简单的计算单元，适合高度并行的数据处理",[988,20308,20309,20312],{},[1006,20310,20311],{},"计算机阵列 \u002F 集群",[1006,20313,20314],{},"多台独立电脑通过网络通信",[988,20316,20317,20320],{},[1006,20318,20319],{},"Warehouse-scale computer",[1006,20321,20322],{},"数据中心级别，大量节点一起工作",[1097,20324,20325],{},"多核 CPU 的特点是：多个数据路径在单芯片上，通常共享 L3 cache、内存、外设。\n这就是在问：",[1991,20327,20328],{},[1097,20329,20330],{},"我们要复制多少硬件？哪些硬件复制？哪些硬件共享？",[1097,20332,20333],{},"如果完全复制一台电脑，那就是集群。\n如果复制核心但共享内存，那就是多核 CPU。\n如果复制很多小计算单元，强调吞吐，那就是 GPU。",[1231,20335],{},[1092,20337,20339],{"id":20338},"第-93-页两核-cpu重要","第 93 页：两核 CPU，重要",[1097,20341,20342],{},[1246,20343],{"alt":1246,"src":20344},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-30.png",[1097,20346,20347],{},"这页画了一个两核 CPU：两个处理器核心都有自己的控制器、数据通路和 PC，但访问同一个存储器系统。",[1991,20349,20350],{},[1097,20351,20352],{},"要独立执行两个指令流，至少要有两个独立的 PC。",[1097,20354,20355],{},"因为 PC 决定“下一条指令在哪里”。",[1097,20357,20358],{},"这就是 TLP 和 SIMD 的根本区别：",[982,20360,20361,20371],{},[985,20362,20363],{},[988,20364,20365,20368],{},[991,20366,20367],{},"并行类型",[991,20369,20370],{},"控制流",[1001,20372,20373,20380],{},[988,20374,20375,20377],{},[1006,20376,7475],{},[1006,20378,20379],{},"一个指令流控制多个数据",[988,20381,20382,20385],{},[1006,20383,20384],{},"TLP \u002F MIMD",[1006,20386,20387],{},"多个指令流各自推进",[1231,20389],{},[1092,20391,20393],{"id":20392},"第-94-页单核-cpu-vs-多核-cpu重要度中等","第 94 页：单核 CPU vs 多核 CPU，重要度中等",[1097,20395,20396],{},"这页定义单核和多核。",[1097,20398,20399,20402,20403,20405],{},[1104,20400,20401],{},"单核 CPU","：一个 CPU 核心加相关辅助电路封装在芯片中。\n",[1104,20404,1149],{},"：多个 CPU 核心加相关辅助电路封装在同一芯片中。",[1097,20407,20408],{},"“核心 core”最关键的是：",[2284,20410,20411,20414,20417,20420,20423],{},[1212,20412,20413],{},"能取指；",[1212,20415,20416],{},"能译码；",[1212,20418,20419],{},"有自己的执行路径；",[1212,20421,20422],{},"有自己的架构状态，比如 PC 和寄存器；",[1212,20424,20425],{},"能独立推进一条指令流。",[1097,20427,20428],{},"多核的直觉是“复制执行机器”。\n但复制不是免费的：面积、功耗、cache 一致性、内存带宽都会成为问题。",[1231,20430],{},[1092,20432,20434],{"id":20433},"第-95-页多处理器执行模型最重要之一","第 95 页：多处理器执行模型，最重要之一",[1097,20436,20437,20438,13138,20441,1107],{},"这页明确区分了",[1104,20439,20440],{},"独立资源",[1104,20442,20443],{},"共享资源",[1097,20445,20446],{},"每个 core 有自己的：",[2284,20448,20449,20452],{},[1212,20450,20451],{},"数据通路（PC；寄存器；ALU）",[1212,20453,20454],{},"通常还有较高层级的私有 cache，比如 L1\u002FL2。",[1097,20456,20457],{},"多个 core 共享：",[2284,20459,20460,20463],{},[1212,20461,20462],{},"DRAM 主存；",[1212,20464,20465],{},"通常共享 L3 cache；",[1097,20467,20468],{},"所以一个四核 CPU 可以同时执行四个不同的指令流，但它们并不是四台完全独立的机器，因为它们共享内存系统。",[1097,20470,20471],{},"这一页是 TLP 的硬件基础。",[1991,20473,20474],{},[1097,20475,20476],{},"计算需要“算力”和“数据”。多核复制了算力，但数据入口往往仍然共享。",[1097,20478,20479],{},"所以多核不一定线性加速。\n如果 4 个核心都疯狂访问 DRAM，它们会争同一条内存通路。瓶颈就从“算不动”变成“喂不饱”。",[1231,20481],{},[1092,20483,20485],{"id":20484},"第-96-页向多核过渡理解趋势即可","第 96 页：向多核过渡，理解趋势即可",[1097,20487,20488],{},"这页的图表达一个历史趋势：过去单线程程序性能每年大幅提升，后来靠单核继续提升越来越难。",[1097,20490,20491],{},[1246,20492],{"alt":1246,"src":20493},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-31.png",[1209,20495,20496,20499,20502,20505],{},[1212,20497,20498],{},"主频不能无限增加；",[1212,20500,20501],{},"单核乱序、超标量、流水线越做越复杂，边际收益下降；",[1212,20503,20504],{},"功耗近似和频率、电压、晶体管活动强相关；",[1212,20506,20507],{},"继续把晶体管堆在一个核心上，收益不如分成多个核心。",[1097,20509,20510],{},"所以处理器设计从“做一个越来越强的核”，转向“做多个够强的核”。",[1097,20512,20513,20514],{},"这页不太会考具体曲线，但可能考概念：",[1104,20515,20516],{},"为什么从单核转向多核？",[1231,20518],{},[1092,20520,20522],{"id":20521},"第-97-页多处理器执行模型","第 97 页：多处理器执行模型",[1097,20524,20525],{},"这页是多核编程的核心模型。",[1097,20527,20528,6178],{},[1104,20529,20530],{},"共享内存 Shared Memory",[1991,20532,20533],{},[1097,20534,20535],{},"每个 core 都能访问处理器中的整个内存。",[1097,20537,20538],{},"优点：",[2284,20540,20541],{},[1212,20542,20543],{},"程序员可以通过共享变量简化程序中的通信；",[1097,20545,20546],{},"缺点：",[2284,20548,20549],{},[1212,20550,20551],{},"扩展性不好，共享内存会被很多核心同时访问，成为瓶颈；",[1097,20553,20554],{},"课件还说使用多处理器有两种方式：",[1209,20556,20557,20563],{},[1212,20558,20559,20562],{},[1104,20560,20561],{},"多任务并行","：多个处理器处理无关问题，程序之间没有通信；",[1212,20564,20565,20568],{},[1104,20566,20567],{},"单任务划分","：把同一个任务拆给多个核心，比如每个核心算矩阵乘法的一部分。",[1097,20570,20571],{},"无关任务并行很简单：大家互不通信，互不等待。\n单任务并行难，因为要切分任务、同步结果、避免数据竞争、保证负载平衡。",[1231,20573],{},[1092,20575,20577],{"id":20576},"第-98-页并行处理困难但不可避免","第 98 页：并行处理困难但不可避免",[1097,20579,20580],{},"这页说并行处理“困难但不可避免”。",[1097,20582,20583],{},"为什么不可避免？",[2284,20585,20586,20589,20592],{},[1212,20587,20588],{},"性能提升需要并行；",[1212,20590,20591],{},"降低能耗也需要并行；",[1212,20593,20594],{},"移动设备、数据中心都在用多核和专用处理器。",[1097,20596,20597],{},"所以真实系统常常是：",[1304,20599,20601],{"className":20600},[1307],[1304,20602,20604,20653],{"className":20603},[1311],[1304,20605,20607],{"className":20606},[1315],[1317,20608,20609],{"xmlns":1319,"display":1320},[1322,20610,20611,20650],{},[1325,20612,20613,20616,20618,20621,20623,20626,20628,20631,20633,20635,20637,20640,20642,20644,20646,20648],{},[3995,20614,20615],{},"数据中心级并行",[1332,20617,3464],{},[3995,20619,20620],{},"多节点",[1332,20622,3464],{},[3995,20624,20625],{},"多核",[1332,20627,3464],{},[3995,20629,20630],{},"每核",[1328,20632,2529],{},[1328,20634,19889],{},[1328,20636,13579],{},[1328,20638,20639],{},"D",[1332,20641,3464],{},[3995,20643,20630],{},[1328,20645,19889],{},[1328,20647,2520],{},[1328,20649,2526],{},[1345,20651,20652],{"encoding":1347},"数据中心级并行 + 多节点 + 多核 + 每核SIMD + 每核ILP",[1304,20654,20656,20674,20692,20710,20740],{"className":20655,"ariaHidden":1353},[1352],[1304,20657,20659,20662,20665,20668,20671],{"className":20658},[1357],[1304,20660],{"className":20661,"style":1387},[1361],[1304,20663,20615],{"className":20664},[1366,4044],[1304,20666],{"className":20667,"style":1394},[1372],[1304,20669,3464],{"className":20670},[1398],[1304,20672],{"className":20673,"style":1394},[1372],[1304,20675,20677,20680,20683,20686,20689],{"className":20676},[1357],[1304,20678],{"className":20679,"style":1387},[1361],[1304,20681,20620],{"className":20682},[1366,4044],[1304,20684],{"className":20685,"style":1394},[1372],[1304,20687,3464],{"className":20688},[1398],[1304,20690],{"className":20691,"style":1394},[1372],[1304,20693,20695,20698,20701,20704,20707],{"className":20694},[1357],[1304,20696],{"className":20697,"style":1387},[1361],[1304,20699,20625],{"className":20700},[1366,4044],[1304,20702],{"className":20703,"style":1394},[1372],[1304,20705,3464],{"className":20706},[1398],[1304,20708],{"className":20709,"style":1394},[1372],[1304,20711,20713,20716,20719,20722,20725,20728,20731,20734,20737],{"className":20712},[1357],[1304,20714],{"className":20715,"style":1387},[1361],[1304,20717,20630],{"className":20718},[1366,4044],[1304,20720,2529],{"className":20721,"style":2588},[1366,1367],[1304,20723,19889],{"className":20724,"style":14630},[1366,1367],[1304,20726,13579],{"className":20727,"style":1891},[1366,1367],[1304,20729,20639],{"className":20730,"style":2581},[1366,1367],[1304,20732],{"className":20733,"style":1394},[1372],[1304,20735,3464],{"className":20736},[1398],[1304,20738],{"className":20739,"style":1394},[1372],[1304,20741,20743,20746,20749,20752,20755],{"className":20742},[1357],[1304,20744],{"className":20745,"style":1362},[1361],[1304,20747,20630],{"className":20748},[1366,4044],[1304,20750,19889],{"className":20751,"style":14630},[1366,1367],[1304,20753,2520],{"className":20754},[1366,1367],[1304,20756,2526],{"className":20757,"style":2573},[1366,1367],[1231,20759],{},[1092,20761,20763],{"id":20762},"第-99-页潜在并行性能重要","第 99 页：潜在并行性能，重要",[1097,20765,20766],{},"这页用表格展示一个趋势：核心数增加，SIMD 位宽增加，总的潜在 FLOPs\u002Fcycle 大幅增加。",[1097,20768,20769],{},"表里逻辑大概是：",[1304,20771,20773],{"className":20772},[1307],[1304,20774,20776,20812],{"className":20775},[1311],[1304,20777,20779],{"className":20778},[1315],[1317,20780,20781],{"xmlns":1319,"display":1320},[1322,20782,20783,20809],{},[1325,20784,20785,20788,20790,20793,20795,20798,20800,20802,20804,20806],{},[3995,20786,20787],{},"总并行能力",[1332,20789,5707],{},[3995,20791,20792],{},"核心数",[1332,20794,1340],{},[3995,20796,20797],{},"每核心",[1328,20799,2529],{},[1328,20801,19889],{},[1328,20803,13579],{},[1328,20805,20639],{},[3995,20807,20808],{},"宽度",[1345,20810,20811],{"encoding":1347},"总并行能力 \\approx 核心数 \\times 每核心SIMD宽度",[1304,20813,20815,20833,20851],{"className":20814,"ariaHidden":1353},[1352],[1304,20816,20818,20821,20824,20827,20830],{"className":20817},[1357],[1304,20819],{"className":20820,"style":1362},[1361],[1304,20822,20787],{"className":20823},[1366,4044],[1304,20825],{"className":20826,"style":1373},[1372],[1304,20828,5707],{"className":20829},[1377],[1304,20831],{"className":20832,"style":1373},[1372],[1304,20834,20836,20839,20842,20845,20848],{"className":20835},[1357],[1304,20837],{"className":20838,"style":1387},[1361],[1304,20840,20792],{"className":20841},[1366,4044],[1304,20843],{"className":20844,"style":1394},[1372],[1304,20846,1340],{"className":20847},[1398],[1304,20849],{"className":20850,"style":1394},[1372],[1304,20852,20854,20857,20860,20863,20866,20869,20872],{"className":20853},[1357],[1304,20855],{"className":20856,"style":1362},[1361],[1304,20858,20797],{"className":20859},[1366,4044],[1304,20861,2529],{"className":20862,"style":2588},[1366,1367],[1304,20864,19889],{"className":20865,"style":14630},[1366,1367],[1304,20867,13579],{"className":20868,"style":1891},[1366,1367],[1304,20870,20639],{"className":20871,"style":2581},[1366,1367],[1304,20873,20808],{"className":20874},[1366,4044],[1097,20876,20877],{},[1246,20878],{"alt":1246,"src":20879},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-32.png",[2284,20881,20882,20885],{},[1212,20883,20884],{},"MIMD 提供核心级并行；",[1212,20886,20887],{},"SIMD 提供每核心内部的数据并行；",[1097,20889,20890],{},"两者相乘，才有现代处理器的理论吞吐。",[1097,20892,20893,20894,20897],{},"但注意：这是",[1104,20895,20896],{},"潜在性能","，不是实际性能。\n实际能不能达到，要看程序是否有足够并行性、内存能不能喂饱、同步开销大不大。",[1231,20899],{},[1092,20901,20903],{"id":20902},"第-100-页电脑上同时运行很多程序重要度中等","第 100 页：电脑上同时运行很多程序，重要度中等",[1097,20905,20906],{},"这页列出一堆正在运行的进程，最后问：电脑如何同时做 156 个作业？",[1097,20908,20909,1107],{},[1101,20910,20911],{},"这是进入“线程\u002F操作系统调度”的引子",[1991,20913,20914],{},[1097,20915,20916],{},"如果硬件线程数量远小于软件任务数量，那么所谓“同时运行”很多时候是快速切换造成的幻觉。",[1097,20918,20919],{},"比如你电脑只有 4 个硬件线程，但系统里有 156 个进程。它不可能物理上同时跑完所有进程。操作系统会：",[2284,20921,20922,20925,20928,20931],{},[1212,20923,20924],{},"让一部分线程运行；",[1212,20926,20927],{},"让其他线程等待；",[1212,20929,20930],{},"定时切换；",[1212,20932,20933],{},"遇到 I\u002FO 等待时换别的线程上来。",[1097,20935,20936],{},"人的感觉是“都开着”，但硬件每个时刻只能服务有限个线程。",[1231,20938],{},[1092,20940,20942],{"id":20941},"第-101-页线程是什么","第 101 页：线程是什么",[1097,20944,20945,6178],{},[1104,20946,20947],{},"线程 Thread",[1991,20949,20950],{},[1097,20951,20952],{},"执行某个任务的一段连续指令流。",[1097,20954,20955],{},"每个线程有：",[2284,20957,20958,20961,20964],{},[1212,20959,20960],{},"专用 PC；",[1212,20962,20963],{},"独立寄存器；",[1212,20965,20966],{},"可以访问共享内存。",[1097,20968,20969],{},"每个物理核心提供一个或多个 hardware threads。操作系统把 software threads 映射到可用的 hardware threads 上；没有映射到硬件线程的线程只能等待。",[1304,20971,20973],{"className":20972},[1307],[1304,20974,20976,21026],{"className":20975},[1311],[1304,20977,20979],{"className":20978},[1315],[1317,20980,20981],{"xmlns":1319,"display":1320},[1322,20982,20983,21023],{},[1325,20984,20985,20988,20990,20993,20995,20997,20999,21001,21003,21006,21008,21011,21013,21016,21018,21020],{},[3995,20986,20987],{},"线程",[1332,20989,1334],{},[3995,20991,20992],{},"当前执行位置",[1332,20994,3247],{"stretchy":3452},[1328,20996,2526],{},[1328,20998,1330],{},[1332,21000,3461],{"stretchy":3452},[1332,21002,3464],{},[3995,21004,21005],{},"当前变量现场",[1332,21007,3247],{"stretchy":3452},[3995,21009,21010],{},"寄存器",[1328,21012,3469],{"mathvariant":2802},[3995,21014,21015],{},"栈等",[1332,21017,3461],{"stretchy":3452},[1332,21019,3464],{},[3995,21021,21022],{},"对内存的访问能力",[1345,21024,21025],{"encoding":1347},"线程 = 当前执行位置(PC) + 当前变量现场(寄存器\u002F栈等) + 对内存的访问能力",[1304,21027,21029,21047,21077,21110],{"className":21028,"ariaHidden":1353},[1352],[1304,21030,21032,21035,21038,21041,21044],{"className":21031},[1357],[1304,21033],{"className":21034,"style":1362},[1361],[1304,21036,20987],{"className":21037},[1366,4044],[1304,21039],{"className":21040,"style":1373},[1372],[1304,21042,1334],{"className":21043},[1377],[1304,21045],{"className":21046,"style":1373},[1372],[1304,21048,21050,21053,21056,21059,21062,21065,21068,21071,21074],{"className":21049},[1357],[1304,21051],{"className":21052,"style":3714},[1361],[1304,21054,20992],{"className":21055},[1366,4044],[1304,21057,3247],{"className":21058},[2611],[1304,21060,2526],{"className":21061,"style":2573},[1366,1367],[1304,21063,1330],{"className":21064,"style":1368},[1366,1367],[1304,21066,3461],{"className":21067},[2749],[1304,21069],{"className":21070,"style":1394},[1372],[1304,21072,3464],{"className":21073},[1398],[1304,21075],{"className":21076,"style":1394},[1372],[1304,21078,21080,21083,21086,21089,21092,21095,21098,21101,21104,21107],{"className":21079},[1357],[1304,21081],{"className":21082,"style":3714},[1361],[1304,21084,21005],{"className":21085},[1366,4044],[1304,21087,3247],{"className":21088},[2611],[1304,21090,21010],{"className":21091},[1366,4044],[1304,21093,3469],{"className":21094},[1366],[1304,21096,21015],{"className":21097},[1366,4044],[1304,21099,3461],{"className":21100},[2749],[1304,21102],{"className":21103,"style":1394},[1372],[1304,21105,3464],{"className":21106},[1398],[1304,21108],{"className":21109,"style":1394},[1372],[1304,21111,21113,21116],{"className":21112},[1357],[1304,21114],{"className":21115,"style":1362},[1361],[1304,21117,21022],{"className":21118},[1366,4044],[1991,21120,21121,21124,21127],{},[1097,21122,21123],{},"为什么线程需要 PC？\n因为它要知道下一条指令在哪。",[1097,21125,21126],{},"为什么需要寄存器？\n因为它要保存当前计算状态。",[1097,21128,21129],{},"为什么共享内存？\n因为多个线程可能协同完成一个任务，需要交换数据。",[1097,21131,21132,21135],{},[1104,21133,21134],{},"问：线程包含哪些状态？",[1104,21136,21137],{},"PC、寄存器\u002F处理器状态，以及对共享内存的访问。",[1231,21139],{},[1092,21141,21143],{"id":21142},"第-102-页操作系统线程","第 102 页：操作系统线程",[1097,21145,21146],{},"这页讲 OS 如何制造“多个线程同时活动”的错觉。",[1097,21148,21149,21150,21153],{},"操作系统",[1101,21151,21152],{},"把 software threads 多路复用到 hardware threads 上","。切换时要做：",[1209,21155,21156,21159,21162,21165,21168],{},[1212,21157,21158],{},"中断当前线程；",[1212,21160,21161],{},"保存它的寄存器和 PC 到内存；",[1212,21163,21164],{},"选择另一个线程；",[1212,21166,21167],{},"恢复那个线程之前保存的寄存器；",[1212,21169,21170],{},"跳转到它的 PC 继续执行。",[1097,21172,21173],{},"课件提到两种常见切换方式：",[2284,21175,21176,21179],{},[1212,21177,21178],{},"线程阻塞，比如 cache miss、用户输入、网络访问；",[1212,21180,21181],{},"timer，比如每 1ms 切换一次活动线程。",[1991,21183,21184],{},[1097,21185,21186],{},"只要你能完整保存一个线程的状态，将来再恢复它，它就会“以为自己只是睡了一下”。",[1097,21188,21189],{},"这就是上下文切换 context switch。",[1097,21191,21192],{},"但是上下文切换有成本。寄存器越多，状态越大，切换越慢。\n现代 CPU 还有 SIMD\u002FAVX 寄存器，状态更大，所以线程切换不是免费的。",[1231,21194],{},[1092,21196,21198],{"id":21197},"第-103-页4-核示例重要度中等","第 103 页：4 核示例，重要度中等",[1097,21200,21201],{},"这页展示一个 4 核机器：操作系统维护一个 thread pool，然后把线程映射到 Core 1–4。",[1097,21203,21204],{},"核心句子：",[1991,21206,21207],{},[1097,21208,21209],{},"每个 core 每次主动运行一个指令流。",[1097,21211,21212,21213,21216],{},"这句话很关键。\n",[1101,21214,21215],{},"如果没有超线程，一个 core 在某个时刻通常只运行一个硬件线程","。\n如果有 100 个软件线程，它们要排队。",[1991,21218,21219],{},[1097,21220,21221,1107],{},[1101,21222,21223],{},"核心数量决定了真正同时推进的硬件线程上限；操作系统调度决定哪个软件线程得到运行机会",[1097,21225,21226],{},"这页要和后面超线程区别开：",[2284,21228,21229,21232,21235],{},[1212,21230,21231],{},"多核：真的有多个执行核心；",[1212,21233,21234],{},"操作系统线程：软件层面的任务；",[1212,21236,21237],{},"硬件线程：核心提供的硬件执行单位。",[1231,21239],{},[1092,21241,21243],{"id":21242},"第-104-页为什么需要硬件多线程","第 104 页：为什么需要硬件多线程",[1097,21245,21246],{},"这页很关键。",[1097,21248,21249],{},"典型场景：",[2284,21251,21252,21255,21258],{},[1212,21253,21254],{},"活动线程遇到 cache miss；",[1212,21256,21257],{},"需要等待大约 1000 个周期从 DRAM 读取数据；",[1212,21259,21260],{},"那么可以切换运行别的线程，直到数据回来。",[1097,21262,21263],{},"第一性原理：",[1991,21265,21266],{},[1097,21267,21268],{},"CPU 不怕算，怕等。\n多线程的一个核心价值是：当一个线程在等内存时，让另一个线程占用执行资源。",[1097,21270,21271,13179,21274,21279],{},[1101,21272,21273],{},"这叫",[1101,21275,21276],{},[1104,21277,21278],{},"latency hiding，隐藏延迟",[1101,21280,1107],{},[1097,21282,21283],{},"但问题是：\n如果靠操作系统保存\u002F恢复 PC 和所有寄存器，切换太慢。\n课件说必须在远小于 1000 个周期内完成切换，否则还不如等。",[1097,21285,21286],{},"所以硬件能帮忙：在核心内部保留多个线程的 PC 和寄存器状态，切换时不用把大量状态搬进搬出内存。",[1097,21288,21289],{},"这就是硬件多线程的动机。",[1231,21291],{},[1092,21293,21295],{"id":21294},"第-105-页cdc-6600-外围处理器了解即可","第 105 页：CDC 6600 外围处理器，了解即可",[1097,21297,21298],{},"这是历史例子。",[1097,21300,21301],{},"CDC 6600 的外围处理器是早期多线程硬件：",[2284,21303,21304,21307,21310,21313,21316],{},[1212,21305,21306],{},"10 个虚拟 I\u002FO 处理器；",[1212,21308,21309],{},"fixed interleave，固定交织；",[1212,21311,21312],{},"简单流水线；",[1212,21314,21315],{},"每个虚拟处理器每 1000ns 执行一条指令；",[1212,21317,21318],{},"使用累加器指令集，减少处理器状态。",[1991,21320,21321],{},[1097,21322,21323],{},"硬件多线程最早的动机之一不是为了提高单线程速度，而是为了在长延迟 I\u002FO 或内存等待中保持硬件忙碌。",[1231,21325],{},[1092,21327,21329],{"id":21328},"第-106-页简单多线程流水线重要","第 106 页：简单多线程流水线，重要",[1097,21331,21332],{},"这页画了简单多线程流水线。",[1097,21334,21335],{},[1246,21336],{"alt":1246,"src":21337},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-33.png",[1097,21339,21340,21341,21344],{},"关键机制是：流水线里要携带 ",[1104,21342,21343],{},"thread select","，也就是“这条正在流水线中的指令属于哪个线程”。",[1097,21346,21347],{},"为什么要携带 thread select？",[1097,21349,21350],{},"因为同一条流水线里可能交错着多个线程的指令。\n执行到寄存器读写阶段时，必须知道：",[2284,21352,21353,21356,21359],{},[1212,21354,21355],{},"读哪个线程的寄存器；",[1212,21357,21358],{},"写哪个线程的寄存器；",[1212,21360,21361],{},"更新哪个线程的 PC。",[1097,21363,21364,21365,21368],{},"课件说，",[1101,21366,21367],{},"对软件和操作系统看起来，它像多个 CPU核心，","虽然每个都更慢。",[1991,21370,21371],{},[1097,21372,21373],{},"如果多个线程共享同一条数据通路，那么必须给每条指令贴上“线程身份标签”。",[1097,21375,21376],{},"否则就会出现 Thread A 的指令错误地写 Thread B 的寄存器，直接爆炸。",[18284,21378,21379,21384,21387,21395],{"type":18286},[1097,21380,21381],{},[1101,21382,21383],{},"多核心和硬件多线程的区别",[1097,21385,21386],{},"执行一个线程至少需要两类东西：",[1209,21388,21389,21392],{},[1212,21390,21391],{},"线程状态：PC、寄存器、控制状态",[1212,21393,21394],{},"执行资源：取指、译码、发射、ALU、FPU、load\u002Fstore、cache 带宽等",[1097,21396,21397,21400,21401,21404],{},[1104,21398,21399],{},"多核心","的做法是：把执行资源也复制多份。\n",[1104,21402,21403],{},"硬件多线程","的做法是：主要复制线程状态，但共享大部分执行资源。",[18284,21406,21407,21410,21413],{"type":18286},[1097,21408,21409],{},"SMT \u002F Hyperthreading 是硬件多线程的一种",[1097,21411,21412],{},"硬件多线程有几种风格：",[1209,21414,21415,21418,21421],{},[1212,21416,21417],{},"粗粒度多线程：\n一个线程卡住了，比如 cache miss，再切另一个线程",[1212,21419,21420],{},"细粒度多线程：\n每个 cycle 或几个 cycle 轮换不同线程",[1212,21422,21423],{},"SMT \u002F Hyperthreading：\n同一个 cycle 内，从多个线程同时发射指令",[1231,21425],{},[1092,21427,21429],{"id":21428},"第-107-页硬件多线程成本重要","第 107 页：硬件多线程成本，重要",[1097,21431,21432],{},"硬件多线程不是白嫖。",[1097,21434,21435],{},"每个线程需要自己的用户状态：",[2284,21437,21438,21441],{},[1212,21439,21440],{},"PC；",[1212,21442,21443],{},"GPRs，通用寄存器。",[1097,21445,21446],{},"还需要系统状态：",[2284,21448,21449,21452],{},[1212,21450,21451],{},"虚拟内存页表寄存器；",[1212,21453,21454],{},"异常处理记录。",[1097,21456,21457],{},"其他开销：",[2284,21459,21460,21463,21466],{},[1212,21461,21462],{},"线程之间竞争 cache；竞争 TLB；",[1212,21464,21465],{},"需要更大 cache\u002FTLB；",[1212,21467,21468],{},"OS 调度更多线程也有开销。",[1991,21470,21471],{},[1097,21472,21473],{},"多线程增加吞吐量的前提是“资源空着不用很浪费”。\n但如果资源本来就紧张，多线程会互相抢资源。",[1097,21475,21476],{},"所以超线程可能提升性能，也可能降低某个线程的性能。",[1231,21478],{},[1092,21480,21482],{"id":21481},"第-108-页线程调度策略重要","第 108 页：线程调度策略，重要",[1097,21484,21485],{},"这页比较三种硬件线程调度策略。",[978,21487,21489],{"id":21488},"_1-fixed-interleave-固定交织","1. Fixed interleave 固定交织",[1097,21491,21492],{},"N 个线程轮流执行。\n例如有 4 个线程：",[2259,21494,21497],{"className":21495,"code":21496,"language":18502},[18500],"周期1：Thread 0\n周期2：Thread 1\n周期3：Thread 2\n周期4：Thread 3\n周期5：Thread 0\n",[1071,21498,21496],{"__ignoreMap":2265},[1097,21500,21501],{},"如果某个线程轮到它时没准备好，就插入气泡。",[1097,21503,21504],{},"优点：简单。\n缺点：不灵活，线程没准备好也浪费槽位。",[978,21506,21508],{"id":21507},"_2-software-controlled-interleave","2. Software-controlled interleave",[1097,21510,21511],{},"操作系统给 N 个线程分配 S 个流水线槽，硬件在这些槽上固定交织，执行插槽中的一个线程",[1097,21513,21514],{},[1246,21515],{"alt":1246,"src":21516},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-34.png",[1097,21518,21519],{},"优点：比完全固定灵活一点。\n缺点：仍然依赖软件安排。",[978,21521,21523],{"id":21522},"_3-hardware-controlled-thread-scheduling","3. Hardware-controlled thread scheduling",[1097,21525,21526],{},"硬件跟踪哪些线程 ready，然后按优先级选择下一个线程。",[1097,21528,21529],{},"优点：更动态、更有效。\n缺点：硬件复杂。",[1231,21531],{},[1092,21533,21535],{"id":21534},"第-109-页denelcor-hep了解即可","第 109 页：Denelcor HEP，了解即可",[1097,21537,21538],{},"HEP 是第一台在主 CPU 中使用 hardware thread 的商用机器：",[2284,21540,21541,21544,21547,21550],{},[1212,21542,21543],{},"每个处理器 120 个线程；",[1212,21545,21546],{},"10 MHz；",[1212,21548,21549],{},"最多 8 个处理器；",[1212,21551,21552],{},"是 Tera MTA 多线程架构的前身。",[1231,21554],{},[1092,21556,21558],{"id":21557},"第-110-页smt同步多线程","第 110 页：SMT，同步多线程",[1097,21560,21561,21562,21565],{},"这页开始讲 ",[1104,21563,21564],{},"SMT = Simultaneous Multithreading，同步多线程","，也就是常说的超线程 Hyperthreading 的核心思想。",[1097,21567,21568,21569,6178],{},"前面介绍的是 ",[1104,21570,21571],{},"vertical multithreading，垂直多线程",[1991,21573,21574],{},[1097,21575,21576],{},"每个流水线阶段一次只处理一个线程，只是在不同周期切换线程。",[1097,21578,21579],{},"而 SMT 更激进：",[1991,21581,21582],{},[1097,21583,21584],{},"在同一个时钟周期内，允许多个线程的指令同时进入超标量处理器的多个执行槽位。",[1097,21586,21587],{},"课件说 SMT 利用 OoO 超标量已有的细粒度控制，让多个线程的指令在同一周期进入执行，从而更好利用机器资源。",[1991,21589,21590],{},[1097,21591,21592],{},"超标量 CPU 一周期可能有多个 issue slots，但单个线程经常填不满。SMT 用另一个线程的指令来填空位。",[1097,21594,21595,21596,1107],{},"这就是 SMT 的本质：",[1104,21597,21598],{},"填空位",[1231,21600],{},[1092,21602,21604],{"id":21603},"第-111-页超标量机器的浪费重要","第 111 页：超标量机器的浪费，重要",[1097,21606,21607],{},"这页图里有两个浪费：",[1097,21609,21610],{},[1246,21611],{"alt":1246,"src":21612},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-35.png",[1209,21614,21615,21621],{},[1212,21616,21617,21620],{},[1104,21618,21619],{},"Vertical waste 垂直浪费","\n某些周期完全空闲，什么指令都没发射。（整一行都是空的）",[1212,21622,21623,21626],{},[1104,21624,21625],{},"Horizontal waste 水平浪费","\n某周期有一些指令发射，但 issue width 没填满。\n比如 4 发射机器只发射了 1 条或 2 条。（某一行没有填满）",[1991,21628,21629],{},[1097,21630,21631],{},"超标量机器的硬件宽度是固定成本。空槽越多，硬件利用率越差。",[1097,21633,21634],{},"如果单线程因为 cache miss、分支、依赖，无法提供足够指令，硬件就闲着。",[1231,21636],{},[1092,21638,21640],{"id":21639},"第-112-页垂直多线程","第 112 页：垂直多线程",[1097,21642,21643],{},"垂直多线程通过 cycle-by-cycle interleaving 消除一部分垂直浪费。",[1991,21645,21646],{},[1097,21647,21648],{},"本质就是每个 cycle 换一个 thread 来发射指令。",[1097,21650,21651],{},"例如：",[2259,21653,21656],{"className":21654,"code":21655,"language":18502},[18500],"周期1：Thread A\n周期2：Thread B\n周期3：Thread A\n周期4：Thread B\n",[1071,21657,21655],{"__ignoreMap":2265},[1097,21659,21660],{},"这样如果 A 在某些周期会卡住，B 可以顶上。",[1097,21662,21663],{},[1246,21664],{"alt":1246,"src":21665},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-36.png",[1097,21667,21668,21669,1107],{},"但问题是：\n每个周期仍然主要来自一个线程，所以如果是 4 发射机器，Thread B 也可能只填 2 个槽。\n于是",[1104,21670,21671],{},"水平浪费仍然存在",[1097,21673,21674],{},"所以 vertical multithreading 解决的是“某些周期完全闲着”的问题，但不一定能解决“每周期槽位填不满”的问题。",[1231,21676],{},[1092,21678,21680],{"id":21679},"第-113-页chip-multiprocessingcmp其实就是多核心","第 113 页：Chip Multiprocessing，CMP（其实就是多核心）",[1097,21682,21683],{},"CMP 就是把芯片拆成多个处理器核心。",[1991,21685,21686],{},[1097,21687,21688],{},"需要增加更多的硬件组件，多一份的执行组件",[1097,21690,21691],{},[1246,21692],{"alt":1246,"src":21693},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-37.png",[1097,21695,21696],{},"效果：",[2284,21698,21699,21702,21705],{},[1212,21700,21701],{},"减少水平浪费；",[1212,21703,21704],{},"留下一些垂直浪费；",[1212,21706,21707],{},"限制每个线程的峰值吞吐量。",[1097,21709,21710],{},"因为如果一个大超标量核心有 4 个 issue slots，一个线程可能填不满。\n拆成两个较小核心后，每个核心服务不同线程，单个线程独享一部分资源，资源浪费可能减少。",[1097,21712,19537],{},[2284,21714,21715,21718,21721],{},[1212,21716,21717],{},"单线程峰值性能下降；",[1212,21719,21720],{},"core 之间共享数据要通信；",[1212,21722,21723],{},"cache coherence 更复杂。",[1231,21725],{},[1092,21727,21729],{"id":21728},"第-114-页理想超标量多线程重要","第 114 页：理想超标量多线程，重要",[1097,21731,21732],{},[1246,21733],{"alt":1246,"src":21734},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-38.png",[1097,21736,21737],{},"理想 SMT 是：",[1991,21739,21740],{},[1097,21741,21742],{},"无约束地把多个线程的指令交叉放进多个 issue slots。",[1097,21744,21745],{},"也就是说，在同一周期内：",[2259,21747,21750],{"className":21748,"code":21749,"language":18502},[18500],"slot 0: Thread A 的指令\nslot 1: Thread B 的指令\nslot 2: Thread A 的指令\nslot 3: Thread C 的指令\n",[1071,21751,21749],{"__ignoreMap":2265},[1097,21753,21754],{},"只要依赖和资源允许，就尽量填满。",[1991,21756,21757],{},[1097,21758,21759],{},"如果一个线程不能提供足够独立指令，多个线程合起来可能可以。",[1097,21761,21762],{},"这就是 SMT 的理论诱惑：\n不复制完整核心，只复制一些线程状态，就提高执行资源利用率。",[1231,21764],{},[1092,21766,21768],{"id":21767},"第-115-页hyperthreading必须掌握","第 115 页：Hyperthreading，必须掌握",[1097,21770,21771],{},"这页是考试重点。",[1097,21773,21774],{},[1104,21775,21776],{},"Hyperthreading = SMT 的一种商业实现。",[1097,21778,21779],{},[1246,21780],{"alt":1246,"src":21781},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-39.png",[1097,21783,21784],{},"特点：",[2284,21786,21787,21790,21793,21799,21805,21808],{},[1212,21788,21789],{},"逻辑 CPU 数量大于物理 CPU 数量；",[1212,21791,21792],{},"每个 core 同时运行多个 threads；",[1212,21794,21795,21796,3279],{},"每个 thread 有自己的体系结构状态",[1101,21797,21798],{},"，比如 PC、寄存器",[1212,21800,21801,21802,3279],{},"共享 ",[1101,21803,21804],{},"cache、instruction unit、execution units（执行单元）",[1212,21806,21807],{},"可能提高 core 的总体利用率；",[1212,21809,21810],{},"但也可能降低单个线程性能。",[1097,21812,21813],{},"这里课件写“提高核心 CPI，可能降低线程 CPI”，这句话容易让人困惑。直观理解是：",[2284,21815,21816,21819],{},[1212,21817,21818],{},"从整个 core 看，资源利用率更高，总吞吐更好；",[1212,21820,21821],{},"从单个 thread 看，它要和别人抢 cache、带宽、执行单元，所以可能变慢。",[1991,21823,21824],{},[1097,21825,21826],{},"超线程通常提高核心总吞吐，但不保证单线程性能提高；两个逻辑 CPU 共享同一个物理核心的大部分执行资源，因此性能不会等于两个完整核心。",[1097,21828,21829,21830],{},"这个非常重要。\n",[1104,21831,21832],{},"2 个 logical CPU ≠ 2 个 physical core。",[1231,21834],{},[1092,21836,21838],{"id":21837},"第-116-页多线程类别总结重要","第 116 页：多线程类别总结，重要",[1097,21840,21841],{},"这页图总结了几类多线程方式：",[1097,21843,21844],{},[1246,21845],{"alt":1246,"src":21846},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-40.png",[982,21848,21849,21858],{},[985,21850,21851],{},[988,21852,21853,21856],{},[991,21854,21855],{},"类别",[991,21857,20289],{},[1001,21859,21860,21867,21875,21883,21891],{},[988,21861,21862,21864],{},[1006,21863,18335],{},[1006,21865,21866],{},"单线程尽量填多个 issue slots",[988,21868,21869,21872],{},[1006,21870,21871],{},"Coarse-grained MT",[1006,21873,21874],{},"遇到大延迟事件才切换线程",[988,21876,21877,21880],{},[1006,21878,21879],{},"Fine-grained MT",[1006,21881,21882],{},"每个周期在线程之间切换",[988,21884,21885,21888],{},[1006,21886,21887],{},"Multiprocessing",[1006,21889,21890],{},"多个核心分别执行线程",[988,21892,21893,21896],{},[1006,21894,21895],{},"SMT",[1006,21897,21898],{},"同一周期内多个线程共享 issue slots",[18284,21900,21901,21904],{"type":18286},[1097,21902,21903],{},"要清楚：superscalar是ILP范畴的内容。",[1209,21905,21906,21923],{},[1212,21907,21908,21909,1107,21912],{},"普通超标量处理器：一个 core 里有多个执行资源（一个较宽的取址前端加上多个ALU……）；同一个周期同时执行\u002F发射的多条指令，通常来自",[1101,21910,21911],{},"同一个线程的同一条指令流",[2284,21913,21914,21917,21920],{},[1212,21915,21916],{},"一份 PC \u002F 一份线程上下文",[1212,21918,21919],{},"多条指令同时发射",[1212,21921,21922],{},"多个执行单元并行工作",[1212,21924,21925],{},"超标量本身只表示一个 core 每周期可发射多条指令；这些指令在普通超标量中来自同一个线程。若再加 SMT，则可以来自多个线程。",[18284,21927,21928,21931],{"type":18286},[1097,21929,21930],{},"SMT可以理解为硬件多线程和超标量处理器的结合，（其二者需要的底层硬件结构有所不同）",[1097,21932,21933],{},"多核多线程",[1097,21935,21936],{},"这页图的重点是看“空槽”怎么被减少。",[2284,21938,21939,21942,21945,21948,21951],{},[1212,21940,21941],{},"Superscalar：单线程填不满，容易有空槽；",[1212,21943,21944],{},"Fine-grained：减少完全空闲周期，但仍可能填不满横向槽；",[1212,21946,21947],{},"Coarse-grained：大事件才切换，简单但反应慢；",[1212,21949,21950],{},"Multiprocessing：不同核心跑不同线程；",[1212,21952,21953],{},"SMT：多个线程一起填一个宽发射核心的槽位。",[1097,21955,21956],{},"考试如果问“SMT 与 fine-grained multithreading 的区别”，可以答：",[1991,21958,21959],{},[1097,21960,21961],{},"Fine-grained multithreading 通常每个周期只从一个线程取指\u002F发射，只是周期级交织；SMT 可以在同一个周期内从多个线程发射指令到多个 issue slots。",[1231,21963],{},[1092,21965,21967],{"id":21966},"第-117-页smt-初始性能重要","第 117 页：SMT 初始性能，重要",[1097,21969,21970],{},"这页给出实际数据，结论很克制：SMT 不一定暴涨。",[1097,21972,21651],{},[2284,21974,21975,21978,21981,21984,21987],{},[1212,21976,21977],{},"Pentium 4 Extreme SMT 对 SPECint_rate 加速 1.01；",[1212,21979,21980],{},"对 SPECfp_rate 加速 1.07；",[1212,21982,21983],{},"26 个 SPEC 基准中速度变化从 0.90 到 1.58，平均 1.20；",[1212,21985,21986],{},"Power 5 上也有一定提升，但不同应用差异明显；",[1212,21988,21989],{},"浮点应用 cache 冲突最多，收益较小。",[1991,21991,21992],{},[1097,21993,21994],{},"SMT 的收益取决于“共享资源有没有空闲”和“两个线程会不会抢同一种瓶颈资源”。",[1097,21996,21997],{},"如果两个线程瓶颈互补，一个等内存，一个用 ALU，就可能提升明显。\n如果两个线程都抢 cache 或内存带宽，就可能互相伤害。",[1231,21999],{},[1092,22001,22003],{"id":22002},"第-118120-页smt-性能中的应用交互重要","第 118–120 页：SMT 性能中的应用交互，重要",[1097,22005,22006,22007],{},"这三页都在讲同一件事：",[1104,22008,22009],{},"SMT 的性能强烈依赖应用组合。",[978,22011,22013],{"id":22012},"第-118-页有些程序不受另一个程序影响","第 118 页：有些程序不受另一个程序影响",[1097,22015,22016],{},"图上标出某些应用“没有受到另外程序的影响”。\n这说明它们对共享资源不敏感，或者另一个程序没有抢到它的关键资源。",[978,22018,22020],{"id":22019},"第-119-页有些组合表现不好","第 119 页：有些组合表现不好",[1097,22022,22023],{},"图里标出“表现不好”。\n说明有些程序放在一起会互相拖累。",[1097,22025,13161],{},[2284,22027,22028,22031,22034,22037],{},[1212,22029,22030],{},"都大量访问 cache；",[1212,22032,22033],{},"都占用内存带宽；",[1212,22035,22036],{},"都使用同类执行单元；",[1212,22038,22039],{},"工作集互相把对方挤出 cache。",[978,22041,22043],{"id":22042},"第-120-页有些程序对第二个程序非常敏感","第 120 页：有些程序对第二个程序非常敏感",[1097,22045,22046],{},"图里标出“对第二个程序非常敏感”。\n意思是某个程序单独跑还可以，但和不同程序配对时性能变化很大。",[1097,22048,21263],{},[1991,22050,22051],{},[1097,22052,22053],{},"SMT 共享的是物理资源，所以两个线程之间不是彼此透明的。它们会通过 cache、TLB、带宽、执行单元发生干扰。",[1097,22055,22056],{},"考试可以这样答：",[1991,22058,22059],{},[1097,22060,22061],{},"SMT 性能取决于线程间资源需求是否互补；若线程争用相同瓶颈资源，可能导致 slowdown；若一个线程等待内存而另一个线程可使用执行单元，则吞吐可能提升。",[1231,22063],{},[1092,22065,22067],{"id":22066},"第-121-页硬件辅助的软件多线程重要","第 121 页：硬件辅助的软件多线程，重要",[1097,22069,22070],{},"这页画了一个 1 core、2 threads 的处理器。",[1097,22072,22073],{},[1246,22074],{"alt":1246,"src":22075},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-41.png",[1097,22077,22078],{},"硬件内部有两个副本的：",[2284,22080,22081,22083],{},[1212,22082,21440],{},[1212,22084,22085],{},"寄存器。",[1097,22087,22088],{},"但共享：",[2284,22090,22091,22094,22097,22099],{},[1212,22092,22093],{},"控制器\u002F数据通路；",[1212,22095,22096],{},"ALU；",[1212,22098,13166],{},[1212,22100,22101],{},"内存接口。",[1097,22103,22104],{},"对软件来说，它像两个处理器：hardware thread 0 和 hardware thread 1。\n超线程中两个线程可以同时 active。",[1991,22106,22107],{},[1097,22108,22109],{},"超线程复制的是“状态”，不是完整“算力”。",[1097,22111,22112],{},"如果复制完整核心，那是 multicore。\n如果只复制 PC\u002F寄存器等线程状态，共享执行资源，那是 SMT\u002FHyperthreading。",[1231,22114],{},[1092,22116,22118],{"id":22117},"第-122-页逻辑线程-vs-多核最重要之一","第 122 页：逻辑线程 vs 多核，最重要之一",[1097,22120,22121],{},"这一页直接对比：",[978,22123,22125],{"id":22124},"逻辑线程-logical-threads","逻辑线程 Logical threads",[1097,22127,22128],{},"硬件增加约 1%，性能提升约 10%。\n原因：",[2284,22130,22131,22133],{},[1212,22132,20963],{},[1212,22134,22135],{},"共享数据通路、ALU、cache。",[978,22137,22139],{"id":22138},"多核-multicore","多核 Multicore",[1097,22141,22142],{},"重复处理器（基本是整条流水线）",[1097,22144,22145],{},"硬件增加更多，比如 50%，性能可能接近 2 倍，但不保证。",[978,22147,22149],{"id":22148},"现代机器两者兼备","现代机器两者兼备：",[1097,22151,22152],{},[1104,22153,22154],{},"多核，每个核有多个线程。",[1097,22156,21263],{},[982,22158,22159,22175],{},[985,22160,22161],{},[988,22162,22163,22166,22169,22172],{},[991,22164,22165],{},"技术",[991,22167,22168],{},"复制了什么",[991,22170,22171],{},"共享了什么",[991,22173,22174],{},"性能特点",[1001,22176,22177,22191],{},[988,22178,22179,22182,22185,22188],{},[1006,22180,22181],{},"逻辑线程 \u002F SMT",[1006,22183,22184],{},"PC、寄存器、线程状态",[1006,22186,22187],{},"ALU、cache、取指译码、数据通路",[1006,22189,22190],{},"便宜，提高吞吐有限",[988,22192,22193,22195,22198,22201],{},[1006,22194,20625],{},[1006,22196,22197],{},"几乎整个执行核心",[1006,22199,22200],{},"通常共享 L3\u002FDRAM\u002FI\u002FO",[1006,22202,22203],{},"更贵，但并行能力更强",[1097,22205,22206,22207,22210,22211,22214],{},"所以看到 ",[1071,22208,22209],{"code":22209},"physicalcpu = 4","、",[1071,22212,22213],{"code":22213},"logicalcpu = 8","，不要以为有 8 个完整核心。\n它通常是 4 个物理核，每个核 2 个硬件线程。",[1231,22216],{},[1092,22218,22220],{"id":22219},"第-123-页mac-air-例子重要度中等","第 123 页：Mac Air 例子，重要度中等",[1097,22222,22223],{},"这页用命令：",[2259,22225,22230],{"className":22226,"code":22228,"language":22229,"meta":2265},[22227],"language-bash","sysctl -a | grep hw\n","bash",[1071,22231,22228],{"__ignoreMap":2265},[1097,22233,22234],{},"看到机器信息：",[2284,22236,22237,22240,22243,22246,22249,22252,22255],{},[1212,22238,22239],{},"physicalcpu: 2；",[1212,22241,22242],{},"logicalcpu: 4；",[1212,22244,22245],{},"L1 I-cache: 32KB；",[1212,22247,22248],{},"L1 D-cache: 32KB；",[1212,22250,22251],{},"L2: 256KB；",[1212,22253,22254],{},"L3: 4MB；",[1212,22256,22257],{},"cache line size: 64B。",[1991,22259,22260],{},[1097,22261,22262],{},"操作系统看到的是 logical CPU，用来调度线程；但真实性能上限还要看 physical CPU 和共享资源。",[1097,22264,22265],{},"2 个 physical CPU \u002F core，4 个 logical CPU，通常意味着每个物理核有 2 个硬件线程。",[1097,22267,22268],{},"性能实验时可以试 1、2、4 个线程，但不要预期 4 个线程一定是 1 个线程的 4 倍。",[1231,22270],{},[1092,22272,22274],{"id":22273},"第-124-页hive-计算机例子","第 124 页：Hive 计算机例子",[1097,22276,22277],{},"这页机器是：",[2284,22279,22280,22283,22286,22288,22290,22292],{},[1212,22281,22282],{},"physicalcpu: 4；",[1212,22284,22285],{},"logicalcpu: 8；",[1212,22287,22245],{},[1212,22289,22248],{},[1212,22291,22251],{},[1212,22293,22294],{},"L3: 8MB。",[1097,22296,22297],{},"课件说：应该尝试最多 8 个线程，看看即使只有 4 个内核，性能是否有所提高。",[1097,22299,22300],{},"这句话很务实。",[1097,22302,22303],{},"实验策略：",[2284,22305,22306,22309,22312,22315],{},[1212,22307,22308],{},"先跑 1 个线程；",[1212,22310,22311],{},"再跑 2、4 个线程；",[1212,22313,22314],{},"再跑 8 个线程；",[1212,22316,22317],{},"看性能曲线。",[1097,22319,22320],{},"如果 4 到 8 还有提升，说明 SMT 有帮助。\n如果 4 到 8 不升反降，说明超线程带来的资源争用超过了收益。",[1231,22322],{},[1092,22324,22326],{"id":22325},"第-125-页6-core24-logical-threads","第 125 页：6 Core，24 Logical Threads",[1097,22328,22329],{},"这页展示 6 个 core，每个 core 有 4 个逻辑线程，所以总共有 24 logical threads。操作系统把软件线程映射到这些核心和硬件线程上。",[1097,22331,21263],{},[1991,22333,22334],{},[1097,22335,22336],{},"logical thread 是调度入口，不等于完整核心。",[1097,22338,22339],{},"如果每个 core 有 4 个 hardware threads，那么这 4 个线程共享同一个 core 的执行资源。\n适合的场景是：很多线程经常等待内存或 I\u002FO，可以互相填补空档。",[18284,22341,22342,22345],{"type":18286},[1097,22343,22344],{},"physical CPU 指的是有多少个核心",[1097,22346,22347],{},"logical CPU 是看有多少线程（核心*每个核心线程）",[1991,22349,22350],{},[1097,22351,22352],{},"TLP 是多个线程或任务的并行执行，对应 MIMD。",[1991,22354,22355],{},[1097,22356,22357],{},"线程的核心状态包括 PC、寄存器和对共享内存的访问。",[1991,22359,22360],{},[1097,22361,22362],{},"操作系统通过上下文切换，把多个软件线程多路复用到有限硬件线程上。",[1991,22364,22365],{},[1097,22366,22367],{},"硬件多线程通过快速切换或同时执行多个线程来隐藏长延迟。",[1991,22369,22370],{},[1097,22371,22372],{},"SMT\u002F超线程复制的是线程状态，不是完整核心；它共享 cache、执行单元和数据通路。",[1991,22374,22375],{},[1097,22376,22377],{},"逻辑 CPU 数量大于物理 CPU 数量时，通常说明存在超线程，但性能不会按逻辑 CPU 数量线性增长。",[1231,22379],{},[1087,22381,22383],{"id":22382},"第-5-模块并行编程语言-openmp如何用软件利用这些并行性","第 5 模块：并行编程语言 \u002F OpenMP（如何用软件利用这些并行性）",[1991,22385,22386],{},[1097,22387,22388,22389,22392,22393],{},"硬件给了我们多个核心、多个线程、SIMD 单元，但 C 程序默认是",[1104,22390,22391],{},"顺序语义","。\n所以并行编程语言\u002F框架要解决一个根本问题：",[1104,22394,22395],{},"程序员怎样告诉机器“哪些工作可以同时做、哪些数据是共享的、哪些结果最后要合并”？",[1097,22397,22398,22399,22402],{},"这块的考试重点非常明确：",[1104,22400,22401],{},"OpenMP、parallel for、fork-join、shared\u002Fprivate、barrier、reduction、race condition","。尤其第 135、136、145–149 页，很像会考简答或代码判断。",[1231,22404],{},[1092,22406,22408],{"id":22407},"第-127-页为什么需要并行回顾但重要","第 127 页：为什么需要并行，回顾但重要",[1097,22410,22411],{},"这页回顾前面的动机：性能提升的唯一现实路径是并行。原因包括：",[1209,22413,22414,22419,22425,22431],{},[1212,22415,22416,3279],{},[1104,22417,22418],{},"时钟频率持平或下降",[1212,22420,22421,22424],{},[1104,22422,22423],{},"SIMD 位宽变宽","，比如 AVX-512；",[1212,22426,22427,22430],{},[1104,22428,22429],{},"MIMD 核心数增加","，例如 10 个物理 CPU、20 个逻辑 CPU；",[1212,22432,22433],{},"关键挑战变成：处理器数量增加后，如何写出高性能并行程序。",[1097,22435,22436],{},"这页列出的四个挑战要记：",[982,22438,22439,22449],{},[985,22440,22441],{},[988,22442,22443,22446],{},[991,22444,22445],{},"挑战",[991,22447,22448],{},"第一性原理解释",[1001,22450,22451,22459,22467,22475],{},[988,22452,22453,22456],{},[1006,22454,22455],{},"Scheduling 调度",[1006,22457,22458],{},"哪些任务分给哪些线程\u002F核心",[988,22460,22461,22464],{},[1006,22462,22463],{},"Load balancing 负载平衡",[1006,22465,22466],{},"每个线程工作量尽量差不多",[988,22468,22469,22472],{},[1006,22470,22471],{},"Synchronization time 同步时间",[1006,22473,22474],{},"线程等待彼此会浪费时间",[988,22476,22477,22480],{},[1006,22478,22479],{},"Communication overhead 通信开销",[1006,22481,22482],{},"线程交换数据也要成本",[1231,22484],{},[1092,22486,22488],{"id":22487},"第-128-129-页并行语言很多略讲","第 128-129 页：并行语言很多，略讲",[1097,22490,22491],{},"这一页列了一大堆并行语言\u002F框架：CUDA、Cilk、Go、Erlang、Scala、OpenMP 相关模型等。\n这一页不用背名字。",[1097,22493,22494],{},"它想说明一件事：",[1097,22496,22497],{},"为什么没有万能语言？\n因为“并行”的形态差异巨大。",[1097,22499,22500],{},"矩阵乘法的并行是：大量规则数据，适合 SIMD、OpenMP、CUDA。\nWeb 服务器的并行是：很多独立请求，适合线程池\u002F事件驱动。\nI\u002FO 的并行是：很多任务在等待磁盘、网络、用户输入。\n这些问题的瓶颈完全不同，所以语言设计也不同。",[1097,22502,22503],{},"这页还提到 SIMD 特性不断加入编译器，而且把 C 翻译成好的汇编用了 20 多年。意思是：编译器很强，但它不可能总是自动猜出最优并行结构。程序员仍然需要提供并行提示。",[1231,22505],{},[1092,22507,22509],{"id":22508},"第-130-页parallel-loops并行循环最重要的直觉","第 130 页：Parallel Loops，并行循环，最重要的直觉",[1097,22511,22512],{},"这一页是 OpenMP 的起点。",[1097,22514,22515],{},"串行循环：",[2259,22517,22520],{"className":22518,"code":22519,"language":2768,"meta":2265},[2766],"for (int i = 0; i \u003C 100; i++) {\n    ...\n}\n",[1071,22521,22519],{"__ignoreMap":2265},[1097,22523,22524],{},"默认语义是：",[2259,22526,22529],{"className":22527,"code":22528,"language":18502},[18500],"i=0 做完，再做 i=1，再做 i=2 ...\n",[1071,22530,22528],{"__ignoreMap":2265},[1097,22532,22533],{},"并行循环的想法是把迭代空间切成块：",[2259,22535,22538],{"className":22536,"code":22537,"language":18502},[18500],"线程0：i = 0 到 24\n线程1：i = 25 到 49\n线程2：i = 50 到 74\n线程3：i = 75 到 99\n",[1071,22539,22537],{"__ignoreMap":2265},[1097,22541,22542],{},"从第一性原理看，一个循环能不能并行，取决于：",[1991,22544,22545],{},[1097,22546,22547],{},"第 i 次迭代是否依赖第 i-1 次迭代的结果。",[1097,22549,22550],{},"例如这个可以并行：",[2259,22552,22555],{"className":22553,"code":22554,"language":2768,"meta":2265},[2766],"for (int i = 0; i \u003C N; i++)\n    b[i] = a[i] * 2;\n",[1071,22556,22554],{"__ignoreMap":2265},[1097,22558,22559,22560,22563],{},"因为每个 ",[1071,22561,22562],{"code":22562},"b[i]"," 独立。",[1097,22565,22566],{},"这个不容易直接并行：",[2259,22568,22571],{"className":22569,"code":22570,"language":2768,"meta":2265},[2766],"for (int i = 1; i \u003C N; i++)\n    a[i] = a[i-1] + 1;\n",[1071,22572,22570],{"__ignoreMap":2265},[1097,22574,22575,22576],{},"因为第 i 次依赖第 i-1 次。\n所以并行循环的第一原则是：",[1104,22577,22578],{},"迭代之间最好相互独立。",[1231,22580],{},[1092,22582,22584],{"id":22583},"第-131-页openmp-组件for-循环重要","第 131 页：OpenMP 组件：for 循环，重要",[1097,22586,22587],{},"这一页具体讲 OpenMP 如何处理 for 循环。",[1097,22589,18487],{},[2259,22591,22594],{"className":22592,"code":22593,"language":2768,"meta":2265},[2766],"for (i = 0; i \u003C max; i++)\n    zero[i] = 0;\n",[1071,22595,22593],{"__ignoreMap":2265},[1097,22597,22598],{},"OpenMP 的想法是：",[1991,22600,22601],{},[1097,22602,22603],{},"把循环迭代拆成块，把每个块分给一个线程。",[1097,22605,13223,22606,22609],{},[1071,22607,22608],{"code":22608},"max = 100","，2 个线程：",[2284,22611,22612,22615],{},[1212,22613,22614],{},"线程 0：处理 0–49；",[1212,22616,22617],{},"线程 1：处理 50–99。",[1097,22619,22620],{},"这页还说 OpenMP 编译器必须能理解这个循环，并且运行时系统要能决定给每个线程多少迭代。",[1097,22622,22623,22624,22627,22628,22210,22631,22210,22634,22210,22637,22640],{},"还有一个限制：",[1101,22625,22626],{},"不能从循环中提前跳出","，也就是不要在 pragma 块里用 ",[1071,22629,22630],{"code":22630},"break",[1071,22632,22633],{"code":22633},"return",[1071,22635,22636],{"code":22636},"exit",[1071,22638,22639],{"code":22639},"goto"," 这类破坏结构化控制流的东西。",[1991,22642,22643],{},[1097,22644,22645],{},"OpenMP 要把循环切开分给多个线程，所以它必须能清楚知道循环的边界、步长、迭代次数和退出条件。",[1097,22647,22648,22649,22651],{},"如果你在循环中间 ",[1071,22650,22630],{"code":22630},"，那就麻烦了：\n线程 0 break 了，线程 1、2、3 怎么办？已经执行的迭代算不算？别的线程要不要停？语义会变复杂。",[1097,22653,22654],{},"所以 OpenMP 喜欢结构规整的循环。",[1231,22656],{},[1092,22658,22660],{"id":22659},"第-132-页openmp-parallel-for-语法必须掌握","第 132 页：OpenMP parallel for 语法，必须掌握",[1097,22662,22663],{},"这一页给出最核心语法：",[2259,22665,22668],{"className":22666,"code":22667,"language":2768,"meta":2265},[2766],"#include \u003Comp.h>\n\n#pragma omp parallel for\nfor (int i = 0; i \u003C 100; i++) {\n    ...\n}\n",[1071,22669,22667],{"__ignoreMap":2265},[1097,22671,22672,22673],{},"这也是 OpenMP 的优雅之处：\n",[1104,22674,22675],{},"它尽量不改变 C 语言本身，而是通过注释式指令添加并行语义。",[1231,22677],{},[1092,22679,22681],{"id":22680},"第-133-页openmp-例子输出重要度中等","第 133 页：OpenMP 例子输出，重要度中等",[1097,22683,22684],{},[1246,22685],{"alt":1246,"src":22686},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-42.png",[1097,22688,22689,22690,22693],{},"注意一个细节：输出顺序不一定按 ",[1071,22691,22692],{"code":22692},"i=0,1,2,3..."," 排列。\n因为线程是并发执行的，谁先打印取决于调度。\n所以并行程序里：",[1991,22695,22696],{},[1097,22697,22698],{},"计算结果可以确定，但输出顺序不一定确定。",[1097,22700,22701],{},"这个直觉后面理解 race condition 很重要。",[1231,22703],{},[1092,22705,22707],{"id":22706},"第-134-页openmp-基本性质必须掌握","第 134 页：OpenMP 基本性质，必须掌握",[1097,22709,22710],{},"这一页是 OpenMP 的定义页。OpenMP 是：",[2284,22712,22713,22716,22733,22736],{},[1212,22714,22715],{},"C 的扩展，不需要学一门全新语言；",[1212,22717,22718,22719],{},"多线程；共享内存并行；\n",[2284,22720,22721,22727],{},[1212,22722,22723,22724,3279],{},"使用 compiler directives，比如 ",[1071,22725,22726],{"code":22726},"#pragma",[1212,22728,22729,22730,3279],{},"使用 runtime library，比如 ",[1071,22731,22732],{"code":22732},"#include \u003Comp.h>",[1212,22734,22735],{},"同一份源代码可以在 1 核和 16 核机器上运行；",[1212,22737,22738],{},"只适用于共享内存。",[1991,22740,22741],{},[1097,22742,22743],{},"OpenMP 假设多个线程能看到同一个地址空间。",[1097,22745,22746,22747,1107],{},"所以线程之间通信很简单：读写同一个变量。\n但这也是危险来源：多个线程如果同时写同一个变量，就可能发生",[1101,22748,22749],{},"数据竞争",[1097,22751,22752],{},"这页非常适合考：",[1097,22754,22755],{},[1104,22756,22757],{},"问：OpenMP 适合什么机器？",[1097,22759,22760,22761],{},"答：\n",[1104,22762,22763],{},"共享内存多处理器\u002F多核机器。",[1097,22765,22766],{},"它不适合那种每台机器有独立内存、必须通过网络通信的分布式系统。那种更适合 MPI。",[1231,22768],{},[1092,22770,22772],{"id":22771},"第-135-页openmp-parallel-for-细节","第 135 页：OpenMP parallel for 细节",[1097,22774,22775],{},"这一页是考试重点。",[1097,22777,22778],{},"代码：",[2259,22780,22783],{"className":22781,"code":22782,"language":2768,"meta":2265},[2766],"#pragma omp parallel for\nfor (i = 0; i \u003C max; i++)\n    zero[i] = 0;\n",[1071,22784,22782],{"__ignoreMap":2265},[1097,22786,22787,22788,22791],{},"OpenMP 会让主线程创建其他线程，",[1101,22789,22790],{},"每个线程有独立执行上下文","。\n默认情况下：",[2284,22793,22794,22800,22809,22815],{},[1212,22795,22796,22797,3279],{},"在 for 循环外声明的变量是 ",[1104,22798,22799],{},"shared，共享的",[1212,22801,22802,22803,22805,22806,3279],{},"循环索引 ",[1071,22804,1439],{"code":1439}," 是 ",[1104,22807,22808],{},"implicitly private，隐式私有的",[1212,22810,22811,22812,3279],{},"for 循环结束时有一个隐式 ",[1104,22813,22814],{},"barrier，同步屏障",[1212,22816,22817],{},"默认按连续区间划分索引区域。",[1097,22819,22820],{},"这里每个点都值得理解。",[978,22822,22824],{"id":22823},"_1-为什么循环索引必须-private","1. 为什么循环索引必须 private？",[1097,22826,22827,22828,22830,22831,22833,22834,22836],{},"如果所有线程共享同一个 ",[1071,22829,1439],{"code":1439},"，那就炸了。\n线程 0 改 ",[1071,22832,1439],{"code":1439},"，线程 1 也改 ",[1071,22835,1439],{"code":1439},"，循环控制变量会混乱。",[1097,22838,22839,22840,1107],{},"所以 OpenMP 自动让每个线程有自己的 ",[1071,22841,1439],{"code":1439},[1991,22843,22844],{},[1097,22845,22846],{},"每个线程都需要知道“我现在处理哪一个迭代”，这个状态不能被别的线程乱改。",[978,22848,22850],{"id":22849},"_2-为什么数组-zero-可以-shared","2. 为什么数组 zero 可以 shared？",[1097,22852,22853],{},"因为每个线程写的是不同位置：",[2259,22855,22858],{"className":22856,"code":22857,"language":2768,"meta":2265},[2766],"zero[i] = 0;\n",[1071,22859,22857],{"__ignoreMap":2265},[1097,22861,22862,22863,22866,22867,22870],{},"线程 0 写 ",[1071,22864,22865],{"code":22865},"zero[0..24]","，线程 1 写 ",[1071,22868,22869],{"code":22869},"zero[25..49]","。\n只要每个元素只被一个线程写，就没问题。",[978,22872,22874],{"id":22873},"_3-为什么循环结束有-barrier","3. 为什么循环结束有 barrier？",[1097,22876,22877],{},"因为循环后面的代码可能依赖整个数组都已经处理完。",[1097,22879,8741],{},[2259,22881,22884],{"className":22882,"code":22883,"language":2768,"meta":2265},[2766],"#pragma omp parallel for\nfor (i = 0; i \u003C max; i++)\n    zero[i] = 0;\n\ncheck(zero);\n",[1071,22885,22883],{"__ignoreMap":2265},[1097,22887,22888,22889,22892],{},"如果没有 barrier，某个线程还没写完，主线程就开始 ",[1071,22890,22891],{"code":22891},"check","，结果可能错。",[1991,22894,22895],{},[1097,22896,22897],{},"当后续代码依赖所有并行工作完成时，必须等待最慢的线程。（后面的工作可能是串行的，需要前面全部完成）",[1097,22899,22900],{},"这也带来代价：如果负载不均衡，快线程要等慢线程。",[1231,22902],{},[1092,22904,22906],{"id":22905},"第-136-页fork-join-模型必须掌握","第 136 页：Fork-Join 模型，必须掌握",[1097,22908,22909],{},[1246,22910],{"alt":1246,"src":22911},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-43.png",[1097,22913,22914,22915,1107],{},"OpenMP 使用 ",[1104,22916,22917],{},"Fork-Join Model",[1097,22919,22920,22921,22924],{},"程序开始时只有一个 ",[1104,22922,22923],{},"master thread"," 顺序执行。\n遇到并行区域时：",[1209,22926,22927,22930,22933,22936],{},[1212,22928,22929],{},"master thread fork 出一组 parallel threads；",[1212,22931,22932],{},"多个线程同时执行；",[1212,22934,22935],{},"并行区结束时 join；",[1212,22937,22938],{},"只留下 master thread 继续顺序执行。",[1097,22940,22941],{},"课件还提醒：每个并行区域都重复这个过程，并且要考虑 Amdahl 定律。",[1991,22943,22944],{},[1097,22945,22946],{},"并行程序不是从头到尾都并行，它通常是在“串行段”和“并行段”之间切换。",[1097,22948,22949],{},"这直接对应 Amdahl 定律。",[1097,22951,22952,22953,22956],{},"另外，fork\u002Fjoin 本身也有开销。\n所以 OpenMP 适合把",[1104,22954,22955],{},"足够大的循环","并行化。\n如果循环只有 10 次，每次工作量很小，开线程的成本可能比计算还大。",[1231,22958],{},[1092,22960,22962],{"id":22961},"第-137-页openmp-线程是什么","第 137 页：OpenMP 线程是什么",[1097,22964,22965],{},"OpenMP 写出来的是软件层面的并行；最后能不能真的并行，要看操作系统把这些 OpenMP 线程映射到多少个硬件线程上。",[1231,22967],{},[1092,22969,22971],{"id":22970},"第-138-页例子-2计算-π","第 138 页：例子 2：计算 π",[1097,22973,22974],{},"这一页引入一个经典例子：用数值积分计算 π。",[1097,22976,22977],{},"思想是利用：",[1304,22979,22981],{"className":22980},[1307],[1304,22982,22984,23031],{"className":22983},[1311],[1304,22985,22987],{"className":22986},[1315],[1317,22988,22989],{"xmlns":1319,"display":1320},[1322,22990,22991,23028],{},[1325,22992,22993,22996,22998,23008,23024,23026],{},[1328,22994,22995],{},"π",[1332,22997,1334],{},[22999,23000,23001,23004,23006],"msubsup",{},[1332,23002,23003],{},"∫",[1869,23005,2334],{},[1869,23007,2327],{},[2533,23009,23010,23012],{},[1869,23011,8511],{},[1325,23013,23014,23016,23018],{},[1869,23015,2327],{},[1332,23017,3464],{},[1863,23019,23020,23022],{},[1328,23021,4975],{},[1869,23023,1871],{},[1328,23025,2820],{},[1328,23027,4975],{},[1345,23029,23030],{"encoding":1347},"\\pi = \\int_0^1 \\frac{4}{1+x^2} dx",[1304,23032,23034,23052],{"className":23033,"ariaHidden":1353},[1352],[1304,23035,23037,23040,23043,23046,23049],{"className":23036},[1357],[1304,23038],{"className":23039,"style":4832},[1361],[1304,23041,22995],{"className":23042,"style":13731},[1366,1367],[1304,23044],{"className":23045,"style":1373},[1372],[1304,23047,1334],{"className":23048},[1377],[1304,23050],{"className":23051,"style":1373},[1372],[1304,23053,23055,23059,23115,23118,23218,23221],{"className":23054},[1357],[1304,23056],{"className":23057,"style":23058},[1361],"height:2.476em;vertical-align:-0.9119em;",[1304,23060,23062,23066],{"className":23061},[1569],[1304,23063,23003],{"className":23064,"style":23065},[1569,1606,1607],"margin-right:0.4445em;position:relative;top:-0.0011em;",[1304,23067,23069],{"className":23068},[1498],[1304,23070,23072,23106],{"className":23071},[1502,1503],[1304,23073,23075,23103],{"className":23074},[1507],[1304,23076,23079,23091],{"className":23077,"style":23078},[1511],"height:1.564em;",[1304,23080,23082,23085],{"style":23081},"top:-1.7881em;margin-left:-0.4445em;margin-right:0.05em;",[1304,23083],{"className":23084,"style":1520},[1519],[1304,23086,23088],{"className":23087},[1524,1525,1526,1527],[1304,23089,2334],{"className":23090},[1366,1527],[1304,23092,23094,23097],{"style":23093},"top:-3.8129em;margin-right:0.05em;",[1304,23095],{"className":23096,"style":1520},[1519],[1304,23098,23100],{"className":23099},[1524,1525,1526,1527],[1304,23101,2327],{"className":23102},[1366,1527],[1304,23104,1540],{"className":23105},[1539],[1304,23107,23109],{"className":23108},[1507],[1304,23110,23113],{"className":23111,"style":23112},[1511],"height:0.9119em;",[1304,23114],{},[1304,23116],{"className":23117,"style":1623},[1372],[1304,23119,23121,23124,23215],{"className":23120},[1366],[1304,23122],{"className":23123},[2611,2612],[1304,23125,23127],{"className":23126},[2533],[1304,23128,23130,23207],{"className":23129},[1502,1503],[1304,23131,23133,23204],{"className":23132},[1507],[1304,23134,23136,23185,23193],{"className":23135,"style":3542},[1511],[1304,23137,23138,23141],{"style":2628},[1304,23139],{"className":23140,"style":2632},[1519],[1304,23142,23144,23147,23150,23153,23156],{"className":23143},[1366],[1304,23145,2327],{"className":23146},[1366],[1304,23148],{"className":23149,"style":1394},[1372],[1304,23151,3464],{"className":23152},[1398],[1304,23154],{"className":23155,"style":1394},[1372],[1304,23157,23159,23162],{"className":23158},[1366],[1304,23160,4975],{"className":23161},[1366,1367],[1304,23163,23165],{"className":23164},[1498],[1304,23166,23168],{"className":23167},[1502],[1304,23169,23171],{"className":23170},[1507],[1304,23172,23174],{"className":23173,"style":2669},[1511],[1304,23175,23176,23179],{"style":2672},[1304,23177],{"className":23178,"style":1520},[1519],[1304,23180,23182],{"className":23181},[1524,1525,1526,1527],[1304,23183,1871],{"className":23184},[1366,1527],[1304,23186,23187,23190],{"style":2684},[1304,23188],{"className":23189,"style":2632},[1519],[1304,23191],{"className":23192,"style":2692},[2691],[1304,23194,23195,23198],{"style":2695},[1304,23196],{"className":23197,"style":2632},[1519],[1304,23199,23201],{"className":23200},[1366],[1304,23202,8511],{"className":23203},[1366],[1304,23205,1540],{"className":23206},[1539],[1304,23208,23210],{"className":23209},[1507],[1304,23211,23213],{"className":23212,"style":2743},[1511],[1304,23214],{},[1304,23216],{"className":23217},[2749,2612],[1304,23219,2820],{"className":23220},[1366,1367],[1304,23222,4975],{"className":23223},[1366,1367],[1097,23225,23226,23227,23230],{},"程序把区间 (",[1304,23228,23229],{},"0,1",") 切成很多小段，每段取一个点算函数值，再把这些值加起来。",[1097,23232,23233],{},"这个问题特别适合并行，因为：",[1991,23235,23236],{},[1097,23237,23238],{},"每个小段的函数值可以独立计算，最后只需要把结果求和。",[1097,23240,23241],{},"它的并行结构是：",[2259,23243,23246],{"className":23244,"code":23245,"language":18502},[18500],"独立计算很多项  →  最后合并求和\n",[1071,23247,23245],{"__ignoreMap":2265},[1097,23249,23250,23251,1107],{},"这正好引出后面的 ",[1104,23252,23253],{},"reduction",[1231,23255],{},[1092,23257,23259],{"id":23258},"第-139-页串行-π","第 139 页：串行 π",[1097,23261,23262],{},[1246,23263],{"alt":1246,"src":23264},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-44.png",[1097,23266,23267],{},"串行版本得到：",[2259,23269,23272],{"className":23270,"code":23271,"language":18502},[18500],"pi = 3.142425985001\n",[1071,23273,23271],{"__ignoreMap":2265},[1097,23275,23276,23277,23280],{},"课件说接近 π，但不够准确，所以增加 ",[1071,23278,23279],{"code":23279},"num_steps"," 并并行化。",[1991,23282,23283],{},[1097,23284,23285],{},"数值积分的精度取决于把区间切得多细。",[1097,23287,23288,23290,23291,23293],{},[1071,23289,23279],{"code":23279}," 越大，小矩形越窄，近似越准。\n但 ",[1071,23292,23279],{"code":23279}," 越大，循环次数也越多，计算时间越长。\n这就是并行化的好机会：每一步相互独立，可以分给多个线程。",[1231,23295],{},[1092,23297,23299],{"id":23298},"第-140-页并行化问题共享-sum","第 140 页：并行化问题：共享 sum",[1097,23301,23302],{},"这一页指出最关键的问题：",[1991,23304,23305],{},[1097,23306,23307,23308,1107],{},"每个线程都需要访问共享变量 ",[1071,23309,23310],{"code":23310},"sum",[1097,23312,23313],{},[1246,23314],{"alt":1246,"src":23315},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-45.png",[1097,23317,23318],{},"如果天真的并行化，代码是：",[2259,23320,23323],{"className":23321,"code":23322,"language":2768,"meta":2265},[2766],"sum += f(i);\n",[1071,23324,23322],{"__ignoreMap":2265},[1097,23326,23327],{},"它至少分成三步：",[2259,23329,23332],{"className":23330,"code":23331,"language":18502},[18500],"读 sum\n计算 sum + f(i)\n写回 sum\n",[1071,23333,23331],{"__ignoreMap":2265},[1097,23335,23336],{},"如果多个线程同时做这三步，就会出问题。",[1991,23338,23339],{},[1097,23340,23341],{},"高级语言的一条语句，底层可能是多条指令；多个线程的这些指令可能交错执行。",[1097,23343,23344],{},"这就是并行编程真正麻烦的地方：\n循环里的每一项可以并行算，但共享的 sum 不能被多个线程随便同时更新",[1231,23346],{},[1092,23348,23350],{"id":23349},"第-141-页用多个-sum-分开算重要","第 141 页：用多个 sum 分开算，重要",[1097,23352,23353],{},"这一页给出一个简单思路：",[1097,23355,23356],{},[1246,23357],{"alt":1246,"src":23358},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-46.png",[1097,23360,23361],{},"并行计算：",[2259,23363,23366],{"className":23364,"code":23365,"language":18502},[18500],"线程0：sum[0]\n线程1：sum[1]\n",[1071,23367,23365],{"__ignoreMap":2265},[1097,23369,23370],{},"串行合并：",[2259,23372,23375],{"className":23373,"code":23374,"language":18502},[18500],"sum = sum[0] + sum[1]\n",[1071,23376,23374],{"__ignoreMap":2265},[1991,23378,23379],{},[1097,23380,23381],{},"如果多个线程同时写同一个变量会冲突，那就让每个线程写自己的私有变量，最后再合并。",[1231,23383],{},[1092,23385,23387],{"id":23386},"第-142-页并行-π-试运行","第 142 页：并行 π 试运行",[1097,23389,23390],{},"第 142 页打印了类似：",[2259,23392,23395],{"className":23393,"code":23394,"language":18502},[18500],"i = 1, id = 1\ni = 0, id = 0\ni = 2, id = 2\ni = 3, id = 3\ni = 5, id = 1\ni = 4, id = 0\n...\n",[1071,23396,23394],{"__ignoreMap":2265},[1097,23398,23399,23400,23402],{},"你会发现 ",[1071,23401,1439],{"code":1439}," 的输出不是严格 0,1,2,3,4,5 的顺序。",[1097,23404,23405,23406,23409],{},"这正是并行程序的正常现象：不同线程谁先跑、谁后跑，由操作系统调度和硬件状态决定。只要每个线程写的是自己的 ",[1071,23407,23408],{"code":23408},"sum[id]","，结果就可以是正确的。",[1097,23411,23412],{},"第 142 页最后仍然得到：",[2259,23414,23416],{"className":23415,"code":23271,"language":18502},[18500],[1071,23417,23271],{"__ignoreMap":2265},[1097,23419,23420],{},"说明虽然打印顺序乱，但计算逻辑没错",[1231,23422],{},[1092,23424,23426],{"id":23425},"第-143-页增加-num_steps提高精度略中带重要","第 143 页：增加 num_steps，提高精度，略中带重要",[1097,23428,23429,23430,23432],{},"这一页把 ",[1071,23431,23279],{"code":23279}," 增加到 (10^6)，结果：",[2259,23434,23437],{"className":23435,"code":23436,"language":18502},[18500],"pi = 3.141592653590\n",[1071,23438,23436],{"__ignoreMap":2265},[1097,23440,23441],{},"非常接近 π。",[1991,23443,23444],{},[1097,23445,23446],{},"并行化让我们可以承受更多迭代，从而提高数值精度或处理更大问题。",[1097,23448,23449],{},"这是弱扩展思路的影子：硬件更多时，我们不一定只追求更快，也可以追求更大、更准的问题。",[1231,23451],{},[1092,23453,23455],{"id":23454},"第-144-页能不能在并行区里直接求总-sum最重要之一","第 144 页：能不能在并行区里直接求总 sum？最重要之一",[1097,23457,23458,23459,23461],{},"这一页问：我们可以并行计算 ",[1071,23460,23310],{"code":23310}," 吗？",[1097,23463,23464],{},"直接写类似：",[2259,23466,23469],{"className":23467,"code":23468,"language":2768,"meta":2265},[2766],"pi = pi + sum[id];\n",[1071,23470,23468],{"__ignoreMap":2265},[1097,23472,23473],{},"结果：",[2259,23475,23478],{"className":23476,"code":23477,"language":18502},[18500],"PI = 3.138450662641\n",[1071,23479,23477],{"__ignoreMap":2265},[1097,23481,23482],{},"而且不同运行之间值会变化。课件问：这是为什么？",[1097,23484,23485,23486,23491],{},"答案是：",[1101,23487,23488],{},[1104,23489,23490],{},"race condition，竞争条件",[1101,23492,1107],{},[1991,23494,23495],{},[1097,23496,23497],{},"多个线程同时读写同一个共享变量，而最终结果依赖这些读写发生的先后顺序，就会产生不确定性。",[1097,23499,23500],{},"这页非常重要，因为它从 OpenMP 编程自然过渡到下一板块“并行同步”。",[1231,23502],{},[1092,23504,23506],{"id":23505},"第-145-页用汇编解释-race-condition","第 145 页：用汇编解释 race condition",[1097,23508,23509],{},"第 145 页用这个例子：",[2259,23511,23514],{"className":23512,"code":23513,"language":18502},[18500],"# *(x1) = 100\nlw   x2, 0(x1)\naddi x2, x2, 1\nsw   x2, 0(x1)\n",[1071,23515,23513],{"__ignoreMap":2265},[1097,23517,23518],{},"两个线程同时执行“把内存里的值加 1”。直觉上应该从 100 变成 102。",[1097,23520,23521],{},"但可能发生：",[2259,23523,23526],{"className":23524,"code":23525,"language":18502},[18500],"线程 A 读到 100\n线程 B 读到 100\n线程 A 算 101\n线程 B 算 101\n线程 A 写 101\n线程 B 写 101\n",[1071,23527,23525],{"__ignoreMap":2265},[1097,23529,23530],{},"最后结果是 101，不是 102。",[1097,23532,23533,23534,23537,23538,22210,23541,22210,23544,23547],{},"这叫 ",[1104,23535,23536],{},"lost update","。课件第 145 页就是用这个底层例子说明：高级语言里的 ",[1071,23539,23540],{"code":23540},"x++",[1071,23542,23543],{"code":23543},"sum += value",[1071,23545,23546],{"code":23546},"pi = pi + sum[id]"," 都不是天然原子的。",[1231,23549],{},[1092,23551,23553],{"id":23552},"第-146-页race-condition-是怎么发生的必须掌握","第 146 页：race condition 是怎么发生的，必须掌握",[2259,23555,23558],{"className":23556,"code":23557,"language":18502},[18500],"pi = pi + sum[id]\n",[1071,23559,23557],{"__ignoreMap":2265},[1097,23561,23562,23563,23566],{},"如果多个线程读取同一个 ",[1071,23564,23565],{"code":23565},"pi"," 的中间值，然后分别计算、分别写回，结果取决于谁先到、谁后到。",[1097,23568,23569],{},"所以结果是：",[2259,23571,23574],{"className":23572,"code":23573,"language":18502},[18500],"not deterministic\n",[1071,23575,23573],{"__ignoreMap":2265},[1097,23577,23578],{},"也就是非确定性的。",[1097,23580,23581],{},"这就是并行程序最讨厌的 bug：",[1097,23583,23584],{},"它不是每次都错成同一个值，而是这次对、下次错、换台机器又不一样。",[1231,23586],{},[1092,23588,23590],{"id":23589},"第-147-页openmp-reduction最重要","第 147 页：OpenMP Reduction，最重要",[1097,23592,23593,23594,6178],{},"第 147 页引入 OpenMP 的 ",[1071,23595,23253],{"code":23253},[2259,23597,23600],{"className":23598,"code":23599,"language":18502},[18500],"#pragma omp for reduction(+ : sum)\nfor (i = 0; i \u003C= MAX; i++)\n    sum += A[i];\n",[1071,23601,23599],{"__ignoreMap":2265},[1097,23603,23604],{},"它的意思是：",[2259,23606,23609],{"className":23607,"code":23608,"language":18502},[18500],"每个线程都有一个私有的 sum\n每个线程先算自己的部分\n并行区域结束后\nOpenMP 自动把所有私有 sum 用 + 合并到全局 sum\n",[1071,23610,23608],{"__ignoreMap":2265},[1097,23612,23613],{},"也就是编译器帮你做第 141 页的事情：",[2259,23615,23618],{"className":23616,"code":23617,"language":18502},[18500],"sum = sum[0] + sum[1] + sum[2] + ...\n",[1071,23619,23617],{"__ignoreMap":2265},[1097,23621,23622],{},"但它保证不会 race。课件第 147 页明确说，reduction 会指定每个线程私有的变量，并在并行区域末端进行约简操作。",[1097,23624,23625],{},"所以 reduction",[1991,23627,23628],{},[1097,23629,23630],{},[1104,23631,23632],{},"把一个危险的共享更新，改写成“私有局部累计 + 安全合并”。",[1231,23634],{},[1092,23636,23638],{"id":23637},"第-148-页手写的初始并行版本","第 148 页：手写的初始并行版本",[1097,23640,23641],{},"第 148 页代码大概是：",[2259,23643,23646],{"className":23644,"code":23645,"language":18502},[18500],"#define NUM_THREADS 4\nstatic long num_steps = 100000;\ndouble step;\n\nvoid main() {\n    int i;\n    double x, pi, sum[NUM_THREADS];\n\n    step = 1.0 \u002F (double) num_steps;\n\n    #pragma omp parallel private(i, x)\n    {\n        int id = omp_get_thread_num();\n\n        for (i = id, sum[id] = 0.0;\n             i \u003C num_steps;\n             i = i + NUM_THREADS) {\n\n            x = (i + 0.5) * step;\n            sum[id] += 4.0 \u002F (1.0 + x * x);\n        }\n    }\n\n    for (i = 1; i \u003C NUM_THREADS; i++)\n        sum[0] += sum[i];\n\n    pi = sum[0];\n}\n",[1071,23647,23645],{"__ignoreMap":2265},[1097,23649,23650],{},"它的核心是这句：",[2259,23652,23655],{"className":23653,"code":23654,"language":18502},[18500],"for (i = id; i \u003C num_steps; i = i + NUM_THREADS)\n",[1071,23656,23654],{"__ignoreMap":2265},[1097,23658,23659],{},"假设 4 个线程：",[2259,23661,23664],{"className":23662,"code":23663,"language":18502},[18500],"线程 0: i = 0, 4, 8, 12, ...\n线程 1: i = 1, 5, 9, 13, ...\n线程 2: i = 2, 6, 10, 14, ...\n线程 3: i = 3, 7, 11, 15, ...\n",[1071,23665,23663],{"__ignoreMap":2265},[1097,23667,23668],{},"每个线程写自己的：",[2259,23670,23673],{"className":23671,"code":23672,"language":18502},[18500],"sum[id]\n",[1071,23674,23672],{"__ignoreMap":2265},[1097,23676,23677],{},"所以不会互相覆盖。最后由主线程串行合并：",[2259,23679,23682],{"className":23680,"code":23681,"language":18502},[18500],"sum[0] += sum[1];\nsum[0] += sum[2];\nsum[0] += sum[3];\n",[1071,23683,23681],{"__ignoreMap":2265},[1097,23685,23686],{},"这就是手写 reduction。课件第 148 页展示的就是这种初始并行版本。",[1097,23688,23689,23690,23693],{},"不过这里要注意一个小坑：从数学公式看，最终必须乘上 ",[1071,23691,23692],{"code":23692},"step","。第 139 页和第 140 页代码里是：",[2259,23695,23698],{"className":23696,"code":23697,"language":18502},[18500],"sum += 4.0 * step \u002F (1.0 + x * x);\n",[1071,23699,23697],{"__ignoreMap":2265},[1097,23701,23702],{},"但第 148、149 页截图里写的是：",[2259,23704,23707],{"className":23705,"code":23706,"language":18502},[18500],"sum += 4.0 \u002F (1.0 + x * x);\npi = sum;\n",[1071,23708,23706],{"__ignoreMap":2265},[1097,23710,23711,23712,23715],{},"如果完全照图这样写，结果会大约是 ",[1071,23713,23714],{"code":23714},"num_steps * π","，不是 π。正确写法应该二选一：",[2259,23717,23720],{"className":23718,"code":23719,"language":18502},[18500],"sum[id] += 4.0 * step \u002F (1.0 + x * x);\npi = sum[0];\n",[1071,23721,23719],{"__ignoreMap":2265},[1097,23723,23724],{},"或者：",[2259,23726,23729],{"className":23727,"code":23728,"language":18502},[18500],"sum[id] += 4.0 \u002F (1.0 + x * x);\npi = step * sum[0];\n",[1071,23730,23728],{"__ignoreMap":2265},[1097,23732,23733,23734,23736],{},"所以这里很可能是课件代码漏了 ",[1071,23735,23692],{"code":23692},"，但它想讲的 OpenMP 并行结构是对的。",[1231,23738],{},[1092,23740,23742],{"id":23741},"第-149-页最终版本用-parallel-for-reduction","第 149 页：最终版本，用 parallel for + reduction",[1097,23744,23745],{},"第 149 页把手写版本简化成 OpenMP 推荐写法：",[2259,23747,23750],{"className":23748,"code":23749,"language":18502},[18500],"#pragma omp parallel for private(x) reduction(+:sum)\nfor (i = 1; i \u003C= num_steps; i++) {\n    x = (i - 0.5) * step;\n    sum = sum + 4.0 \u002F (1.0 + x * x);\n}\npi = sum;\n",[1071,23751,23749],{"__ignoreMap":2265},[1097,23753,23754],{},"这页的重点是：",[2259,23756,23759],{"className":23757,"code":23758,"language":18502},[18500],"#pragma omp parallel for private(x) reduction(+:sum)\n",[1071,23760,23758],{"__ignoreMap":2265},[1097,23762,23763],{},"它同时做了三件事：",[2259,23765,23768],{"className":23766,"code":23767,"language":18502},[18500],"parallel for:\n    把 for 循环的 i 分给多个线程\n\nprivate(x):\n    每个线程有自己的 x，避免互相覆盖\n\nreduction(+:sum):\n    每个线程有自己的局部 sum\n    最后 OpenMP 自动用 + 合并\n",[1071,23769,23767],{"__ignoreMap":2265},[1097,23771,23772,23773,1107],{},"这就是第 148 页手写版本的自动化。课件第 149 页标题也明确写着：",[1071,23774,23775],{"code":23775},"parallel for, reduction",[1097,23777,23778,23779,6178],{},"同样，这页数学上也应该乘 ",[1071,23780,23692],{"code":23692},[2259,23782,23785],{"className":23783,"code":23784,"language":18502},[18500],"sum = sum + 4.0 * step \u002F (1.0 + x * x);\n",[1071,23786,23784],{"__ignoreMap":2265},[1097,23788,23789],{},"或者最后：",[2259,23791,23794],{"className":23792,"code":23793,"language":18502},[18500],"pi = step * sum;\n",[1071,23795,23793],{"__ignoreMap":2265},[1231,23797],{},[1092,23799,23800],{"id":23800},"最值得背的几句话",[1991,23802,23803],{},[1097,23804,23805,23806,23808],{},"OpenMP 是共享内存多线程并行编程模型，通过 ",[1071,23807,22726],{"code":22726}," 给 C 程序添加并行语义。",[1991,23810,23811],{},[1097,23812,23813,23816],{},[1071,23814,23815],{"code":23815},"#pragma omp parallel for"," 会把 for 循环迭代分配给多个线程执行。",[1991,23818,23819],{},[1097,23820,23821],{},"OpenMP 使用 fork-join 模型：master thread 遇到并行区 fork 出多个线程，并行区结束后 join。",[1991,23823,23824],{},[1097,23825,23826],{},"循环外声明的变量默认 shared，循环索引变量默认 private。",[1991,23828,23829],{},[1097,23830,23831,23834],{},[1071,23832,23833],{"code":23833},"sum += A[i]"," 不是原子操作，多个线程同时执行会产生 race condition。",[1991,23836,23837],{},[1097,23838,23839,23842],{},[1071,23840,23841],{"code":23841},"reduction(+:sum)"," 的本质是每个线程维护私有局部和，最后自动把它们相加合并。",[1231,23844],{},[1087,23846,23848],{"id":23847},"第-6-模块并行同步-synchronization","第 6 模块：并行同步 Synchronization",[1097,23850,23851,23852,1107],{},"继续讲最后一板块：",[1104,23853,23854],{},"第 6 模块——并行同步 Synchronization，第 150–167 页",[1991,23856,23857],{},[1097,23858,23859,23860],{},"并行程序里，多个线程会同时读写共享内存。\n只要两个线程可能同时碰同一个位置，并且至少一个是写，就会出现“不知道谁先发生”的问题。\n同步的目标就是：",[1104,23861,23862],{},"把某些本来可能交错执行的操作，强行变成有秩序、可预测的执行。",[1097,23864,23865,23866,1107],{},"前面 OpenMP 讲的是“怎么把循环拆开并行跑”；这一节讲的是“拆开以后，怎么不互相踩脚”。这块非常容易考：",[1104,23867,23868],{},"data race、lock、critical section、atomic\u002FAMO、OpenMP critical、deadlock",[1231,23870],{},[1092,23872,23874],{"id":23873},"第-150-页标题页","第 150 页：标题页",[1097,23876,18157,23877,1107],{},[1104,23878,23879],{},"并行同步 Synchronization",[1097,23881,23882],{},"上一节我们看到：",[2259,23884,23887],{"className":23885,"code":23886,"language":2768,"meta":2265},[2766],"pi += sum[id];\n",[1071,23888,23886],{"__ignoreMap":2265},[1097,23890,23891],{},"多个线程同时执行会出错。\n为什么？因为它不是一步完成的，而是：",[2259,23893,23896],{"className":23894,"code":23895,"language":18502},[18500],"读 pi → 加 sum[id] → 写 pi\n",[1071,23897,23895],{"__ignoreMap":2265},[1097,23899,23900],{},"同步就是为了解决这种“多个线程同时更新共享状态”的问题。",[1231,23902],{},[1092,23904,23906],{"id":23905},"第-151-页同步的基本问题","第 151 页：同步的基本问题",[1097,23908,23909],{},[1246,23910],{"alt":1246,"src":23911},"\u002Fimg\u002FComputerOrganization\u002FL10-11-Parallelism-47.png",[1097,23913,23914],{},"从生活中引入",[1231,23916],{},[1092,23918,23920],{"id":23919},"第-152-页数据竞争-data-race","第 152 页：数据竞争 Data Race",[1097,23922,23923],{},"这一页给出核心定义。",[1097,23925,23926,6178],{},[1104,23927,23928],{},"Data Race，数据竞争",[1991,23930,23931],{},[1097,23932,23933],{},"来自不同线程的两次内存访问访问同一个位置，至少有一次是写，并且它们没有被同步约束顺序，那么就形成数据竞争。",[1097,23935,21263],{},[1991,23937,23938],{},[1097,23939,23940],{},"程序正确性不能依赖“刚好某个线程先跑”。\n如果结果依赖调度运气，这个程序就是不可靠的。",[1097,23942,23943],{},"课件也强调：存在 data race 时，程序结果取决于机会；通过同步写入和读取可以获得确定性行为。",[1231,23945],{},[1092,23947,23949],{"id":23948},"第-153-页锁-locks必须掌握","第 153 页：锁 Locks，必须掌握",[1097,23951,23952],{},"锁是最基本的同步工具。",[1097,23954,23955],{},"通常：",[2259,23957,23960],{"className":23958,"code":23959,"language":18502},[18500],"lock = 0 表示 unlocked，没被占用\nlock = 1 表示 locked，已经被占用\n",[1071,23961,23959],{"__ignoreMap":2265},[1991,23963,23964],{},[1097,23965,23966],{},"锁就是一个共享的标志位，用来表示“某个共享资源现在有没有主人”。",[1231,23968],{},[1092,23970,23972],{"id":23971},"第-154-页朴素-lock-写法看起来对其实有坑","第 154 页：朴素 lock 写法，看起来对，其实有坑",[1097,23974,23975],{},"这一页给出直觉上的锁：",[2259,23977,23980],{"className":23978,"code":23979,"language":2768,"meta":2265},[2766],"while (lock != 0) ;\nlock = 1;\n\n\u002F\u002F critical section\n\nlock = 0;\n",[1071,23981,23979],{"__ignoreMap":2265},[1097,23983,23984],{},"即：",[2259,23986,23989],{"className":23987,"code":23988,"language":18502},[18500],"如果锁被别人拿着，就等；\n看到锁空了，就把锁设为 1；\n进入临界区；\n结束后把锁设回 0。\n",[1071,23990,23988],{"__ignoreMap":2265},[1097,23992,23993],{},"这看起来非常合理，但问题藏在这两句之间：",[2259,23995,23998],{"className":23996,"code":23997,"language":2768,"meta":2265},[2766],"while (lock != 0) ;\nlock = 1;\n",[1071,23999,23997],{"__ignoreMap":2265},[1097,24001,24002,8799,24005,24008],{},[1104,24003,24004],{},"检查 lock 是否为 0",[1104,24006,24007],{},"把 lock 设为 1"," 是两个动作。\n只要是两个动作，中间就可能被别的线程插进来。",[1097,24010,24011],{},"也就是说，“看到麦克风在桌上”和“把麦克风拿到手里”不是同一瞬间完成的。你刚看到麦克风空着，别人也看到了，然后你俩同时伸手，尴尬了。",[1231,24013],{},[1092,24015,24017],{"id":24016},"第-155-页为什么朴素-lock-失败","第 155 页：为什么朴素 lock 失败",[1097,24019,24020],{},"这一页用 Thread 1 和 Thread 2 说明：",[2259,24022,24025],{"className":24023,"code":24024,"language":2768,"meta":2265},[2766],"\u002F\u002F Thread 1\nwhile (lock != 0);\nlock = 1;\n\u002F\u002F critical section\nlock = 0;\n\n\u002F\u002F Thread 2\nwhile (lock != 0);\nlock = 1;\n\u002F\u002F critical section\nlock = 0;\n",[1071,24026,24024],{"__ignoreMap":2265},[1097,24028,24029],{},"可能发生这样的时间线：",[2259,24031,24034],{"className":24032,"code":24033,"language":18502},[18500],"初始 lock = 0\n\nThread 1 读 lock，发现是 0\nThread 2 读 lock，发现也是 0\n\nThread 1 执行 lock = 1\nThread 2 执行 lock = 1\n\nThread 1 进入 critical section\nThread 2 也进入 critical section\n",[1071,24035,24033],{"__ignoreMap":2265},[1097,24037,24038],{},"两个人都以为自己拿到了锁。\n结果锁完全失效。",[1097,24040,24041],{},"课件特别强调：这个问题无论怎么尝试，在普通汇编级别也没有解决方案，除非引入新的指令。",[1097,24043,24044],{},"这就是本节最关键的洞察：",[1991,24046,24047],{},[1097,24048,24049],{},"实现锁需要一个不可分割的“读 + 写”操作。\n普通 load 和 store 分开执行，不足以实现正确的锁。",[1097,24051,24052,24053,1107],{},"这也解释了为什么同步不是纯软件问题，",[1101,24054,24055],{},"它需要硬件支持",[1231,24057],{},[1092,24059,24061],{"id":24060},"第-156-页硬件同步-hardware-synchronization","第 156 页：硬件同步 Hardware Synchronization",[1097,24063,24064,24065,1107],{},"这一页给出解决方案：",[1104,24066,24067],{},"atomic read\u002Fwrite，原子读写",[1097,24069,24070],{},"原子操作：",[1991,24072,24073],{},[1097,24074,24075],{},"一个操作在其他线程看来要么完全没发生，要么已经完全发生；中间状态不可见。",[1097,24077,24078],{},"具体到锁，我们需要一种指令能做到：",[2259,24080,24083],{"className":24081,"code":24082,"language":18502},[18500],"读出旧 lock 值 + 写入新 lock 值\n",[1071,24084,24082],{"__ignoreMap":2265},[1097,24086,24087],{},"并且中间不允许其他线程访问同一个 lock。",[1097,24089,24090],{},"课件列了两类常见硬件实现：",[1209,24092,24093,24099],{},[1212,24094,24095,24098],{},[1104,24096,24097],{},"atomic swap，原子交换","\n把寄存器和内存中的值原子交换。",[1212,24100,24101,24104],{},[1104,24102,24103],{},"linked load \u002F conditional store 这一类成对指令","\n先“链接读取”，再尝试写入。如果中间内存位置被别人改过，写入失败。",[1097,24106,24107],{},"RISC-V 两种都有变体，但课件为了简单重点讲 atomic swap。",[1097,24109,24110],{},"为什么必须共享内存？",[1097,24112,24113],{},"因为锁本身要被多个处理器\u002F线程共同看到。\n如果每个处理器都有自己私有的一份 lock，那就没法协调。\n所以同步通常建立在共享内存多处理器之上。",[1231,24115],{},[1092,24117,24119],{"id":24118},"第-157-页amo-原子存储器操作必须理解","第 157 页：AMO 原子存储器操作，必须理解",[1097,24121,24122,24123,1107],{},"AMO = ",[1104,24124,24125],{},"Atomic Memory Operations，原子内存操作",[1097,24127,24128],{},"课件用：",[2259,24130,24133],{"className":24131,"code":24132,"language":18502},[18500],"amoadd.w rd, rs2, (rs1)\n",[1071,24134,24132],{"__ignoreMap":2265},[1097,24136,24137],{},"解释 AMO 的通用含义：",[2259,24139,24142],{"className":24140,"code":24141,"language":18502},[18500],"t = M[x[rs1]]\nx[rd] = t\nM[x[rs1]] = t + x[rs2]\n",[1071,24143,24141],{"__ignoreMap":2265},[1097,24145,24146],{},"也就是说，它做三件事：",[1209,24148,24149,24156,24162],{},[1212,24150,24151,24152,24155],{},"从内存地址 ",[1071,24153,24154],{"code":24154},"x[rs1]"," 取出旧值；",[1212,24157,24158,24159,3279],{},"把旧值放到目标寄存器 ",[1071,24160,24161],{"code":24161},"rd",[1212,24163,24164,24165,24168],{},"把旧值和 ",[1071,24166,24167],{"code":24167},"rs2"," 做某种操作后的结果写回内存。",[1097,24170,24171,24172,24175],{},"重点是：这三件事是",[1104,24173,24174],{},"原子的","。\n别人不能插进来看到半成品。",[1097,24177,24178],{},"AMO 支持多种操作：",[2259,24180,24183],{"className":24181,"code":24182,"language":18502},[18500],"Add, And, Or, Swap, Xor, Max, Min ...\n",[1071,24184,24182],{"__ignoreMap":2265},[1097,24186,24187,24188,8799,24191,24194],{},"课件还提到 ",[1071,24189,24190],{"code":24190},"aq",[1071,24192,24193],{"code":24193},"rl","，它们用来确保顺序执行。",[1097,24196,24197],{},"这里稍微展开一下：",[982,24199,24200,24209],{},[985,24201,24202],{},[988,24203,24204,24206],{},[991,24205,9847],{},[991,24207,24208],{},"直觉含义",[1001,24210,24211,24221],{},[988,24212,24213,24218],{},[1006,24214,24215,24217],{},[1071,24216,24190],{"code":24190}," \u002F acquire",[1006,24219,24220],{},"拿锁之后，后面的内存操作不能乱跑到拿锁之前",[988,24222,24223,24228],{},[1006,24224,24225,24227],{},[1071,24226,24193],{"code":24193}," \u002F release",[1006,24229,24230],{},"释放锁之前，临界区里的内存操作不能乱跑到释放之后",[1097,24232,21263],{},[1991,24234,24235],{},[1097,24236,24237],{},"锁不仅要保证“只有一个线程进去”，还要保证“进去前后内存操作的顺序不要被 CPU\u002F编译器乱重排”。",[1097,24239,24240],{},"否则可能出现：你锁是拿了，但临界区里的读写顺序被优化器或硬件重排，另一个线程看到的状态仍然混乱。",[1231,24242],{},[1092,24244,24246],{"id":24245},"第-158-页risc-v-critical-section最重要","第 158 页：RISC-V Critical Section，最重要",[1097,24248,24249],{},"这一页给出正确的 RISC-V 锁实现。",[1097,24251,24252],{},"假设：",[2284,24254,24255,24265,24271],{},[1212,24256,24257,24260,24261,24264],{},[1071,24258,24259],{"code":24259},"lock"," 在 ",[1071,24262,24263],{"code":24263},"a0"," 指向的内存地址；",[1212,24266,24267,24270],{},[1071,24268,24269],{"code":24269},"lock = 0"," 表示 free；",[1212,24272,24273,24276],{},[1071,24274,24275],{"code":24275},"lock = 1"," 表示 set \u002F locked。",[1097,24278,22778],{},[2259,24280,24283],{"className":24281,"code":24282,"language":18502},[18500],"li t0, 1\n\nTry:\n    amoswap.w.aq t1, t0, (a0)\n    bnez t1, Try\n\n    \u002F\u002F critical section\n\n    amoswap.w.rl x0, x0, (a0)\n",[1071,24284,24282],{"__ignoreMap":2265},[1097,24286,24287],{},"逐行理解：",[2259,24289,24292],{"className":24290,"code":24291,"language":18502},[18500],"li t0, 1\n",[1071,24293,24291],{"__ignoreMap":2265},[1097,24295,24296,24297,24300],{},"把 1 放入 ",[1071,24298,24299],{"code":24299},"t0","，因为我们想把 lock 设置为 1。",[2259,24302,24305],{"className":24303,"code":24304,"language":18502},[18500],"amoswap.w.aq t1, t0, (a0)\n",[1071,24306,24304],{"__ignoreMap":2265},[1097,24308,24309],{},"这句是关键。它原子地做：",[2259,24311,24314],{"className":24312,"code":24313,"language":18502},[18500],"t1 = 旧的 lock 值\nlock = 1\n",[1071,24315,24313],{"__ignoreMap":2265},[1097,24317,24318],{},"也就是说，线程一边读取旧锁值，一边把锁设为 1，整个过程不可分割。",[1097,24320,24321],{},"接着：",[2259,24323,24326],{"className":24324,"code":24325,"language":18502},[18500],"bnez t1, Try\n",[1071,24327,24325],{"__ignoreMap":2265},[1097,24329,24330],{},"如果旧的 lock 值不是 0，说明别人已经持有锁。那就回去继续试。",[1097,24332,24333],{},"如果旧 lock 是 0，说明我成功把它从 0 改成 1，我拿到锁了。",[1097,24335,24336],{},"最后释放锁：",[2259,24338,24341],{"className":24339,"code":24340,"language":18502},[18500],"amoswap.w.rl x0, x0, (a0)\n",[1071,24342,24340],{"__ignoreMap":2265},[1097,24344,24345,24348,24349,24352,24353,24356],{},[1071,24346,24347],{"code":24347},"x0"," 永远是 0，所以这相当于把 lock 写回 0，释放锁。课件的 RISC-V critical section 正是用 ",[1071,24350,24351],{"code":24351},"amoswap.w.aq"," 尝试获得锁，用 ",[1071,24354,24355],{"code":24355},"amoswap.w.rl"," 释放锁。",[1097,24358,24359],{},"第一性原理总结：",[1991,24361,24362],{},[1097,24363,24364],{},"获得锁的本质不是“看到 lock 是 0”，而是“我成功地把 lock 从 0 改成 1，并且没人能同时完成同样的事”。",[1097,24366,24367],{},"这就是 atomic swap 的意义。",[1231,24369],{},[1092,24371,24373],{"id":24372},"第-159-页把错误-lock-修正成-amo-lock重要","第 159 页：把错误 lock 修正成 AMO lock，重要",[1097,24375,24376],{},"这一页把前面的错误写法和修正写法放在一起。",[1097,24378,24379],{},"错误写法：",[2259,24381,24384],{"className":24382,"code":24383,"language":2768,"meta":2265},[2766],"while (lock != 0);\nlock = 1;\n\n\u002F\u002F critical section\n\nlock = 0;\n",[1071,24385,24383],{"__ignoreMap":2265},[1097,24387,24388],{},"问题是“检查”和“设置”分离。",[1097,24390,24391],{},"修正写法：",[2259,24393,24396],{"className":24394,"code":24395,"language":18502},[18500],"li t0, 1\n\nTry:\n    amoswap.w.aq t1, t0, (a0)\n    bnez t1, Try\n\nLocked:\n    \u002F\u002F critical section\n\nUnlock:\n    amoswap.w.rl x0, x0, (a0)\n",[1071,24397,24395],{"__ignoreMap":2265},[1097,24399,24400],{},"这页最值得背的句子是：",[1991,24402,24403],{},[1097,24404,24405],{},"正确锁的 acquire 必须是原子 test-and-set \u002F swap，而不是普通 load + store。",[1097,24407,24408,24409,24412,24413,24416],{},"顺便注意：这里的 ",[1071,24410,24411],{"code":24411},"Try"," 循环是 ",[1104,24414,24415],{},"spin lock，自旋锁","。\n线程拿不到锁时，不是睡眠，而是一直循环尝试。",[1097,24418,24419],{},"自旋锁适合临界区很短的情况。\n如果临界区很长，自旋会浪费 CPU：一群线程站在门口疯狂转圈，CPU 粉丝都要破防。",[1231,24421],{},[1092,24423,24425],{"id":24424},"第-160-页openmp-锁定重要度中等","第 160 页：OpenMP 锁定，重要度中等",[1097,24427,24428],{},"这一页从底层 RISC-V 锁回到高级语言 OpenMP。",[1097,24430,24431],{},"图里代码大致是：",[2259,24433,24436],{"className":24434,"code":24435,"language":2768,"meta":2265},[2766],"omp_lock_t lock;\nomp_init_lock(&lock);\n\n#pragma omp parallel\n{\n    int id = omp_get_thread_num();\n\n    \u002F\u002F parallel section\n\n    omp_set_lock(&lock);\n\n    \u002F\u002F start sequential section\n    printf(\"id = %d\\n\", id);\n    \u002F\u002F end sequential section\n\n    omp_unset_lock(&lock);\n\n    \u002F\u002F parallel section\n}\n\nomp_destroy_lock(&lock);\n",[1071,24437,24435],{"__ignoreMap":2265},[1097,24439,24440],{},"这段代码的第一性原理：",[982,24442,24443,24453],{},[985,24444,24445],{},[988,24446,24447,24450],{},[991,24448,24449],{},"OpenMP 函数",[991,24451,24452],{},"作用",[1001,24454,24455,24465,24475,24485,24495],{},[988,24456,24457,24462],{},[1006,24458,24459],{},[1071,24460,24461],{"code":24461},"omp_lock_t lock",[1006,24463,24464],{},"声明一个锁变量",[988,24466,24467,24472],{},[1006,24468,24469],{},[1071,24470,24471],{"code":24471},"omp_init_lock(&lock)",[1006,24473,24474],{},"初始化锁",[988,24476,24477,24482],{},[1006,24478,24479],{},[1071,24480,24481],{"code":24481},"omp_set_lock(&lock)",[1006,24483,24484],{},"获取锁；如果锁被占用，就等待",[988,24486,24487,24492],{},[1006,24488,24489],{},[1071,24490,24491],{"code":24491},"omp_unset_lock(&lock)",[1006,24493,24494],{},"释放锁",[988,24496,24497,24502],{},[1006,24498,24499],{},[1071,24500,24501],{"code":24501},"omp_destroy_lock(&lock)",[1006,24503,24504],{},"销毁锁",[1097,24506,24507],{},"箭头标出的部分也很清楚：",[2284,24509,24510,24513,24522],{},[1212,24511,24512],{},"锁外面是 parallel section，可以多个线程同时执行；",[1212,24514,24515,8799,24518,24521],{},[1071,24516,24517],{"code":24517},"omp_set_lock",[1071,24519,24520],{"code":24520},"omp_unset_lock"," 之间是 sequential section，也就是一次只有一个线程执行；",[1212,24523,24524],{},"最后要 destroy lock，清理资源。",[1097,24526,21263],{},[1991,24528,24529],{},[1097,24530,24531,24532,1107],{},"OpenMP 锁把底层硬件原子指令包装成库函数，让程序员不用手写 ",[1071,24533,24534],{"code":24534},"amoswap",[1097,24536,24537],{},"但代价还是存在：临界区本质上是串行的。\n如果你的程序大量时间都在锁里面，就会被 Amdahl 定律卡住。",[1231,24539],{},[1092,24541,24543],{"id":24542},"第-161-页openmp-同步工具重要","第 161 页：OpenMP 同步工具，重要",[1097,24545,24546],{},"这一页列出 OpenMP 提供的更高级同步构造：",[2259,24548,24551],{"className":24549,"code":24550,"language":18502},[18500],"critical\natomic\nbarrier\nordered\n",[1071,24552,24550],{"__ignoreMap":2265},[1097,24554,24555],{},"它们通常用于高级并行编程。",[1097,24557,24558],{},"从第一性原理区分：",[982,24560,24561,24571],{},[985,24562,24563],{},[988,24564,24565,24568],{},[991,24566,24567],{},"构造",[991,24569,24570],{},"解决什么问题",[1001,24572,24573,24583,24593,24603],{},[988,24574,24575,24580],{},[1006,24576,24577],{},[1071,24578,24579],{"code":24579},"critical",[1006,24581,24582],{},"让一段代码一次只被一个线程执行",[988,24584,24585,24590],{},[1006,24586,24587],{},[1071,24588,24589],{"code":24589},"atomic",[1006,24591,24592],{},"让一次简单内存更新变成原子操作",[988,24594,24595,24600],{},[1006,24596,24597],{},[1071,24598,24599],{"code":24599},"barrier",[1006,24601,24602],{},"所有线程到齐后才能继续",[988,24604,24605,24610],{},[1006,24606,24607],{},[1071,24608,24609],{"code":24609},"ordered",[1006,24611,24612],{},"在并行循环中按原始迭代顺序执行某段代码",[1097,24614,24615],{},"举例：",[2259,24617,24620],{"className":24618,"code":24619,"language":2768,"meta":2265},[2766],"#pragma omp critical\n{\n    pi += sum[id];\n}\n",[1071,24621,24619],{"__ignoreMap":2265},[1097,24623,24624],{},"保证这段一次只有一个线程进来。",[2259,24626,24629],{"className":24627,"code":24628,"language":2768,"meta":2265},[2766],"#pragma omp atomic\nsum += x;\n",[1071,24630,24628],{"__ignoreMap":2265},[1097,24632,24633],{},"适合简单的共享变量更新。",[2259,24635,24638],{"className":24636,"code":24637,"language":2768,"meta":2265},[2766],"#pragma omp barrier\n",[1071,24639,24637],{"__ignoreMap":2265},[1097,24641,24642],{},"所有线程都等到这里，再一起往后走。",[1097,24644,24645,24646,24648],{},"考试一般不会深入 ",[1071,24647,24609],{"code":24609},"，但要知道它和顺序有关。",[1231,24650],{},[1092,24652,24654],{"id":24653},"第-162-页openmp-critical-section最重要","第 162 页：OpenMP Critical Section，最重要",[1097,24656,24657],{},"这一页把上一节 π 的例子修好：",[2259,24659,24662],{"className":24660,"code":24661,"language":2768,"meta":2265},[2766],"#pragma omp parallel\n{\n    int id = omp_get_thread_num();\n\n    for (int i = id; i \u003C num_steps; i += NUM_THREADS) {\n        double x = (i + 0.5) * step;\n        sum[id] += 4.0 * step \u002F (1.0 + x * x);\n    }\n\n    #pragma omp critical\n    pi += sum[id];\n}\n",[1071,24663,24661],{"__ignoreMap":2265},[1097,24665,24666,24667,24669],{},"这里 ",[1071,24668,23408],{"code":23408}," 是每个线程自己的局部结果，所以前面的循环可以并行。\n最后：",[2259,24671,24673],{"className":24672,"code":23886,"language":2768,"meta":2265},[2766],[1071,24674,23886],{"__ignoreMap":2265},[1097,24676,24677,24678,24680],{},"会更新共享变量 ",[1071,24679,23565],{"code":23565},"，因此必须保护起来。",[1097,24682,24683,24686],{},[1071,24684,24685],{"code":24685},"#pragma omp critical"," 的作用是：",[1991,24688,24689],{},[1097,24690,24691],{},"让下面这条语句同一时刻只被一个线程执行。",[1097,24693,21263],{},[1991,24695,24696],{},[1097,24697,24698],{},"临界区是把“不安全的共享写”包成“串行执行的一小段”。",[1097,24700,24701],{},"不过注意一个性能点：",[1097,24703,24704,24705,24708],{},"如果 1000 个线程都要进入 critical，最后这 1000 次 ",[1071,24706,24707],{"code":24707},"pi += sum[id]"," 还是排队执行。\n所以 critical 能保证正确性，但可能牺牲并行性能。",[1097,24710,24711],{},"在这个求 π 例子中，更好的写法通常是：",[2259,24713,24716],{"className":24714,"code":24715,"language":2768,"meta":2265},[2766],"#pragma omp parallel for reduction(+:pi)\n",[1071,24717,24715],{"__ignoreMap":2265},[1097,24719,24720],{},"因为 reduction 可以让每个线程局部累加，最后高效合并。\n所以考试可以这样比较：",[982,24722,24723,24735],{},[985,24724,24725],{},[988,24726,24727,24729,24732],{},[991,24728,19064],{},[991,24730,24731],{},"正确性",[991,24733,24734],{},"性能",[1001,24736,24737,24751,24763],{},[988,24738,24739,24745,24748],{},[1006,24740,24741,24742],{},"不同步直接 ",[1071,24743,24744],{"code":24744},"pi += ...",[1006,24746,24747],{},"错，data race",[1006,24749,24750],{},"看起来快但结果不可靠",[988,24752,24753,24757,24760],{},[1006,24754,24755],{},[1071,24756,24579],{"code":24579},[1006,24758,24759],{},"正确",[1006,24761,24762],{},"可能串行瓶颈",[988,24764,24765,24769,24771],{},[1006,24766,24767],{},[1071,24768,23253],{"code":23253},[1006,24770,24759],{},[1006,24772,24773],{},"通常更高效",[1231,24775],{},[1092,24777,24779],{"id":24778},"第-163-页死锁的麻烦重要","第 163 页：死锁的麻烦，重要",[1097,24781,24782],{},"这一页用两个厨师共用厨房讲死锁。",[1097,24784,24785],{},"两个厨师都需要盐和胡椒：",[2259,24787,24790],{"className":24788,"code":24789,"language":18502},[18500],"厨师 A 拿了盐，等胡椒\n厨师 B 拿了胡椒，等盐\n",[1071,24791,24789],{"__ignoreMap":2265},[1097,24793,23473],{},[2259,24795,24798],{"className":24796,"code":24797,"language":18502},[18500],"A 等 B 放下胡椒\nB 等 A 放下盐\n两个人都不动\n",[1071,24799,24797],{"__ignoreMap":2265},[1097,24801,24802],{},"这就是死锁。",[1097,24804,21263],{},[1991,24806,24807],{},[1097,24808,24809],{},"每个线程都占有一部分资源，同时等待另一个线程释放资源，导致所有人都无法前进。",[1097,24811,24812],{},"课件说死锁在并行程序中是可能的，而且很难调试。",[1097,24814,24815],{},"为什么难调试？",[1097,24817,24818],{},"因为它依赖时机。\n程序可能跑 100 次都没事，第 101 次刚好线程交错顺序变了，就卡死。\n调试器一开，时序变了，bug 还可能消失。并行 bug 很会装乖。",[1231,24820],{},[1092,24822,24824],{"id":24823},"第-164-页deadlock-定义与哲学家就餐问题必须掌握","第 164 页：Deadlock 定义与哲学家就餐问题，必须掌握",[1097,24826,24827],{},"课件定义：",[1991,24829,24830],{},[1097,24831,24832],{},"Deadlock：一种不可能有任何进展的系统状态。",[1097,24834,24835,24836,6178],{},"然后给出经典 ",[1104,24837,24838],{},"Dining Philosophers，用餐哲学家问题",[1097,24840,24841],{},"每个哲学家重复：",[1209,24843,24844,24847,24850,24853,24856,24859],{},[1212,24845,24846],{},"等左边叉子可用，拿起左叉；",[1212,24848,24849],{},"等右边叉子可用，拿起右叉；",[1212,24851,24852],{},"拿到两把叉子后吃饭；",[1212,24854,24855],{},"放下右叉；",[1212,24857,24858],{},"放下左叉；",[1212,24860,24861],{},"重复。",[1097,24863,24864],{},"如果所有哲学家同时拿起左叉，就会变成：",[2259,24866,24869],{"className":24867,"code":24868,"language":18502},[18500],"每个人手里都有左叉\n每个人都在等右叉\n没有人能吃饭\n没有人会放下叉子\n",[1071,24870,24868],{"__ignoreMap":2265},[1097,24872,24873],{},"系统完全停止进展。",[1097,24875,24876],{},"第一性原理上，死锁通常需要四个条件同时成立：",[982,24878,24879,24888],{},[985,24880,24881],{},[988,24882,24883,24886],{},[991,24884,24885],{},"条件",[991,24887,3185],{},[1001,24889,24890,24898,24906,24914],{},[988,24891,24892,24895],{},[1006,24893,24894],{},"互斥 mutual exclusion",[1006,24896,24897],{},"资源一次只能被一个线程占用",[988,24899,24900,24903],{},[1006,24901,24902],{},"持有并等待 hold and wait",[1006,24904,24905],{},"拿着一个资源，同时等另一个资源",[988,24907,24908,24911],{},[1006,24909,24910],{},"不可抢占 no preemption",[1006,24912,24913],{},"别人不能强行抢走你持有的资源",[988,24915,24916,24919],{},[1006,24917,24918],{},"循环等待 circular wait",[1006,24920,24921],{},"A 等 B，B 等 C，C 又等 A",[1097,24923,24924],{},"课件没有显式列四条件，但理解这四点很有用。解决死锁，本质上就是破坏其中一个条件。",[1097,24926,24927],{},"常见解决方法：",[1209,24929,24930,24936,24942,24948],{},[1212,24931,24932,24935],{},[1104,24933,24934],{},"固定加锁顺序","\n所有人都先拿编号小的锁，再拿编号大的锁。这样不会形成循环等待。",[1212,24937,24938,24941],{},[1104,24939,24940],{},"一次性申请全部资源","\n要么全拿到，要么一个都不拿。",[1212,24943,24944,24947],{},[1104,24945,24946],{},"try-lock + 失败释放","\n拿不到第二个锁，就放下第一个，稍后重试。",[1212,24949,24950,24953],{},[1104,24951,24952],{},"限制并发数量","\n比如 5 个哲学家只允许 4 个同时尝试拿叉子。",[1097,24955,24956],{},"考试问“如何避免哲学家就餐死锁”，答“统一资源获取顺序”最稳。",[1231,24958],{},[1092,24960,24962],{"id":24961},"第-165-页用-openmp-做矩阵乘法重要","第 165 页：用 OpenMP 做矩阵乘法，重要",[1097,24964,24965],{},"这一页回到矩阵乘法，用 OpenMP 并行化：",[2259,24967,24970],{"className":24968,"code":24969,"language":2768,"meta":2265},[2766],"\u002F\u002F C[M][N] = A[M][P] × B[P][N]\n\n#pragma omp parallel for private(tmp, j, k)\nfor (i = 0; i \u003C M; i++) {\n    for (j = 0; j \u003C N; j++) {\n        tmp = 0.0;\n        for (k = 0; k \u003C P; k++) {\n            tmp += A[i][k] * B[k][j];\n        }\n        C[i][j] = tmp;\n    }\n}\n",[1071,24971,24969],{"__ignoreMap":2265},[1097,24973,24974,24975,24977],{},"第一性原理分析：为什么这里可以并行外层 ",[1071,24976,1439],{"code":1439},"？",[1097,24979,22559,24980,24982],{},[1071,24981,1439],{"code":1439}," 对应 C 的一整行：",[2259,24984,24987],{"className":24985,"code":24986,"language":18502},[18500],"线程 0 算 C 的某些行\n线程 1 算 C 的另一些行\n",[1071,24988,24986],{"__ignoreMap":2265},[1097,24990,24991,24992,24995,24996,24998],{},"不同线程写的是不同的 ",[1071,24993,24994],{"code":24994},"C[i][j]","，没有两个线程同时写同一个 C 元素。\n因此不需要给每个 ",[1071,24997,24994],{"code":24994}," 加锁。",[1097,25000,25001],{},"这是非常重要的并行编程直觉：",[1991,25003,25004],{},[1097,25005,25006],{},"最好的同步，是通过任务划分避免同步。",[1097,25008,25009],{},"如果每个线程负责不同数据区域，就没有共享写冲突。\n锁不是越多越安全，锁多了性能会被串行化。",[1097,25011,24666,25012,25015],{},[1071,25013,25014],{"code":25014},"private(tmp, j, k)"," 也很关键：",[2284,25017,25018,25024,25031,25038],{},[1212,25019,25020,25023],{},[1071,25021,25022],{"code":25022},"tmp"," 必须 private，因为每个线程都要独立累加自己的 (C_)；",[1212,25025,25026,22210,25028,25030],{},[1071,25027,1442],{"code":1442},[1071,25029,1453],{"code":1453}," 是循环局部控制变量，也应避免线程共享造成混乱；",[1212,25032,25033,22210,25035,25037],{},[1071,25034,1337],{"code":1337},[1071,25036,1343],{"code":1343}," 是只读共享，没问题；",[1212,25039,25040,25042],{},[1071,25041,1330],{"code":1330}," 是共享数组，但每个线程写不同位置，所以可以。",[1231,25044],{},[1092,25046,25048],{"id":25047},"第-166-页矩阵乘法还能怎么优化重要度中等","第 166 页：矩阵乘法还能怎么优化，重要度中等",[1097,25050,25051],{},"这一页说 OpenMP 并行不是终点，还可以继续优化：",[1209,25053,25054,25072,25078],{},[1212,25055,25056,13179,25059,13179,25064,13179,25066,25071],{},[1104,25057,25058],{},"编译器优化",[1104,25060,25061],{},[1071,25062,25063],{"code":25063},"-O2",[1104,25065,3469],{},[1104,25067,25068],{},[1071,25069,25070],{"code":25070},"-O3","\n减少执行指令数量，做循环优化、寄存器分配等。",[1212,25073,25074,25077],{},[1104,25075,25076],{},"缓存分块 blocking","\n提高 cache 命中，减少 DRAM 访问。",[1212,25079,25080,25083],{},[1104,25081,25082],{},"利用 SIMD AVX 指令","\n提高浮点运算率，也就是利用 DLP。",[1097,25085,21263],{},[1991,25087,25088],{},[1097,25089,25090],{},"OpenMP 主要利用 MIMD\u002FTLP，也就是多个核心并行算不同工作。\n但单个线程内部仍然可以用 SIMD 和 cache blocking 提速。",[1097,25092,25093],{},"所以完整高性能矩阵乘法通常是多层优化：",[2259,25095,25098],{"className":25096,"code":25097,"language":18502},[18500],"线程级并行：OpenMP 分行\u002F分块给多个核心\n数据级并行：每个核心内部用 SIMD\u002FAVX\n缓存优化：blocking 提高数据复用\n编译器优化：减少指令开销\n",[1071,25099,25097],{"__ignoreMap":2265},[1097,25101,25102],{},"也就是前面几章最后合体：",[1304,25104,25106],{"className":25105},[1307],[1304,25107,25109,25221],{"className":25108},[1311],[1304,25110,25112],{"className":25111},[1315],[1317,25113,25114],{"xmlns":1319,"display":1320},[1322,25115,25116,25218],{},[1325,25117,25118,25120,25122,25124,25126,25128,25130,25132,25134,25136,25138,25140,25142,25144,25147,25149,25151,25153,25155,25157,25159,25161,25164,25166,25168,25170,25172,25174,25176,25178,25180,25182,25184,25186,25188,25190,25192,25194,25196,25198,25200,25202,25204,25206,25208,25210,25212,25214,25216],{},[1328,25119,19874],{},[1328,25121,2520],{},[1328,25123,2526],{},[1332,25125,3464],{},[1328,25127,20639],{},[1328,25129,2520],{},[1328,25131,2526],{},[1332,25133,3464],{},[1328,25135,13579],{},[1328,25137,2814],{},[1328,25139,4970],{},[1328,25141,14534],{},[1328,25143,2833],{},[1328,25145,25146],{},"y",[3995,25148,7582],{},[1328,25150,2523],{},[1328,25152,1097],{},[1328,25154,2549],{},[1328,25156,1439],{},[1328,25158,4970],{},[1328,25160,1439],{},[1328,25162,25163],{},"z",[1328,25165,2830],{},[1328,25167,2549],{},[1328,25169,1439],{},[1328,25171,14534],{},[1328,25173,2817],{},[1332,25175,3464],{},[1328,25177,1330],{},[1328,25179,14534],{},[1328,25181,4970],{},[1328,25183,1097],{},[1328,25185,1439],{},[1328,25187,10533],{},[1328,25189,2814],{},[1328,25191,2833],{},[3995,25193,7582],{},[1328,25195,2523],{},[1328,25197,1097],{},[1328,25199,2549],{},[1328,25201,1439],{},[1328,25203,4970],{},[1328,25205,1439],{},[1328,25207,25163],{},[1328,25209,2830],{},[1328,25211,2549],{},[1328,25213,1439],{},[1328,25215,14534],{},[1328,25217,2817],{},[1345,25219,25220],{"encoding":1347},"TLP + DLP + Memory\\ Optimization + Compiler\\ Optimization",[1304,25222,25224,25248,25272,25336],{"className":25223,"ariaHidden":1353},[1352],[1304,25225,25227,25230,25233,25236,25239,25242,25245],{"className":25226},[1357],[1304,25228],{"className":25229,"style":1387},[1361],[1304,25231,19874],{"className":25232,"style":2573},[1366,1367],[1304,25234,2520],{"className":25235},[1366,1367],[1304,25237,2526],{"className":25238,"style":2573},[1366,1367],[1304,25240],{"className":25241,"style":1394},[1372],[1304,25243,3464],{"className":25244},[1398],[1304,25246],{"className":25247,"style":1394},[1372],[1304,25249,25251,25254,25257,25260,25263,25266,25269],{"className":25250},[1357],[1304,25252],{"className":25253,"style":1387},[1361],[1304,25255,20639],{"className":25256,"style":2581},[1366,1367],[1304,25258,2520],{"className":25259},[1366,1367],[1304,25261,2526],{"className":25262,"style":2573},[1366,1367],[1304,25264],{"className":25265,"style":1394},[1372],[1304,25267,3464],{"className":25268},[1398],[1304,25270],{"className":25271,"style":1394},[1372],[1304,25273,25275,25278,25281,25284,25287,25291,25294,25297,25300,25304,25308,25312,25315,25318,25321,25324,25327,25330,25333],{"className":25274},[1357],[1304,25276],{"className":25277,"style":4160},[1361],[1304,25279,13579],{"className":25280,"style":1891},[1366,1367],[1304,25282,2814],{"className":25283},[1366,1367],[1304,25285,4970],{"className":25286},[1366,1367],[1304,25288,25290],{"className":25289,"style":2581},[1366,1367],"or",[1304,25292,25146],{"className":25293,"style":13731},[1366,1367],[1304,25295,7582],{"className":25296},[1372],[1304,25298,2523],{"className":25299,"style":2581},[1366,1367],[1304,25301,25303],{"className":25302},[1366,1367],"pt",[1304,25305,25307],{"className":25306},[1366,1367],"imi",[1304,25309,25163],{"className":25310,"style":25311},[1366,1367],"margin-right:0.044em;",[1304,25313,2830],{"className":25314},[1366,1367],[1304,25316,2549],{"className":25317},[1366,1367],[1304,25319,1439],{"className":25320},[1366,1367],[1304,25322,14534],{"className":25323},[1366,1367],[1304,25325,2817],{"className":25326},[1366,1367],[1304,25328],{"className":25329,"style":1394},[1372],[1304,25331,3464],{"className":25332},[1398],[1304,25334],{"className":25335,"style":1394},[1372],[1304,25337,25339,25342,25345,25348,25351,25354,25357,25360,25364,25367,25370,25373,25376,25379,25382,25385,25388,25391],{"className":25338},[1357],[1304,25340],{"className":25341,"style":3488},[1361],[1304,25343,1330],{"className":25344,"style":1368},[1366,1367],[1304,25346,14534],{"className":25347},[1366,1367],[1304,25349,4970],{"className":25350},[1366,1367],[1304,25352,1097],{"className":25353},[1366,1367],[1304,25355,1439],{"className":25356},[1366,1367],[1304,25358,10533],{"className":25359,"style":10717},[1366,1367],[1304,25361,25363],{"className":25362,"style":2581},[1366,1367],"er",[1304,25365,7582],{"className":25366},[1372],[1304,25368,2523],{"className":25369,"style":2581},[1366,1367],[1304,25371,25303],{"className":25372},[1366,1367],[1304,25374,25307],{"className":25375},[1366,1367],[1304,25377,25163],{"className":25378,"style":25311},[1366,1367],[1304,25380,2830],{"className":25381},[1366,1367],[1304,25383,2549],{"className":25384},[1366,1367],[1304,25386,1439],{"className":25387},[1366,1367],[1304,25389,14534],{"className":25390},[1366,1367],[1304,25392,2817],{"className":25393},[1366,1367],[1097,25395,25396],{},"这页非常适合作为整份课件的综合题。",[1231,25398],{},[1092,25400,25402],{"id":25401},"第-167-页小结重要","第 167 页：小结，重要",[1097,25404,25405],{},"最后一页总结整份课件：",[1209,25407,25408,25413,25418,25424,25430,25435,25441],{},[1212,25409,25410,3279],{},[1104,25411,25412],{},"顺序软件执行速度有限",[1212,25414,25415,3279],{},[1104,25416,25417],{},"并行处理是获得更高性能的重要途径",[1212,25419,25420,25423],{},[1104,25421,25422],{},"SIMD 是数据级并行","，现代高性能 CPU 基本都有，编译器部分支持；",[1212,25425,25426,25429],{},[1104,25427,25428],{},"MIMD 是线程级并行","，多核处理器和操作系统支持，但单程序利用它通常需要程序员介入，比如 OpenMP；",[1212,25431,25432,3279],{},[1104,25433,25434],{},"SIMD + MIMD 才能实现最大性能",[1212,25436,25437,25440],{},[1104,25438,25439],{},"ILP 是指令级并行","，VLIW 是其中一种，在 DSP 中较常见，通用处理器中已经较少使用；",[1212,25442,25443,25446],{},[1104,25444,25445],{},"同步需要硬件支持","，通常通过更高级别工具使用，同时要小心死锁。",[1097,25448,25449],{},"这一页的第一性原理总结可以这样说：",[1991,25451,25452],{},[1097,25453,25454],{},"性能来自并行，但正确性来自同步。\n没有并行，程序慢；没有同步，程序错；同步太多，程序又会慢。\n并行编程的艺术就是在“快”和“对”之间找平衡。",[1231,25456],{},[1092,25458,25459],{"id":25459},"这一板块的考试抓手",[982,25461,25462,25473],{},[985,25463,25464],{},[988,25465,25466,25468,25470],{},[991,25467,7454],{},[991,25469,996],{},[991,25471,25472],{},"内容",[1001,25474,25475,25486,25504,25517,25530,25540,25551,25561],{},[988,25476,25477,25480,25483],{},[1006,25478,25479],{},"★★★★★",[1006,25481,25482],{},"152",[1006,25484,25485],{},"data race 定义：同一位置、不同线程、至少一个写、无同步",[988,25487,25488,25490,25493],{},[1006,25489,25479],{},[1006,25491,25492],{},"153–155",[1006,25494,25495,25496,25499,25500,25503],{},"为什么普通 ",[1071,25497,25498],{"code":25498},"while(lock)"," + ",[1071,25501,25502],{"code":25502},"lock=1"," 不能实现锁",[988,25505,25506,25508,25511],{},[1006,25507,25479],{},[1006,25509,25510],{},"156–159",[1006,25512,25513,25514,25516],{},"原子操作、AMO、RISC-V ",[1071,25515,24534],{"code":24534}," 实现锁",[988,25518,25519,25521,25524],{},[1006,25520,25479],{},[1006,25522,25523],{},"162",[1006,25525,25526,25527,25529],{},"OpenMP ",[1071,25528,24579],{"code":24579}," 保护共享更新",[988,25531,25532,25534,25537],{},[1006,25533,25479],{},[1006,25535,25536],{},"163–164",[1006,25538,25539],{},"deadlock 定义、哲学家就餐、避免方法",[988,25541,25542,25545,25548],{},[1006,25543,25544],{},"★★★★☆",[1006,25546,25547],{},"160–161",[1006,25549,25550],{},"OpenMP lock \u002F critical \u002F atomic \u002F barrier",[988,25552,25553,25555,25558],{},[1006,25554,25544],{},[1006,25556,25557],{},"165",[1006,25559,25560],{},"OpenMP 矩阵乘法如何避免共享写冲突",[988,25562,25563,25566,25569],{},[1006,25564,25565],{},"★★★☆☆",[1006,25567,25568],{},"166–167",[1006,25570,25571],{},"综合优化：OpenMP + blocking + SIMD",[1231,25573],{},[1092,25575,23800],{"id":25576},"最值得背的几句话-1",[1991,25578,25579],{},[1097,25580,25581],{},"Data race：不同线程访问同一内存位置，至少一个是写，并且没有同步约束顺序。",[1991,25583,25584],{},[1097,25585,25586],{},"锁用于实现互斥，保证同一时刻只有一个线程进入临界区。",[1991,25588,25589],{},[1097,25590,25591],{},"普通 load + store 不能正确实现锁，因为“检查锁”和“设置锁”不是原子操作。",[1991,25593,25594],{},[1097,25595,25596],{},"正确的锁需要硬件原子指令，例如 atomic swap \u002F AMO \u002F test-and-set。",[1991,25598,25599],{},[1097,25600,25601,25603],{},[1071,25602,24685],{"code":24685}," 可以保证一段代码一次只被一个线程执行，但可能降低并行性能。",[1991,25605,25606],{},[1097,25607,25608],{},"死锁是系统无法继续前进的状态，常见原因是线程持有一个资源并等待另一个资源，形成循环等待。",[1991,25610,25611],{},[1097,25612,25613],{},"最好的同步往往是通过合理划分数据，避免多个线程写同一个位置。",[1991,25615,25616],{},[1097,25617,25618],{},"高性能程序通常要同时利用 TLP\u002FOpenMP、DLP\u002FSIMD、cache blocking 和编译器优化。",[1231,25620],{},[1087,25622,25623],{"id":25623},"全章总逻辑与世界观",[1097,25625,25626],{},"可以把这份课件理解成一条非常清晰的主线：",[1991,25628,25629],{},[1097,25630,25631],{},[1104,25632,25633],{},"顺序执行性能遇到极限 → 寻找程序中的并行性 → 在不同硬件层次利用并行性 → 用编程模型表达并行性 → 用同步保证并行程序正确性。",[1097,25635,25636],{},"也就是说，它不是“并行技术大杂烩”，而是在回答一个核心问题：",[1991,25638,25639],{},[1097,25640,25641],{},[1104,25642,25643],{},"现代计算机为什么必须并行？并行到底可以从哪些层次来获得？获得之后又会引入什么新问题？",[1231,25645],{},[1092,25647,25649],{"id":25648},"_1-全章的第一性原理性能来自更多有效工作单位时间","1. 全章的第一性原理：性能来自“更多有效工作\u002F单位时间”",[1097,25651,25652],{},"最底层的问题是性能：",[1304,25654,25656],{"className":25655},[1307],[1304,25657,25659,25683],{"className":25658},[1311],[1304,25660,25662],{"className":25661},[1315],[1317,25663,25664],{"xmlns":1319,"display":1320},[1322,25665,25666,25680],{},[1325,25667,25668,25670,25672],{},[3995,25669,24734],{},[1332,25671,5707],{},[2533,25673,25674,25677],{},[3995,25675,25676],{},"完成的有用工作",[3995,25678,25679],{},"时间",[1345,25681,25682],{"encoding":1347},"性能 \\approx \\frac{完成的有用工作}{时间}",[1304,25684,25686,25704],{"className":25685,"ariaHidden":1353},[1352],[1304,25687,25689,25692,25695,25698,25701],{"className":25688},[1357],[1304,25690],{"className":25691,"style":1362},[1361],[1304,25693,24734],{"className":25694},[1366,4044],[1304,25696],{"className":25697,"style":1373},[1372],[1304,25699,5707],{"className":25700},[1377],[1304,25702],{"className":25703,"style":1373},[1372],[1304,25705,25707,25710],{"className":25706},[1357],[1304,25708],{"className":25709,"style":4013},[1361],[1304,25711,25713,25716,25769],{"className":25712},[1366],[1304,25714],{"className":25715},[2611,2612],[1304,25717,25719],{"className":25718},[2533],[1304,25720,25722,25761],{"className":25721},[1502,1503],[1304,25723,25725,25758],{"className":25724},[1507],[1304,25726,25728,25739,25747],{"className":25727,"style":4032},[1511],[1304,25729,25730,25733],{"style":2628},[1304,25731],{"className":25732,"style":2632},[1519],[1304,25734,25736],{"className":25735},[1366],[1304,25737,25679],{"className":25738},[1366,4044],[1304,25740,25741,25744],{"style":2684},[1304,25742],{"className":25743,"style":2632},[1519],[1304,25745],{"className":25746,"style":2692},[2691],[1304,25748,25749,25752],{"style":2695},[1304,25750],{"className":25751,"style":2632},[1519],[1304,25753,25755],{"className":25754},[1366],[1304,25756,25676],{"className":25757},[1366,4044],[1304,25759,1540],{"className":25760},[1539],[1304,25762,25764],{"className":25763},[1507],[1304,25765,25767],{"className":25766,"style":4073},[1511],[1304,25768],{},[1304,25770],{"className":25771},[2749,2612],[1097,25773,25774],{},"单核时代主要靠三件事提高性能：",[1209,25776,25777,25783,25788],{},[1212,25778,25779,25782],{},[1104,25780,25781],{},"提高主频","：一个周期更短；",[1212,25784,25785,25787],{},[1104,25786,20231],{},"：每条指令平均用更少周期；",[1212,25789,25790,25793],{},[1104,25791,25792],{},"减少指令数","：编译器优化、算法优化。",[1097,25795,25796],{},"但这三条路都有限：",[2284,25798,25799,25802,25805],{},[1212,25800,25801],{},"主频受功耗和散热限制；",[1212,25803,25804],{},"单核流水线、乱序、超标量继续加复杂度，收益递减；",[1212,25806,25807],{},"程序本身有数据依赖、分支、内存访问，不能无限压缩。",[1097,25809,25810],{},"所以课件一开始讲 Amdahl 定律，本质是在告诉你：",[1991,25812,25813],{},[1097,25814,25815],{},[1104,25816,25817],{},"任何优化都只能作用在程序的一部分；不能被加速的部分会成为最终瓶颈。",[1097,25819,25820,25821],{},"这就是全章的地基。后面所有 SIMD、VLIW、多核、OpenMP、同步，都是在问：\n",[1104,25822,25823],{},"我们还能从哪里挖出可加速的部分？",[1097,25825,25826],{},"课件第 28–29 页已经把应用程序中的并行性分成三大类：DLP 数据级并行、ILP 指令级并行、TLP 线程\u002F任务级并行，并说明它们分别受内存带宽、数据\u002F控制依赖、通信\u002F同步开销限制。",[1231,25828],{},[1092,25830,25832],{"id":25831},"_2-第-01-模块提出问题建立地图","2. 第 0、1 模块：提出问题，建立地图",[1097,25834,25835,25836,1107],{},"第 0、1 模块不是技术细节，而是",[1104,25837,25838],{},"全章地图",[1097,25840,25841],{},"它做了三件事。",[1097,25843,25844],{},"第一，说明为什么需要并行。\nCPU 主频不能一直涨，单核越来越难靠频率和复杂度继续提升性能，所以并行处理成为继续提高速度的重要路径。",[1097,25846,25847],{},"第二，用矩阵乘法建立贯穿全章的例子。\n矩阵乘法非常适合当主线，因为它同时包含：",[2284,25849,25850,25853,25856,25859,25862,25865],{},[1212,25851,25852],{},"大量重复运算；",[1212,25854,25855],{},"大量独立数据；",[1212,25857,25858],{},"明显的内存访问问题；",[1212,25860,25861],{},"可以用 SIMD 优化；",[1212,25863,25864],{},"可以用 OpenMP 多线程优化；",[1212,25866,25867],{},"可以用 blocking 优化 cache。",[1097,25869,25870],{},"所以它不是随便选的例子，而是一个“并行优化样板间”。",[1097,25872,25873],{},"第三，用 Flynn 分类和 DLP\u002FILP\u002FTLP 把后面的章节排好队：",[982,25875,25876,25888],{},[985,25877,25878],{},[988,25879,25880,25882,25885],{},[991,25881,20367],{},[991,25883,25884],{},"第一性原理问题",[991,25886,25887],{},"后续模块",[1001,25889,25890,25900,25910],{},[988,25891,25892,25894,25897],{},[1006,25893,7351],{},[1006,25895,25896],{},"同一个操作能不能作用在多个数据上？",[1006,25898,25899],{},"数据级并行 \u002F SIMD",[988,25901,25902,25904,25907],{},[1006,25903,7359],{},[1006,25905,25906],{},"同一个线程里的多条指令能不能重叠？",[1006,25908,25909],{},"指令级并行 \u002F VLIW",[988,25911,25912,25914,25917],{},[1006,25913,7367],{},[1006,25915,25916],{},"多个线程\u002F任务能不能同时推进？",[1006,25918,25919],{},"线程级并行 \u002F 多核 \u002F SMT",[1097,25921,25922],{},"课件第 27 页强调 SIMD 和 MIMD 是现代体系结构中最常见的并行方式，而且通常存在于同一个系统中；SPMD 则是常见编程风格：多个处理器运行同一程序，处理不同数据，并用同步原语协调。",[1097,25924,25925],{},"所以第 0、1 模块的角色是：",[1991,25927,25928],{},[1097,25929,25930],{},[1104,25931,25932],{},"告诉你为什么要并行，以及并行性大致分几层。",[1231,25934],{},[1092,25936,25938],{"id":25937},"_3-第-2-模块-dlp从一个操作一个数据变成一个操作多个数据","3. 第 2 模块 DLP：从“一个操作一个数据”变成“一个操作多个数据”",[1097,25940,25941],{},"数据级并行的第一性原理是：",[1991,25943,25944],{},[1097,25945,25946],{},"如果很多数据要做同一种操作，就不要一条一条算，而应该把它们打包一起算。",[1097,25948,8741],{},[2259,25950,25953],{"className":25951,"code":25952,"language":2768,"meta":2265},[2766],"c[i] = a[i] + b[i];\n",[1071,25954,25952],{"__ignoreMap":2265},[1097,25956,25957,25958,25960],{},"每个 ",[1071,25959,1439],{"code":1439}," 的操作相同，只是数据不同。\n这就天然适合 SIMD。",[1097,25962,25963],{},"所以 SIMD\u002FAVX 的本质不是“神奇指令”，而是：",[1991,25965,25966],{},[1097,25967,25968],{},[1104,25969,25970],{},"把多个数据 lane 放进一个宽寄存器，用一条指令同时操作这些 lane。",[1097,25972,25973],{},"这一模块先讲寄存器宽度，比如 256-bit AVX 可以放 4 个 double；然后讲 intrinsics；然后回到矩阵乘法，展示如何一次算多个 (C) 元素。",[1097,25975,25976],{},"但课件没有停在“SIMD 很快”这个浅层结论，而是继续追问：",[1991,25978,25979],{},[1097,25980,25981],{},"为什么用了 AVX 以后还远达不到理论峰值？",[1097,25983,25984],{},"于是引出两个更深的瓶颈：",[1209,25986,25987,25993],{},[1212,25988,25989,25992],{},[1104,25990,25991],{},"流水线\u002F指令依赖瓶颈","\n一个累加器连续依赖自己，CPU 流水线填不满，所以需要 loop unrolling，制造多个独立累加器。",[1212,25994,25995,25998],{},[1104,25996,25997],{},"内存层次瓶颈","\n大矩阵时，算得快不够，数据要能及时从 cache\u002FDRAM 喂进来，所以需要 blocking，提高数据复用。",[1097,26000,26001],{},"因此 DLP 模块的真正逻辑是：",[1304,26003,26005],{"className":26004},[1307],[1304,26006,26008,26091],{"className":26007},[1311],[1304,26009,26011],{"className":26010},[1315],[1317,26012,26013],{"xmlns":1319,"display":1320},[1322,26014,26015,26088],{},[1325,26016,26017,26019,26021,26023,26025,26027,26030,26032,26035,26037,26039,26041,26043,26045,26047,26049,26051,26053,26055,26057,26059,26061,26063,26065,26067,26070,26072,26074,26076,26078,26080,26082,26084,26086],{},[1328,26018,2529],{},[1328,26020,19889],{},[1328,26022,13579],{},[1328,26024,20639],{},[1332,26026,4761],{},[3995,26028,26029],{},"向量化",[1332,26031,4761],{},[3995,26033,26034],{},"发现流水线瓶颈",[1332,26036,4761],{},[1328,26038,10533],{},[1328,26040,14534],{},[1328,26042,14534],{},[1328,26044,1097],{},[3995,26046,7582],{},[1328,26048,3439],{},[1328,26050,2817],{},[1328,26052,2833],{},[1328,26054,14534],{},[1328,26056,10533],{},[1328,26058,10533],{},[1328,26060,1439],{},[1328,26062,2817],{},[1328,26064,14559],{},[1332,26066,4761],{},[3995,26068,26069],{},"发现内存瓶颈",[1332,26071,4761],{},[1328,26073,9960],{},[1328,26075,10533],{},[1328,26077,14534],{},[1328,26079,2768],{},[1328,26081,1453],{},[1328,26083,1439],{},[1328,26085,2817],{},[1328,26087,14559],{},[1345,26089,26090],{"encoding":1347},"SIMD \\rightarrow 向量化 \\rightarrow 发现流水线瓶颈 \\rightarrow loop\\ unrolling \\rightarrow 发现内存瓶颈 \\rightarrow blocking",[1304,26092,26094,26121,26139,26157,26208,26226],{"className":26093,"ariaHidden":1353},[1352],[1304,26095,26097,26100,26103,26106,26109,26112,26115,26118],{"className":26096},[1357],[1304,26098],{"className":26099,"style":1362},[1361],[1304,26101,2529],{"className":26102,"style":2588},[1366,1367],[1304,26104,19889],{"className":26105,"style":14630},[1366,1367],[1304,26107,13579],{"className":26108,"style":1891},[1366,1367],[1304,26110,20639],{"className":26111,"style":2581},[1366,1367],[1304,26113],{"className":26114,"style":1373},[1372],[1304,26116,4761],{"className":26117},[1377],[1304,26119],{"className":26120,"style":1373},[1372],[1304,26122,26124,26127,26130,26133,26136],{"className":26123},[1357],[1304,26125],{"className":26126,"style":1362},[1361],[1304,26128,26029],{"className":26129},[1366,4044],[1304,26131],{"className":26132,"style":1373},[1372],[1304,26134,4761],{"className":26135},[1377],[1304,26137],{"className":26138,"style":1373},[1372],[1304,26140,26142,26145,26148,26151,26154],{"className":26141},[1357],[1304,26143],{"className":26144,"style":1362},[1361],[1304,26146,26034],{"className":26147},[1366,4044],[1304,26149],{"className":26150,"style":1373},[1372],[1304,26152,4761],{"className":26153},[1377],[1304,26155],{"className":26156,"style":1373},[1372],[1304,26158,26160,26163,26166,26169,26172,26175,26178,26181,26184,26187,26190,26193,26196,26199,26202,26205],{"className":26159},[1357],[1304,26161],{"className":26162,"style":3488},[1361],[1304,26164,10533],{"className":26165,"style":10717},[1366,1367],[1304,26167,14652],{"className":26168},[1366,1367],[1304,26170,1097],{"className":26171},[1366,1367],[1304,26173,7582],{"className":26174},[1372],[1304,26176,3439],{"className":26177},[1366,1367],[1304,26179,2817],{"className":26180},[1366,1367],[1304,26182,2833],{"className":26183,"style":2581},[1366,1367],[1304,26185,14534],{"className":26186},[1366,1367],[1304,26188,10533],{"className":26189,"style":10717},[1366,1367],[1304,26191,10533],{"className":26192,"style":10717},[1366,1367],[1304,26194,14680],{"className":26195},[1366,1367],[1304,26197,14559],{"className":26198,"style":13731},[1366,1367],[1304,26200],{"className":26201,"style":1373},[1372],[1304,26203,4761],{"className":26204},[1377],[1304,26206],{"className":26207,"style":1373},[1372],[1304,26209,26211,26214,26217,26220,26223],{"className":26210},[1357],[1304,26212],{"className":26213,"style":1362},[1361],[1304,26215,26069],{"className":26216},[1366,4044],[1304,26218],{"className":26219,"style":1373},[1372],[1304,26221,4761],{"className":26222},[1377],[1304,26224],{"className":26225,"style":1373},[1372],[1304,26227,26229,26232,26235,26238,26241,26244,26247],{"className":26228},[1357],[1304,26230],{"className":26231,"style":3488},[1361],[1304,26233,9960],{"className":26234},[1366,1367],[1304,26236,10533],{"className":26237,"style":10717},[1366,1367],[1304,26239,14708],{"className":26240},[1366,1367],[1304,26242,1453],{"className":26243,"style":1594},[1366,1367],[1304,26245,14680],{"className":26246},[1366,1367],[1304,26248,14559],{"className":26249,"style":13731},[1366,1367],[1097,26251,26252],{},"这一模块在全章中的作用是：",[1991,26254,26255],{},[1097,26256,26257],{},[1104,26258,26259],{},"证明“并行”不只是多核。单个核心内部也有大量数据级并行，但要受指令依赖和内存层次限制。",[1231,26261],{},[1092,26263,26265],{"id":26264},"_4-第-3-模块-ilp从数据并行转向指令并行","4. 第 3 模块 ILP：从“数据并行”转向“指令并行”",[1097,26267,26268],{},"ILP 的第一性原理是：",[1991,26270,26271],{},[1097,26272,26273],{},"如果同一个线程中的多条指令互不依赖，就可以重叠执行。",[1097,26275,8741],{},[2259,26277,26280],{"className":26278,"code":26279,"language":2768,"meta":2265},[2766],"a = b + c;\nd = e + f;\n",[1071,26281,26279],{"__ignoreMap":2265},[1097,26283,26284],{},"这两条没有依赖，可以并行。\n但如果是：",[2259,26286,26289],{"className":26287,"code":26288,"language":2768,"meta":2265},[2766],"a = b + c;\nd = a + f;\n",[1071,26290,26288],{"__ignoreMap":2265},[1097,26292,26293],{},"第二条依赖第一条结果，就不能随便并行。",[1097,26295,26296],{},"所以 ILP 模块研究的是：",[1991,26298,26299],{},[1097,26300,26301],{},[1104,26302,26303],{},"在一个线程内部，机器或编译器能挖出多少独立指令？",[1097,26305,26306],{},"这里出现两条路线：",[982,26308,26309,26319],{},[985,26310,26311],{},[988,26312,26313,26315,26317],{},[991,26314,18195],{},[991,26316,18198],{},[991,26318,18201],{},[1001,26320,26321,26331],{},[988,26322,26323,26326,26329],{},[1006,26324,26325],{},"硬件动态调度",[1006,26327,26328],{},"CPU 运行时找",[1006,26330,18335],{},[988,26332,26333,26336,26338],{},[1006,26334,26335],{},"编译器静态调度",[1006,26337,18361],{},[1006,26339,18225],{},[1097,26341,26342],{},"VLIW 的第一性原理是：\n既然硬件动态找并行很复杂，那就让编译器提前把多个操作打包到一条很长的指令中。",[1097,26344,26345],{},"课件第 64–66 页说 VLIW 把多个操作打包到一条指令中，每个操作槽对应固定功能单元，编译器负责调度操作、保证指令内并行性并避免数据冒险。",[1097,26347,26348],{},"但是这个模块后半部分又在拆 VLIW 的台：",[2284,26350,26351,26354,26357,26360,26363],{},[1212,26352,26353],{},"分支不可预测；",[1212,26355,26356],{},"cache miss 不可预测；",[1212,26358,26359],{},"内存访问延迟不固定；",[1212,26361,26362],{},"编译器难以静态知道一切；",[1212,26364,26365],{},"代码量可能爆炸。",[1097,26367,26368],{},"所以 ILP 模块的逻辑是：",[1304,26370,26372],{"className":26371},[1307],[1304,26373,26375,26419],{"className":26374},[1311],[1304,26376,26378],{"className":26377},[1315],[1317,26379,26380],{"xmlns":1319,"display":1320},[1322,26381,26382,26416],{},[1325,26383,26384,26387,26389,26392,26394,26396,26398,26400,26403,26406,26408,26411,26413],{},[3995,26385,26386],{},"单线程也有并行性",[1332,26388,4761],{},[3995,26390,26391],{},"可以由硬件或编译器挖掘",[1332,26393,4761],{},[1328,26395,14524],{},[1328,26397,2520],{},[1328,26399,19889],{},[1328,26401,26402],{},"W",[3995,26404,26405],{},"把压力交给编译器",[1332,26407,4761],{},[3995,26409,26410],{},"现实程序太动态",[1332,26412,4761],{},[3995,26414,26415],{},"静态调度有极限",[1345,26417,26418],{"encoding":1347},"单线程也有并行性 \\rightarrow 可以由硬件或编译器挖掘 \\rightarrow VLIW把压力交给编译器 \\rightarrow 现实程序太动态 \\rightarrow 静态调度有极限",[1304,26420,26422,26440,26458,26488,26506],{"className":26421,"ariaHidden":1353},[1352],[1304,26423,26425,26428,26431,26434,26437],{"className":26424},[1357],[1304,26426],{"className":26427,"style":1362},[1361],[1304,26429,26386],{"className":26430},[1366,4044],[1304,26432],{"className":26433,"style":1373},[1372],[1304,26435,4761],{"className":26436},[1377],[1304,26438],{"className":26439,"style":1373},[1372],[1304,26441,26443,26446,26449,26452,26455],{"className":26442},[1357],[1304,26444],{"className":26445,"style":1362},[1361],[1304,26447,26391],{"className":26448},[1366,4044],[1304,26450],{"className":26451,"style":1373},[1372],[1304,26453,4761],{"className":26454},[1377],[1304,26456],{"className":26457,"style":1373},[1372],[1304,26459,26461,26464,26467,26470,26473,26476,26479,26482,26485],{"className":26460},[1357],[1304,26462],{"className":26463,"style":1362},[1361],[1304,26465,14524],{"className":26466,"style":1394},[1366,1367],[1304,26468,2520],{"className":26469},[1366,1367],[1304,26471,19889],{"className":26472,"style":14630},[1366,1367],[1304,26474,26402],{"className":26475,"style":2573},[1366,1367],[1304,26477,26405],{"className":26478},[1366,4044],[1304,26480],{"className":26481,"style":1373},[1372],[1304,26483,4761],{"className":26484},[1377],[1304,26486],{"className":26487,"style":1373},[1372],[1304,26489,26491,26494,26497,26500,26503],{"className":26490},[1357],[1304,26492],{"className":26493,"style":1362},[1361],[1304,26495,26410],{"className":26496},[1366,4044],[1304,26498],{"className":26499,"style":1373},[1372],[1304,26501,4761],{"className":26502},[1377],[1304,26504],{"className":26505,"style":1373},[1372],[1304,26507,26509,26512],{"className":26508},[1357],[1304,26510],{"className":26511,"style":1362},[1361],[1304,26513,26415],{"className":26514},[1366,4044],[1097,26516,26517],{},"它在全章中的角色是：",[1991,26519,26520],{},[1097,26521,26522],{},[1104,26523,26524],{},"说明“单线程内部并行”已经被努力挖过了，但受依赖、分支、cache miss 限制，不能单靠 ILP 解决性能问题。",[1097,26526,26527],{},"这也为下一模块 TLP 铺垫：\n既然一个线程内部并行性有限，那就同时跑多个线程。",[1231,26529],{},[1092,26531,26533],{"id":26532},"_5-第-4-模块-tlp从一个线程更快转向多个线程一起跑","5. 第 4 模块 TLP：从“一个线程更快”转向“多个线程一起跑”",[1097,26535,26536],{},"TLP 的第一性原理是：",[1991,26538,26539],{},[1097,26540,26541],{},"一个线程被数据依赖、cache miss、分支卡住时，另一个线程可能还能继续执行。\n与其让硬件闲着，不如让多个线程共享或复制硬件资源。",[1097,26543,26544],{},"这一模块从多核讲到硬件线程，再讲 SMT\u002FHyperthreading。",[1097,26546,26547],{},"它有两个核心层次。",[978,26549,26551],{"id":26550},"第一层多核","第一层：多核",[1097,26553,26554],{},"多核的本质是：",[1991,26556,26557],{},[1097,26558,26559],{},[1104,26560,26561],{},"复制核心，让多个 PC、多个寄存器状态、多个执行路径同时推进多个指令流。",[1097,26563,26564],{},"这对应 MIMD：多个指令流，多个数据流。",[978,26566,26568],{"id":26567},"第二层硬件多线程-smt","第二层：硬件多线程 \u002F SMT",[1097,26570,26571],{},"SMT 的本质不是复制完整核心，而是：",[1991,26573,26574],{},[1097,26575,26576],{},[1104,26577,26578],{},"复制线程状态，复用同一个核心的执行资源。",[1097,26580,26581],{},"为什么有用？\n因为超标量核心很宽，单个线程经常填不满 issue slots。SMT 用另一个线程的指令去填空位。",[1097,26583,26584],{},"所以这模块的第一性原理可以概括成：",[982,26586,26587,26598],{},[985,26588,26589],{},[988,26590,26591,26593,26595],{},[991,26592,22165],{},[991,26594,22168],{},[991,26596,26597],{},"解决什么",[1001,26599,26600,26610,26620],{},[988,26601,26602,26604,26607],{},[1006,26603,20625],{},[1006,26605,26606],{},"复制执行核心",[1006,26608,26609],{},"真正同时跑多个线程",[988,26611,26612,26614,26617],{},[1006,26613,21403],{},[1006,26615,26616],{},"复制 PC\u002F寄存器等线程状态",[1006,26618,26619],{},"快速切换，隐藏延迟",[988,26621,26622,26625,26628],{},[1006,26623,26624],{},"SMT\u002F超线程",[1006,26626,26627],{},"多线程共享超标量资源",[1006,26629,26630],{},"填补执行槽空洞，提高吞吐",[1097,26632,26633],{},"课件第 91 页明确把改进性能总结成：提高时钟频率、降低 CPI、同时执行多个任务，并且最终要“高 (f_s)、SIMD、多并行任务”都做。",[1097,26635,26636],{},"TLP 模块在全章中的角色是：",[1991,26638,26639],{},[1097,26640,26641],{},[1104,26642,26643],{},"说明当单线程内部的 DLP\u002FILP 不够时，可以转向线程级并行，用多个核心或硬件线程提高吞吐。",[1097,26645,26646],{},"但它也埋下了新问题：\n多个线程如果共享内存，就会产生同步和数据竞争。",[1097,26648,26649],{},"这正好通向后面的 OpenMP 和同步。",[1231,26651],{},[1092,26653,26655],{"id":26654},"_6-第-5-模块-openmp从硬件能并行到程序员表达并行","6. 第 5 模块 OpenMP：从“硬件能并行”到“程序员表达并行”",[1097,26657,26658],{},"前面几个模块主要是硬件视角：机器有什么能力。\nOpenMP 模块切换到软件视角：",[1991,26660,26661],{},[1097,26662,26663],{},[1104,26664,26665],{},"硬件有多个核心，不代表 C 程序会自动利用多个核心。程序员必须表达哪些部分可以并行。",[1097,26667,26668],{},"OpenMP 的第一性原理是：",[1991,26670,26671],{},[1097,26672,26673],{},"对共享内存多核机器，用最小语法改动告诉编译器和运行时：这个循环可以拆给多个线程。",[1097,26675,8741],{},[2259,26677,26680],{"className":26678,"code":26679,"language":2768,"meta":2265},[2766],"#pragma omp parallel for\nfor (i = 0; i \u003C N; i++)\n    a[i] = 0;\n",[1071,26681,26679],{"__ignoreMap":2265},[1097,26683,26684],{},"这句话背后做的是：",[1209,26686,26687,26690,26693,26696,26699],{},[1212,26688,26689],{},"fork 出一组线程；",[1212,26691,26692],{},"把循环迭代分给线程；",[1212,26694,26695],{},"每个线程独立执行一部分；",[1212,26697,26698],{},"结束时 join；",[1212,26700,26701],{},"必要时 barrier 等待所有线程完成。",[1097,26703,26704,26705,26707,26708,26710],{},"课件第 134–136 页说明 OpenMP 是 C 扩展、多线程、共享内存并行，使用 ",[1071,26706,22726],{"code":22726}," 和运行时库；",[1071,26709,1073],{"code":1073}," 中循环外变量默认 shared，循环索引隐式 private，循环结束有隐式 barrier，并采用 fork-join 模型。",[1097,26712,26713],{},"这个模块最重要的不是 OpenMP 语法本身，而是它引出的三个软件并行核心问题：",[982,26715,26716,26726],{},[985,26717,26718],{},[988,26719,26720,26723],{},[991,26721,26722],{},"问题",[991,26724,26725],{},"第一性原理",[1001,26727,26728,26736,26744],{},[988,26729,26730,26733],{},[1006,26731,26732],{},"哪些循环能并行？",[1006,26734,26735],{},"迭代之间不能有危险依赖",[988,26737,26738,26741],{},[1006,26739,26740],{},"哪些变量 shared\u002Fprivate？",[1006,26742,26743],{},"共享变量可能被多个线程同时访问",[988,26745,26746,26749],{},[1006,26747,26748],{},"如何合并结果？",[1006,26750,26751],{},"局部结果需要 reduction",[1097,26753,26754],{},"所以 π 的例子很关键。\n它先展示“每个小区间可以独立计算”，再展示“最后求和会产生 race”，最后引出 reduction。",[1097,26756,26757],{},"OpenMP 模块在全章中的角色是：",[1991,26759,26760],{},[1097,26761,26762],{},[1104,26763,26764],{},"把硬件线程级并行变成程序员可用的编程模型。",[1097,26766,26767],{},"但它也自然暴露出：\n一旦多个线程共享变量，就需要同步。",[1231,26769],{},[1092,26771,26773],{"id":26772},"_7-第-6-模块同步从并行程序跑起来到并行程序跑得对","7. 第 6 模块同步：从“并行程序跑起来”到“并行程序跑得对”",[1097,26775,26776],{},"同步模块是全章的收口。",[1097,26778,26779],{},"前面所有并行技术都在追求“快”。\n最后这一章提醒你：",[1991,26781,26782],{},[1097,26783,26784],{},[1104,26785,26786],{},"并行程序如果没有同步，快也可能是错的。",[1097,26788,26789],{},"同步的第一性原理是：",[1991,26791,26792],{},[1097,26793,26794],{},"多个线程访问同一内存位置，至少一个写，并且没有确定顺序，结果就依赖调度时机。",[1097,26796,26797],{},"这就是 data race。",[1097,26799,26800],{},"要解决它，需要：",[1209,26802,26803,26809,26815,26821,26833],{},[1212,26804,26805,26808],{},[1104,26806,26807],{},"临界区 critical section","：一次只允许一个线程进入；",[1212,26810,26811,26814],{},[1104,26812,26813],{},"锁 lock","：控制进入临界区的资格；",[1212,26816,26817,26820],{},[1104,26818,26819],{},"原子操作 atomic\u002FAMO","：保证“检查并设置锁”不可分割；",[1212,26822,26823,26826,26827,22210,26829,22210,26831,3279],{},[1104,26824,26825],{},"高级同步工具","：OpenMP ",[1071,26828,24579],{"code":24579},[1071,26830,24589],{"code":24589},[1071,26832,24599],{"code":24599},[1212,26834,26835,26838],{},[1104,26836,26837],{},"避免死锁","：不要让线程形成循环等待。",[1097,26840,26841],{},"这一模块和硬件又接上了：\n锁看起来是软件概念，但正确实现锁需要硬件原子指令。普通 load\u002Fstore 不能保证“读锁”和“写锁”之间没人插队。",[1097,26843,26844],{},"课件最后总结说：顺序软件执行速度有限，并行处理是获得更高性能的重要途径；SIMD 是数据级并行，MIMD 是线程级并行，SIMD + MIMD 实现最大性能；ILP 中 VLIW 在 DSP 中较常见但通用处理器中较少使用；同步需要硬件支持，通常用高级工具，并且要小心死锁。",[1097,26846,26847],{},"所以同步模块在全章中的作用是：",[1991,26849,26850],{},[1097,26851,26852],{},[1104,26853,26854],{},"给并行性能加上正确性约束。",[1097,26856,26857],{},"没有同步，程序可能错。\n同步太多，程序又会慢。\n这就是并行编程的核心张力。",[1231,26859],{},[1092,26861,26863],{"id":26862},"_8-各模块之间的总逻辑","8. 各模块之间的总逻辑",[1097,26865,26866],{},"整份课件可以画成这样：",[2259,26868,26871],{"className":26869,"code":26870,"language":18502},[18500],"为什么要并行？\n    ↓\nAmdahl 定律：并行部分越多，理论加速越高，但顺序部分限制上限\n    ↓\n程序中有哪些并行性？\n    ↓\nDLP：同一操作，多份数据 → SIMD \u002F AVX \u002F blocking\n    ↓\nILP：同一线程，多条指令 → 流水线 \u002F 超标量 \u002F VLIW\n    ↓\nTLP：多个线程\u002F任务 → 多核 \u002F SMT \u002F Hyperthreading\n    ↓\n程序员如何使用 TLP？\n    ↓\nOpenMP：parallel for \u002F fork-join \u002F reduction\n    ↓\n并行之后如何保证正确？\n    ↓\n同步：data race \u002F lock \u002F atomic \u002F critical \u002F deadlock\n",[1071,26872,26870],{"__ignoreMap":2265},[1097,26874,26875],{},"这条线特别顺：",[2284,26877,26878,26884,26890,26896],{},[1212,26879,26880,26883],{},[1104,26881,26882],{},"第 0、1 模块","：提出问题，分类并行；",[1212,26885,26886,26889],{},[1104,26887,26888],{},"第 2、3、4 模块","：分别讲硬件层面的 DLP、ILP、TLP；",[1212,26891,26892,26895],{},[1104,26893,26894],{},"第 5 模块","：讲软件如何调用 TLP；",[1212,26897,26898,26901],{},[1104,26899,26900],{},"第 6 模块","：讲调用 TLP 后如何保证共享内存正确性。",[1231,26903],{},[1092,26905,26907],{"id":26906},"_9-这章真正想让你形成的世界观","9. 这章真正想让你形成的世界观",[1097,26909,26910],{},"这章不是让你背一堆名词，而是建立一个系统观：",[978,26912,26914],{"id":26913},"第一性能瓶颈会迁移","第一，性能瓶颈会迁移",[1097,26916,26917],{},"优化前，瓶颈可能是 Python 解释器。\n换 C 后，瓶颈变成没有 SIMD。\n用 AVX 后，瓶颈变成流水线依赖。\nunroll 后，瓶颈变成 cache\u002Fmemory。\nOpenMP 后，瓶颈可能变成同步和内存带宽。",[1097,26919,26920],{},"所以高性能优化不是“一招鲜”，而是不断问：",[1991,26922,26923],{},[1097,26924,26925],{},"当前最稀缺的资源是什么？",[1097,26927,26928],{},"是算力？寄存器？cache？内存带宽？线程数？同步时间？",[978,26930,26932],{"id":26931},"第二并行有层次不是只有多线程","第二，并行有层次，不是只有多线程",[1097,26934,26935],{},"同一个程序可以同时利用：",[2284,26937,26938,26941,26944,26947,26950],{},[1212,26939,26940],{},"ILP：流水线\u002F乱序\u002F指令调度；",[1212,26942,26943],{},"DLP：SIMD\u002FAVX；",[1212,26945,26946],{},"TLP：OpenMP 多线程；",[1212,26948,26949],{},"Memory locality：cache blocking；",[1212,26951,26952],{},"Synchronization：保证共享数据正确。",[1097,26954,26955],{},"现代高性能程序通常是这些东西叠在一起。",[978,26957,26959],{"id":26958},"第三并行越强正确性越难","第三，并行越强，正确性越难",[1097,26961,26962],{},"串行程序中，顺序很明确：",[2259,26964,26967],{"className":26965,"code":26966,"language":18502},[18500],"A 先发生，B 后发生\n",[1071,26968,26966],{"__ignoreMap":2265},[1097,26970,26971],{},"并行程序中，顺序变成：",[2259,26973,26976],{"className":26974,"code":26975,"language":18502},[18500],"A 和 B 谁先发生？不知道。\n",[1071,26977,26975],{"__ignoreMap":2265},[1097,26979,26980],{},"所以要用同步人为建立顺序。\n但是同步会牺牲并行性，因此真正好的并行程序不是疯狂加锁，而是：",[1991,26982,26983],{},[1097,26984,26985],{},[1104,26986,26987],{},"尽量通过数据划分避免共享写；只有必要时才同步。",[978,26989,26991],{"id":26990},"第四全章其实围绕矩阵乘法不断升级","第四，全章其实围绕矩阵乘法不断升级",[1097,26993,26994],{},"矩阵乘法贯穿了整个课件：",[982,26996,26997,27007],{},[985,26998,26999],{},[988,27000,27001,27004],{},[991,27002,27003],{},"阶段",[991,27005,27006],{},"对矩阵乘法做了什么",[1001,27008,27009,27017,27024,27032,27040,27048],{},[988,27010,27011,27014],{},[1006,27012,27013],{},"基础模块",[1006,27015,27016],{},"用它说明性能差距和 flop 计算",[988,27018,27019,27021],{},[1006,27020,7351],{},[1006,27022,27023],{},"用 AVX 一次算多个 double",[988,27025,27026,27029],{},[1006,27027,27028],{},"DLP 后半",[1006,27030,27031],{},"用 unrolling 和 blocking 提高吞吐和 cache 复用",[988,27033,27034,27037],{},[1006,27035,27036],{},"TLP\u002FOpenMP",[1006,27038,27039],{},"把矩阵行\u002F块分给多个线程",[988,27041,27042,27045],{},[1006,27043,27044],{},"同步",[1006,27046,27047],{},"说明如果不同线程写不同 C 元素，就可以避免锁",[988,27049,27050,27053],{},[1006,27051,27052],{},"总结",[1006,27054,27055],{},"OpenMP + SIMD + blocking 才接近真正高性能 GEMM",[1097,27057,27058],{},"所以它是全章的“实验田”。",[1231,27060],{},[1092,27062,27064],{"id":27063},"_10-最压缩的总总结","10. 最压缩的总总结",[1097,27066,27067],{},"这份课件的组织方式可以浓缩成一句话：",[1991,27069,27070],{},[1097,27071,27072],{},[1104,27073,27074],{},"先说明顺序执行为什么到头了，再按 DLP、ILP、TLP 三个层次寻找并行性能，接着用 OpenMP 把线程级并行暴露给程序员，最后用同步解决共享内存并行带来的正确性问题。",[1097,27076,27077],{},"再更狠一点压缩：",[2259,27079,27082],{"className":27080,"code":27081,"language":18502},[18500],"性能问题 → 并行分类 → 硬件利用并行 → 软件表达并行 → 同步保证正确\n",[1071,27083,27081],{"__ignoreMap":2265},[1097,27085,27086],{},"这就是整章的骨架。",[1231,27088],{},{"title":2265,"searchDepth":27090,"depth":27090,"links":27091},4,[27092,27093,27098,27129,27173,27217,27265,27294,27316],{"id":980,"depth":27090,"text":980},{"id":1089,"depth":8181,"text":1090,"children":27094},[27095,27097],{"id":1094,"depth":27096,"text":1095},3,{"id":1203,"depth":27096,"text":1204},{"id":1235,"depth":8181,"text":1236,"children":27099},[27100,27101,27108,27109,27117,27118,27125],{"id":1241,"depth":27096,"text":1242},{"id":1267,"depth":27096,"text":1268,"children":27102},[27103,27104,27105,27106,27107],{"id":1274,"depth":27090,"text":1275},{"id":1296,"depth":27090,"text":1297},{"id":2253,"depth":27090,"text":2254},{"id":2755,"depth":27090,"text":2756},{"id":3104,"depth":27090,"text":3105},{"id":3157,"depth":27096,"text":3158},{"id":3226,"depth":27096,"text":3227,"children":27110},[27111,27112,27113,27114,27116],{"id":3233,"depth":27090,"text":3234},{"id":4084,"depth":27090,"text":4085},{"id":4733,"depth":27090,"text":4734},{"id":6076,"depth":27090,"text":27115},"第 20 页：强扩展、弱扩展、负载平衡，重要",{"id":6185,"depth":27090,"text":6186},{"id":7268,"depth":27096,"text":7269},{"id":7378,"depth":27096,"text":7379,"children":27119},[27120,27121,27122,27123,27124],{"id":7514,"depth":27090,"text":7515},{"id":7524,"depth":27090,"text":7525},{"id":8060,"depth":27090,"text":8061},{"id":8088,"depth":27090,"text":8089},{"id":8095,"depth":27090,"text":8096},{"id":8143,"depth":27096,"text":8144,"children":27126},[27127,27128],{"id":8150,"depth":27090,"text":8151},{"id":8213,"depth":27090,"text":8214},{"id":8301,"depth":8181,"text":8302,"children":27130},[27131,27135,27140,27146,27150,27156,27163,27168],{"id":8319,"depth":27096,"text":8320,"children":27132},[27133,27134],{"id":8323,"depth":27090,"text":8324},{"id":8400,"depth":27090,"text":8401},{"id":8427,"depth":27096,"text":8428,"children":27136},[27137,27138,27139],{"id":8434,"depth":27090,"text":8435},{"id":8629,"depth":27090,"text":8630},{"id":8791,"depth":27090,"text":8792},{"id":9700,"depth":27096,"text":9701,"children":27141},[27142,27143,27144,27145],{"id":9704,"depth":27090,"text":9705},{"id":9746,"depth":27090,"text":9747},{"id":9834,"depth":27090,"text":9835},{"id":11152,"depth":27090,"text":11153},{"id":11496,"depth":27096,"text":11497,"children":27147},[27148,27149],{"id":11503,"depth":27090,"text":11504},{"id":13043,"depth":27090,"text":13044},{"id":13150,"depth":27096,"text":13151,"children":27151},[27152,27153,27155],{"id":13154,"depth":27090,"text":13155},{"id":13261,"depth":27090,"text":27154},"第 48 页：Loop Unrolling",{"id":13346,"depth":27090,"text":13347},{"id":13445,"depth":27096,"text":13446,"children":27157},[27158,27159,27160,27161,27162],{"id":13455,"depth":27090,"text":13456},{"id":14035,"depth":27090,"text":14036},{"id":14269,"depth":27090,"text":14270},{"id":14354,"depth":27090,"text":14355},{"id":14395,"depth":27090,"text":14396},{"id":14762,"depth":27096,"text":14763,"children":27164},[27165,27166,27167],{"id":14773,"depth":27090,"text":14774},{"id":14902,"depth":27090,"text":14903},{"id":14991,"depth":27090,"text":14992},{"id":15280,"depth":27096,"text":15281,"children":27169},[27170,27171],{"id":15425,"depth":27090,"text":15426},{"id":16232,"depth":27090,"text":27172},"分块外积：一次算 (MR×NRM_R \\times N_RMR​×NR​) 个 C 元素",{"id":18130,"depth":8181,"text":18131,"children":27174},[27175,27180,27185,27192,27197,27206,27210,27215,27216],{"id":18149,"depth":27096,"text":18150,"children":27176},[27177,27178,27179],{"id":18153,"depth":27090,"text":18154},{"id":18174,"depth":27090,"text":18175},{"id":18248,"depth":27090,"text":18249},{"id":18297,"depth":27096,"text":18298,"children":27181},[27182,27183,27184],{"id":18301,"depth":27090,"text":18302},{"id":18409,"depth":27090,"text":18410},{"id":18439,"depth":27090,"text":18440},{"id":18476,"depth":27096,"text":18477,"children":27186},[27187,27188,27189,27190,27191],{"id":18483,"depth":27090,"text":18484},{"id":18599,"depth":27090,"text":18600},{"id":18639,"depth":27090,"text":18640},{"id":18833,"depth":27090,"text":18834},{"id":19028,"depth":27090,"text":19029},{"id":19101,"depth":27096,"text":19102,"children":27193},[27194,27195,27196],{"id":19105,"depth":27090,"text":19106},{"id":19134,"depth":27090,"text":19135},{"id":19190,"depth":27090,"text":19191},{"id":19238,"depth":27096,"text":27198,"children":27199},"第 76–77 页：经典 VLIW 的问题",[27200,27201,27202,27203,27204,27205],{"id":19251,"depth":27090,"text":19252},{"id":19261,"depth":27090,"text":19262},{"id":19274,"depth":27090,"text":19275},{"id":19284,"depth":27090,"text":19285},{"id":19291,"depth":27090,"text":19292},{"id":19300,"depth":27090,"text":19301},{"id":19331,"depth":27096,"text":19332,"children":27207},[27208,27209],{"id":19338,"depth":27090,"text":19339},{"id":19425,"depth":27090,"text":19426},{"id":19484,"depth":27096,"text":19485,"children":27211},[27212,27213,27214],{"id":19491,"depth":27090,"text":19492},{"id":19550,"depth":27090,"text":19551},{"id":19592,"depth":27090,"text":19593},{"id":19637,"depth":27096,"text":19638},{"id":19686,"depth":27096,"text":19686},{"id":19785,"depth":8181,"text":19786,"children":27218},[27219,27220,27221,27222,27223,27224,27225,27226,27227,27228,27229,27230,27231,27232,27233,27234,27235,27236,27237,27242,27243,27244,27245,27246,27247,27248,27249,27250,27251,27256,27257,27262,27263,27264],{"id":19827,"depth":27096,"text":19828},{"id":19852,"depth":27096,"text":19853},{"id":20270,"depth":27096,"text":20271},{"id":20338,"depth":27096,"text":20339},{"id":20392,"depth":27096,"text":20393},{"id":20433,"depth":27096,"text":20434},{"id":20484,"depth":27096,"text":20485},{"id":20521,"depth":27096,"text":20522},{"id":20576,"depth":27096,"text":20577},{"id":20762,"depth":27096,"text":20763},{"id":20902,"depth":27096,"text":20903},{"id":20941,"depth":27096,"text":20942},{"id":21142,"depth":27096,"text":21143},{"id":21197,"depth":27096,"text":21198},{"id":21242,"depth":27096,"text":21243},{"id":21294,"depth":27096,"text":21295},{"id":21328,"depth":27096,"text":21329},{"id":21428,"depth":27096,"text":21429},{"id":21481,"depth":27096,"text":21482,"children":27238},[27239,27240,27241],{"id":21488,"depth":27090,"text":21489},{"id":21507,"depth":27090,"text":21508},{"id":21522,"depth":27090,"text":21523},{"id":21534,"depth":27096,"text":21535},{"id":21557,"depth":27096,"text":21558},{"id":21603,"depth":27096,"text":21604},{"id":21639,"depth":27096,"text":21640},{"id":21679,"depth":27096,"text":21680},{"id":21728,"depth":27096,"text":21729},{"id":21767,"depth":27096,"text":21768},{"id":21837,"depth":27096,"text":21838},{"id":21966,"depth":27096,"text":21967},{"id":22002,"depth":27096,"text":22003,"children":27252},[27253,27254,27255],{"id":22012,"depth":27090,"text":22013},{"id":22019,"depth":27090,"text":22020},{"id":22042,"depth":27090,"text":22043},{"id":22066,"depth":27096,"text":22067},{"id":22117,"depth":27096,"text":22118,"children":27258},[27259,27260,27261],{"id":22124,"depth":27090,"text":22125},{"id":22138,"depth":27090,"text":22139},{"id":22148,"depth":27090,"text":22149},{"id":22219,"depth":27096,"text":22220},{"id":22273,"depth":27096,"text":22274},{"id":22325,"depth":27096,"text":22326},{"id":22382,"depth":8181,"text":22383,"children":27266},[27267,27268,27269,27270,27271,27272,27273,27274,27279,27280,27281,27282,27283,27284,27285,27286,27287,27288,27289,27290,27291,27292,27293],{"id":22407,"depth":27096,"text":22408},{"id":22487,"depth":27096,"text":22488},{"id":22508,"depth":27096,"text":22509},{"id":22583,"depth":27096,"text":22584},{"id":22659,"depth":27096,"text":22660},{"id":22680,"depth":27096,"text":22681},{"id":22706,"depth":27096,"text":22707},{"id":22771,"depth":27096,"text":22772,"children":27275},[27276,27277,27278],{"id":22823,"depth":27090,"text":22824},{"id":22849,"depth":27090,"text":22850},{"id":22873,"depth":27090,"text":22874},{"id":22905,"depth":27096,"text":22906},{"id":22961,"depth":27096,"text":22962},{"id":22970,"depth":27096,"text":22971},{"id":23258,"depth":27096,"text":23259},{"id":23298,"depth":27096,"text":23299},{"id":23349,"depth":27096,"text":23350},{"id":23386,"depth":27096,"text":23387},{"id":23425,"depth":27096,"text":23426},{"id":23454,"depth":27096,"text":23455},{"id":23505,"depth":27096,"text":23506},{"id":23552,"depth":27096,"text":23553},{"id":23589,"depth":27096,"text":23590},{"id":23637,"depth":27096,"text":23638},{"id":23741,"depth":27096,"text":23742},{"id":23800,"depth":27096,"text":23800},{"id":23847,"depth":8181,"text":23848,"children":27295},[27296,27297,27298,27299,27300,27301,27302,27303,27304,27305,27306,27307,27308,27309,27310,27311,27312,27313,27314,27315],{"id":23873,"depth":27096,"text":23874},{"id":23905,"depth":27096,"text":23906},{"id":23919,"depth":27096,"text":23920},{"id":23948,"depth":27096,"text":23949},{"id":23971,"depth":27096,"text":23972},{"id":24016,"depth":27096,"text":24017},{"id":24060,"depth":27096,"text":24061},{"id":24118,"depth":27096,"text":24119},{"id":24245,"depth":27096,"text":24246},{"id":24372,"depth":27096,"text":24373},{"id":24424,"depth":27096,"text":24425},{"id":24542,"depth":27096,"text":24543},{"id":24653,"depth":27096,"text":24654},{"id":24778,"depth":27096,"text":24779},{"id":24823,"depth":27096,"text":24824},{"id":24961,"depth":27096,"text":24962},{"id":25047,"depth":27096,"text":25048},{"id":25401,"depth":27096,"text":25402},{"id":25459,"depth":27096,"text":25459},{"id":25576,"depth":27096,"text":23800},{"id":25623,"depth":8181,"text":25623,"children":27317},[27318,27319,27320,27321,27322,27326,27327,27328,27329,27335],{"id":25648,"depth":27096,"text":25649},{"id":25831,"depth":27096,"text":25832},{"id":25937,"depth":27096,"text":25938},{"id":26264,"depth":27096,"text":26265},{"id":26532,"depth":27096,"text":26533,"children":27323},[27324,27325],{"id":26550,"depth":27090,"text":26551},{"id":26567,"depth":27090,"text":26568},{"id":26654,"depth":27096,"text":26655},{"id":26772,"depth":27096,"text":26773},{"id":26862,"depth":27096,"text":26863},{"id":26906,"depth":27096,"text":26907,"children":27330},[27331,27332,27333,27334],{"id":26913,"depth":27090,"text":26914},{"id":26931,"depth":27090,"text":26932},{"id":26958,"depth":27090,"text":26959},{"id":26990,"depth":27090,"text":26991},{"id":27063,"depth":27096,"text":27064},[903],"从 SIMD、GEMM 分块到 ILP\u002FVLIW 静态调度，再到多核与硬件多线程的并行技术梳理","md",null,{"slots":27341},{},{"text":801,"minutes":802,"time":803,"words":804},{"title":799,"description":27337},{"loc":798,"images":27345},[27346,27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358,27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370,27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27381,27382,27383,27384,27385,27386,27387,27388,27389,27390,27391,27392],{"loc":1248},{"loc":1302},{"loc":2272},{"loc":3110},{"loc":6073},{"loc":7410},{"loc":7418},{"loc":7431},{"loc":7438},{"loc":8443},{"loc":8638},{"loc":8807},{"loc":11592},{"loc":13270},{"loc":14278},{"loc":14911},{"loc":14933},{"loc":15272},{"loc":16425},{"loc":18180},{"loc":18262},{"loc":18317},{"loc":18648},{"loc":19045},{"loc":19149},{"loc":19157},{"loc":19208},{"loc":19216},{"loc":19461},{"loc":20344},{"loc":20493},{"loc":20879},{"loc":21337},{"loc":21516},{"loc":21612},{"loc":21665},{"loc":21693},{"loc":21734},{"loc":21781},{"loc":21846},{"loc":22075},{"loc":22686},{"loc":22911},{"loc":23264},{"loc":23315},{"loc":23358},{"loc":23911},[27394,27395],"计算机组成原理","课程笔记","tech","N77xGnSBijl6JeE3965p-H-fAjRF5rBltUF9mkbDDQ0",[27399,27400],{"title":790,"path":789,"stem":788,"date":653,"type":27396,"children":-1},{"title":808,"path":807,"stem":806,"date":653,"type":27396,"children":-1},1789057282238]