<?xml version="1.0"?>
<rss version="2.0">
    <channel>
        <title>Amicoyuan</title>
        <link>https://xingyuanjie.top</link>
        <description></description>
        <language>zh-CN</language>
        <pubDate>Sun, 30 Jul 2023 15:03:23 +0800</pubDate>
        <lastBuildDate>Sun, 30 Jul 2023 15:03:23 +0800</lastBuildDate>
        <category>AVX</category>
        <category>Data Structure</category>
        <category>String</category>
        <category>Find</category>
        <category>STL</category>
        <category>C++</category>
        <category>Set</category>
        <category>团体程序设计天梯赛</category>
        <category>Sort</category>
        <category>LinkList</category>
        <category>双向链表</category>
        <category>Graph</category>
        <category>邻接表</category>
        <category>Vector</category>
        <category>Binary tree</category>
        <category>BFS</category>
        <category>模拟</category>
        <category>结构体</category>
        <category>Double类型相等比较</category>
        <category>邻接矩阵</category>
        <category>DFS</category>
        <category>贪心</category>
        <category>并查集</category>
        <category>Map</category>
        <category>Pair</category>
        <category>CMU</category>
        <category>CSAPP</category>
        <category>CUDA</category>
        <category>Linux</category>
        <category>Tensorflow</category>
        <category>Machine Learning</category>
        <category>MPI</category>
        <category>Matrix</category>
        <category>GEMM</category>
        <category>AVX2</category>
        <category>blas</category>
        <category>gemm</category>
        <category>gemv</category>
        <category>dgemm</category>
        <category>Cache</category>
        <category>Blocking</category>
        <category>C/C++</category>
        <category>spmv</category>
        <category>SUMMA</category>
        <category>Music</category>
        <category>Intel</category>
        <category>LeetCode</category>
        <category>双指针</category>
        <category>数组翻转</category>
        <category>哈希表</category>
        <category>前缀和</category>
        <category>Seasons</category>
        <category>Mirror</category>
        <category>牛客</category>
        <category>Numactl</category>
        <category>OpenMP</category>
        <category>register</category>
        <category>Slurm</category>
        <category>性能分析工具</category>
        <category>gcov</category>
        <category>bool</category>
        <item>
            <guid isPermalink="true">https://xingyuanjie.top/2023/07/30/greyson001/</guid>
            <title>Greyson Chance 2023 Beijing</title>
            <link>https://xingyuanjie.top/2023/07/30/greyson001/</link>
            <category>Music</category>
            <pubDate>Sun, 30 Jul 2023 15:03:23 +0800</pubDate>
            <description><![CDATA[ &lt;h2 id=&#34;Greyson-Chance-2023-Beijing&#34;&gt;&lt;a href=&#34;#Greyson-Chance-2023-Beijing&#34; class=&#34;headerlink&#34; title=&#34;Greyson Chance 2023 Beijing&#34;&gt;&lt;/a&gt;&lt;strong&gt;Greyson Chance 2023 Beijing&lt;/strong&gt;&lt;/h2&gt;&lt;h3 id=&#34;总结&#34;&gt;&lt;a href=&#34;#总结&#34; class=&#34;headerlink&#34; title=&#34;总结&#34;&gt;&lt;/a&gt;总结&lt;/h3&gt;&lt;p&gt;记得最早开始听，应该是在初中，从最初的No Fear到后来的最爱的Seasons。他19年来中国我是完全不知道，都是大学开班会，同学看到我头像加了我，我才知道，这次也是在她朋友圈看到了消息，哈哈哈哈，respect！这次终于赶上了！&lt;/p&gt;
&lt;p&gt;哈哈哈哈哈哈，这次认识了好多新朋友，大家都好nice，白玫瑰小队下次又见！我甚至连之前一直在B站看的Seasons杭州场的MV的up都认识了，属于说非常巧了。&lt;/p&gt;
&lt;p&gt;现场真的好震撼，导致我回去久久不能平复，GC真的行走的CD哈哈哈。我给他说能不能唱Seasons，他说抱歉，希望你能享受今晚。上大学后我其实很少关注GC了，但是Seasons总会在一年的那么些日子里单曲循环，新专辑更是听都没听过，4月后我就开始慢慢听着新专辑的歌，期待现场见了哈哈！&lt;/p&gt;
&lt;p&gt;结束后我又想了想，初中，高中，大学，疫情，好像时间真的过得很快，转眼间我都毕业了。这次我真的感到好像当年自己青春的遗憾慢慢画上一个感叹号了！&lt;/p&gt;
&lt;p&gt;愿我一直No Fear，&lt;/p&gt;
&lt;p&gt;Move forword like the seasons！&lt;/p&gt;
&lt;h3 id=&#34;全场视频&#34;&gt;&lt;a href=&#34;#全场视频&#34; class=&#34;headerlink&#34; title=&#34;全场视频&#34;&gt;&lt;/a&gt;全场视频&lt;/h3&gt;&lt;p&gt;&lt;a href=&#34;https://www.aliyundrive.com/s/ZCaugLSs8TJ&#34;&gt;https://www.aliyundrive.com/s/ZCaugLSs8TJ&lt;/a&gt;&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://xingyuanjie.top/2023/07/28/life001/</guid>
            <title>重启Life分类-Seasons</title>
            <link>https://xingyuanjie.top/2023/07/28/life001/</link>
            <category>Seasons</category>
            <pubDate>Fri, 28 Jul 2023 00:06:04 +0800</pubDate>
            <description><![CDATA[ &lt;h2 id=&#34;重启Life分类-Seasons&#34;&gt;&lt;a href=&#34;#重启Life分类-Seasons&#34; class=&#34;headerlink&#34; title=&#34;重启Life分类-Seasons&#34;&gt;&lt;/a&gt;重启Life分类-Seasons&lt;/h2&gt;&lt;p&gt;在听完GC北京场后，感触颇深，再次启动Life分类还是有必要哈哈哈！&lt;/p&gt;
&lt;p&gt;今天写这篇博客好像也脱了很久。&lt;/p&gt;
&lt;p&gt;【上次因为糟糕的排版删除了23年的厦门篇，Sorry，后期会补上】&lt;/p&gt;
&lt;p&gt;同时恭喜队伍成功进入CPC2023决赛，这波是青岛见了，哈哈哈！手动撒花！&lt;/p&gt;
&lt;p&gt;我发现有些瞬间还是必须照片或者文字记下来，不然后面真的会忘记。&lt;/p&gt;
&lt;p&gt;立个FLAG今年在Life分类更新完23年的旅行以及这次的GC北京场。&lt;/p&gt;
&lt;p&gt;后续的计划大概是，博客里面写文字内容，同时贴上云盘的视频和照片。因为这样就可以避免糟糕的排版了，主要还是对前端不太熟。&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://xingyuanjie.top/2023/07/15/gemm0011/</guid>
            <title>SUMMA：Scalable Universal Matrix Multiplication Algorithm[未更新]</title>
            <link>https://xingyuanjie.top/2023/07/15/gemm0011/</link>
            <category>blas</category>
            <category>gemm</category>
            <category>SUMMA</category>
            <pubDate>Sat, 15 Jul 2023 10:02:32 +0800</pubDate>
            <description><![CDATA[ &lt;h2 id=&#34;论文阅读：SUMMA：Scalable-Universal-Matrix-Multiplication-Algorithm&#34;&gt;&lt;a href=&#34;#论文阅读：SUMMA：Scalable-Universal-Matrix-Multiplication-Algorithm&#34; class=&#34;headerlink&#34; title=&#34;论文阅读：SUMMA：Scalable Universal Matrix Multiplication Algorithm&#34;&gt;&lt;/a&gt;论文阅读：SUMMA：Scalable Universal Matrix Multiplication Algorithm&lt;/h2&gt;&lt;h2 id=&#34;论文链接&#34;&gt;&lt;a href=&#34;#论文链接&#34; class=&#34;headerlink&#34; title=&#34;论文链接&#34;&gt;&lt;/a&gt;论文链接&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://dl.acm.org/doi/book/10.5555/899248&#34;&gt;SUMMA: Scalable Universal Matrix Multiplication Algorithm | Guide books (acm.org)&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;文章总结&#34;&gt;&lt;a href=&#34;#文章总结&#34; class=&#34;headerlink&#34; title=&#34;文章总结&#34;&gt;&lt;/a&gt;文章总结&lt;/h2&gt; ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://xingyuanjie.top/2023/07/11/gemm0010/</guid>
            <title>论文阅读：Towards Efficient SpMV on Sunway Manycore Architectures</title>
            <link>https://xingyuanjie.top/2023/07/11/gemm0010/</link>
            <category>blas</category>
            <category>spmv</category>
            <pubDate>Tue, 11 Jul 2023 21:47:35 +0800</pubDate>
            <description><![CDATA[ &lt;h2 id=&#34;论文阅读：Towards-Efficient-SpMV-on-Sunway-Manycore-Architectures&#34;&gt;&lt;a href=&#34;#论文阅读：Towards-Efficient-SpMV-on-Sunway-Manycore-Architectures&#34; class=&#34;headerlink&#34; title=&#34;论文阅读：Towards Efficient SpMV on Sunway Manycore Architectures&#34;&gt;&lt;/a&gt;论文阅读：Towards Efficient SpMV on Sunway Manycore Architectures&lt;/h2&gt;&lt;h2 id=&#34;文章链接：&#34;&gt;&lt;a href=&#34;#文章链接：&#34; class=&#34;headerlink&#34; title=&#34;文章链接：&#34;&gt;&lt;/a&gt;文章链接：&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://dl.acm.org/doi/pdf/10.1145/3205289.3205313?accessTab=true&#34;&gt;Towards Efficient SpMV on Sunway Manycore Architectures | Proceedings of the 2018 International Conference on Supercomputing (acm.org)&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;文章总结&#34;&gt;&lt;a href=&#34;#文章总结&#34; class=&#34;headerlink&#34; title=&#34;文章总结&#34;&gt;&lt;/a&gt;文章总结&lt;/h2&gt;&lt;h3 id=&#34;dual-side-multi-level-partitioning-technique&#34;&gt;&lt;a href=&#34;#dual-side-multi-level-partitioning-technique&#34; class=&#34;headerlink&#34; title=&#34;dual-side multi-level partitioning technique&#34;&gt;&lt;/a&gt;dual-side multi-level partitioning technique&lt;/h3&gt;&lt;p&gt;三层分块：Block-&amp;gt;Tile-&amp;gt;Slice&lt;/p&gt;
&lt;p&gt;其中在Tile这一层会有空Tile块，不需要计算&lt;/p&gt;
&lt;p&gt;其中Slice这一层也会有空Slice切片，不需要计算&lt;/p&gt;
&lt;p&gt;最底层Slice切片是我们的计算核心&lt;/p&gt;
&lt;p&gt;多级队列：负载均衡—&amp;gt;The work sharing mechanism in the block and slice queuesguarantee the workload balance across fleets and cores.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/2023/07/11/gemm0010/image-20230711215435026.png&#34; alt=&#34;image-20230711215435026&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;映射细节：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/2023/07/11/gemm0010/image-20230711220304175.png&#34; alt=&#34;image-20230711220304175&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;计算核心处理逻辑&#34;&gt;&lt;a href=&#34;#计算核心处理逻辑&#34; class=&#34;headerlink&#34; title=&#34;计算核心处理逻辑&#34;&gt;&lt;/a&gt;计算核心处理逻辑&lt;/h3&gt;&lt;p&gt;一行8个核心：7个计算核心，1个I&amp;#x2F;O核心&lt;/p&gt;
&lt;p&gt;计算核心负责SPMV计算&lt;/p&gt;
&lt;p&gt;I&amp;#x2F;O核心负责将结果写回内存&lt;/p&gt;
&lt;p&gt;多个slice组合—&amp;gt;batch，方便DMA，并进行数据预取(单位batch)，注意计算核心slice依然没有改变&lt;/p&gt;
&lt;p&gt;利用向量寄存器，巧妙搭载msg&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/2023/07/11/gemm0010/image-20230711221015472.png&#34; alt=&#34;image-20230711221015472&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;I-x2F-O核心的处理逻辑&#34;&gt;&lt;a href=&#34;#I-x2F-O核心的处理逻辑&#34; class=&#34;headerlink&#34; title=&#34;I&amp;#x2F;O核心的处理逻辑&#34;&gt;&lt;/a&gt;I&amp;#x2F;O核心的处理逻辑&lt;/h3&gt;&lt;p&gt;整个block计算完才写回，避免反复访存&lt;/p&gt;
&lt;p&gt;向量计算器meg-&amp;gt;reduce&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;利用神威RMA&lt;/strong&gt;&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://xingyuanjie.top/2023/07/03/gemm0009/</guid>
            <title>论文阅读：稀疏矩阵向量乘法在申威众核架构上的性能优化</title>
            <link>https://xingyuanjie.top/2023/07/03/gemm0009/</link>
            <category>blas</category>
            <category>spmv</category>
            <pubDate>Mon, 03 Jul 2023 21:56:03 +0800</pubDate>
            <description><![CDATA[ &lt;h2 id=&#34;稀疏矩阵向量乘法在申威众核架构上的性能优化&#34;&gt;&lt;a href=&#34;#稀疏矩阵向量乘法在申威众核架构上的性能优化&#34; class=&#34;headerlink&#34; title=&#34;稀疏矩阵向量乘法在申威众核架构上的性能优化&#34;&gt;&lt;/a&gt;稀疏矩阵向量乘法在申威众核架构上的性能优化&lt;/h2&gt;&lt;h2 id=&#34;文章链接：&#34;&gt;&lt;a href=&#34;#文章链接：&#34; class=&#34;headerlink&#34; title=&#34;文章链接：&#34;&gt;&lt;/a&gt;文章链接：&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://kns.cnki.net/kcms2/article/abstract?v=3uoqIhG8C44YLTlOAiTRKibYlV5Vjs7i8oRR1PAr7RxjuAJk4dHXos_BuYfGFXVp2oi-VeHUWWPMdimPFvuCr6UTXzh1QasE&amp;uniplatform=NZKPT&#34;&gt;稀疏矩阵向量乘法在申威众核架构上的性能优化 - 中国知网 (cnki.net)&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;文章总结&#34;&gt;&lt;a href=&#34;#文章总结&#34; class=&#34;headerlink&#34; title=&#34;文章总结&#34;&gt;&lt;/a&gt;文章总结&lt;/h2&gt;&lt;h3 id=&#34;固定划分方法&#34;&gt;&lt;a href=&#34;#固定划分方法&#34; class=&#34;headerlink&#34; title=&#34;固定划分方法&#34;&gt;&lt;/a&gt;固定划分方法&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;所有计算完再写回&lt;/li&gt;
&lt;li&gt;子矩阵(任务)-&amp;gt;子矩阵小块(核心计算)&lt;/li&gt;
&lt;li&gt;将子矩阵小块中的非零元存储在一起，以适应申威处理器上的DMA操作。(Packing)&lt;/li&gt;
&lt;li&gt;核心：寄存器通信-&amp;gt;RMA&lt;/li&gt;
&lt;li&gt;根据LDM大小提前计算，充分利用LDM空间，换句话说就是保证计算所需都在LDM中&lt;/li&gt;
&lt;li&gt;加载冗余X，避免DMA隔断&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;一维负载均衡划分方法&#34;&gt;&lt;a href=&#34;#一维负载均衡划分方法&#34; class=&#34;headerlink&#34; title=&#34;一维负载均衡划分方法&#34;&gt;&lt;/a&gt;一维负载均衡划分方法&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;尽量使从核处理非零元数量相当&lt;/li&gt;
&lt;li&gt;4个层次：原矩阵-&amp;gt;矩阵带-&amp;gt;子矩阵-&amp;gt;小块&lt;/li&gt;
&lt;li&gt;交替分配矩阵带给从核行&lt;/li&gt;
&lt;li&gt;核心计算依然是子矩阵小块，同固定划分方法&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;二维负载均衡划分方法&#34;&gt;&lt;a href=&#34;#二维负载均衡划分方法&#34; class=&#34;headerlink&#34; title=&#34;二维负载均衡划分方法&#34;&gt;&lt;/a&gt;二维负载均衡划分方法&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;矩阵带分配采取贪心的方法，尽可能保证不同行之间的负载均衡&lt;/li&gt;
&lt;li&gt;解决一维负载均衡方法带来的细粒度同步问题&lt;/li&gt;
&lt;li&gt;非零元过少的矩阵带，交给一个从核完成，而不再均分给同行上的几个从核&lt;/li&gt;
&lt;li&gt;一维和二维主要解决预处理，计算还是固定划分中的子矩阵小块&lt;/li&gt;
&lt;li&gt;排序-&amp;gt;根据矩阵带非零元数量从大到小排序(逻辑排序)&lt;/li&gt;
&lt;li&gt;Select函数会在所有ROWS行的从核中，选择出目前非零元数量最少的一行，并将当前的矩阵带i分配给它&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;输入：tiles,nnz_tile，ROWS&lt;br&gt;输出：set&lt;br&gt;nnz_set&amp;lt;&lt;span class=&#34;hljs-number&#34;&gt;-0&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; i = &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; to tiles - &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;hljs-keyword&#34;&gt;do&lt;/span&gt;&lt;br&gt;    Select id &lt;span class=&#34;hljs-keyword&#34;&gt;if&lt;/span&gt; nnz_set[id] is minimal   &lt;span class=&#34;hljs-comment&#34;&gt;//注意：这里是选从核行，不是矩阵带&lt;/span&gt;&lt;br&gt;    nnz_set[id] += nnz_tiles[i]&lt;br&gt;    set[id] =  set[id]U&amp;#123;i&amp;#125;   &lt;span class=&#34;hljs-comment&#34;&gt;//任务分配&lt;/span&gt;&lt;br&gt;end &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; &lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;这里注意，我们在固定划分那里解决了数据局部性差等问题，之后的一二维划分，都是在做任务分配，核心计算子矩阵小块一直未改变&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://xingyuanjie.top/2023/06/09/gemm0008/</guid>
            <title>论文阅读：面向国产申威 26010 众核处理器的 SpMV 实现与优化</title>
            <link>https://xingyuanjie.top/2023/06/09/gemm0008/</link>
            <category>blas</category>
            <category>spmv</category>
            <pubDate>Fri, 09 Jun 2023 00:20:37 +0800</pubDate>
            <description><![CDATA[ &lt;h2 id=&#34;面向国产申威-26010-众核处理器的-SpMV-实现与优化&#34;&gt;&lt;a href=&#34;#面向国产申威-26010-众核处理器的-SpMV-实现与优化&#34; class=&#34;headerlink&#34; title=&#34;面向国产申威 26010 众核处理器的 SpMV 实现与优化&#34;&gt;&lt;/a&gt;面向国产申威 26010 众核处理器的 SpMV 实现与优化&lt;/h2&gt;&lt;h2 id=&#34;文章链接：&#34;&gt;&lt;a href=&#34;#文章链接：&#34; class=&#34;headerlink&#34; title=&#34;文章链接：&#34;&gt;&lt;/a&gt;文章链接：&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://kns.cnki.net/kcms2/article/abstract?v=3uoqIhG8C44YLTlOAiTRKibYlV5Vjs7iLik5jEcCI09uHa3oBxtWoDjpNvZMhBwTwYhU5_aacU5_o2Scyx5dsHMxE0wqndQa&amp;uniplatform=NZKPT&#34;&gt;面向国产申威26010众核处理器的SpMV实现与优化 - 中国知网 (cnki.net)&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;文章总结&#34;&gt;&lt;a href=&#34;#文章总结&#34; class=&#34;headerlink&#34; title=&#34;文章总结&#34;&gt;&lt;/a&gt;文章总结&lt;/h2&gt;&lt;p&gt;存储格式：CSR&lt;/p&gt;
&lt;p&gt;数据名称定义：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;col:非零元的列号&lt;/li&gt;
&lt;li&gt;data:非零元数值，连续存放&lt;/li&gt;
&lt;li&gt;row_off:x数组，每行第一个元素前面的非零元素，最后一个rowoff代表总的非零元素&lt;/li&gt;
&lt;li&gt;vec:计算向量&lt;/li&gt;
&lt;li&gt;y:结果向量&lt;/li&gt;
&lt;li&gt;rows:行号&lt;/li&gt;
&lt;li&gt;srow:为当前申威处理器一个从核的 LDM 可以容纳的最多稀疏行大小&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;X动静态buffer&#34;&gt;&lt;a href=&#34;#X动静态buffer&#34; class=&#34;headerlink&#34; title=&#34;X动静态buffer&#34;&gt;&lt;/a&gt;X动静态buffer&lt;/h3&gt;&lt;p&gt;x静态buffer，初始化后一直不改变。(论文中有两种初始化方法)&lt;/p&gt;
&lt;p&gt;x动态buffer，未命中，则用dma更新x动态buffer&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;span class=&#34;hljs-comment&#34;&gt;//slave.c&lt;/span&gt;&lt;br&gt;LDM-&amp;gt;malloc   x_sbuffer   &lt;span class=&#34;hljs-comment&#34;&gt;//x静态buffer&lt;/span&gt;&lt;br&gt;LDM-&amp;gt;malloc   x_dbuffer   &lt;span class=&#34;hljs-comment&#34;&gt;//x动态buffer&lt;/span&gt;&lt;br&gt;sstart,send,dstart,&lt;span class=&#34;hljs-function&#34;&gt;dend&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-title&#34;&gt;dma&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;(vec-&amp;gt;x_sbuffer,sstart,send)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-title&#34;&gt;dma&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;(vec-&amp;gt;x_dbuffer,dstart,dend)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; srow&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; row&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;        &lt;span class=&#34;hljs-title&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;(in x_sbuffer)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;            cal&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;        &lt;span class=&#34;hljs-keyword&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;(in x_dbuffer)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;            cal&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;        &lt;span class=&#34;hljs-keyword&#34;&gt;else&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;            &lt;span class=&#34;hljs-title&#34;&gt;update_dma&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;(vec-&amp;gt;x_dbuffer,dstart,dend)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;            cal&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;     store&lt;/span&gt;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h3 id=&#34;负载均衡&#34;&gt;&lt;a href=&#34;#负载均衡&#34; class=&#34;headerlink&#34; title=&#34;负载均衡&#34;&gt;&lt;/a&gt;负载均衡&lt;/h3&gt;&lt;p&gt;动静态划分&lt;/p&gt;
&lt;p&gt;第一轮静态：每个从核分配相同的任务量即srow&lt;/p&gt;
&lt;p&gt;后续采用动态：哪个从核先计算完，就先从任务池里面拿新的任务&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;span class=&#34;hljs-comment&#34;&gt;//slave.c&lt;/span&gt;&lt;br&gt;eg:&lt;span class=&#34;hljs-number&#34;&gt;64&lt;/span&gt;个从核&lt;br&gt;task_num &lt;span class=&#34;hljs-comment&#34;&gt;//任务数&lt;/span&gt;&lt;br&gt;now_addr &lt;span class=&#34;hljs-comment&#34;&gt;//当前任务计算到哪里了&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;//第一轮  每个从核执行相同的任务量即srow&lt;/span&gt;&lt;br&gt;    &lt;br&gt;cal srow&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;//其余任务保存到任务池，用锁保护，实现互斥操作&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;//任务池，当task_num为0时计算完毕&lt;/span&gt;&lt;br&gt;mutex = &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-built_in&#34;&gt;P&lt;/span&gt;(mutex)&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;//互斥区&lt;/span&gt;&lt;br&gt;task_num&lt;br&gt;now_addr&lt;br&gt;&lt;span class=&#34;hljs-built_in&#34;&gt;V&lt;/span&gt;(mutex)&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;//取now_addr&lt;/span&gt;&lt;br&gt;cal  srow&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;//随后 继续loop，直到task_num为0&lt;/span&gt;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://xingyuanjie.top/2023/06/07/gemm0007/</guid>
            <title>Packing into contiguous memory</title>
            <link>https://xingyuanjie.top/2023/06/07/gemm0007/</link>
            <category>blas</category>
            <category>gemm</category>
            <category>gemv</category>
            <pubDate>Wed, 07 Jun 2023 13:47:39 +0800</pubDate>
            <description><![CDATA[ &lt;h2 id=&#34;Packing-into-contiguous-memory&#34;&gt;&lt;a href=&#34;#Packing-into-contiguous-memory&#34; class=&#34;headerlink&#34; title=&#34;Packing into contiguous memory&#34;&gt;&lt;/a&gt;Packing into contiguous memory&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;首先，我们打包A块，这样我们就可以连续地穿过它(march through it)。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/flame/how-to-optimize-gemm/wiki/Optimization_4x4_12&#34;&gt;Optimization_4x4_12 · flame&amp;#x2F;how-to-optimize-gemm Wiki (github.com)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/flame/how-to-optimize-gemm/wiki/Optimization_4x4_13&#34;&gt;Optimization_4x4_13 · flame&amp;#x2F;how-to-optimize-gemm Wiki (github.com)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这将带来惊人的性能提升:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/2023/06/07/gemm0007/compare_MMult0_MMult-4x4-13.png&#34; alt=&#34;img&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/2023/06/07/gemm0007/compare_MMult-4x4-11_MMult-4x4-13.png&#34; alt=&#34;img&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最后，我们打包B块，以便连续地遍历它。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/flame/how-to-optimize-gemm/wiki/Optimization_4x4_14&#34;&gt;https://github.com/flame/how-to-optimize-gemm/wiki/Optimization_4x4_14&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/flame/how-to-optimize-gemm/wiki/Optimization_4x4_14&#34;&gt;Optimization_4x4_14 · flame&amp;#x2F;how-to-optimize-gemm Wiki (github.com)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我们现在达到了处理器90%的涡轮增压峰值!&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/2023/06/07/gemm0007/compare_MMult0_MMult-4x4-15.png&#34; alt=&#34;img&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/2023/06/07/gemm0007/compare_MMult-4x4-13_MMult-4x4-15.png&#34; alt=&#34;img&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;Optimization-4x4-12&#34;&gt;&lt;a href=&#34;#Optimization-4x4-12&#34; class=&#34;headerlink&#34; title=&#34;Optimization_4x4_12&#34;&gt;&lt;/a&gt;Optimization_4x4_12&lt;/h2&gt;&lt;p&gt;在调用AddDot4x4之前，我们现在打包到4xk的A块。我们看到性能下降。如果检查内部内核，就会注意到每个4xk的A块都被重复打包，每次执行外部循环一次。&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;48&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;49&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;50&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;51&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;52&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;53&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;54&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;55&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;56&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;57&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;58&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;59&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;60&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;61&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;62&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;63&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;64&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;65&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;66&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;67&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;68&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;69&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;70&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;71&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;72&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;73&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;74&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;75&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;76&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;77&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;78&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;79&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;80&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;81&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;82&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;83&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;84&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;85&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;86&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;87&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;88&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;89&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;90&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;91&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;92&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;93&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;94&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;95&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;96&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;97&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;98&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;99&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;100&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;101&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;102&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;103&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;104&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;105&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;106&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;107&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;108&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;109&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;110&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;111&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;112&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;113&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;114&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;115&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;116&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;117&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;118&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;119&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;120&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;121&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;122&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;123&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;124&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;125&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;126&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;127&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;128&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;129&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;130&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;131&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;132&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;133&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;134&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;135&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;136&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;137&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;138&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;139&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;140&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;141&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;142&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;143&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;144&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;145&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;146&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;147&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;148&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;149&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;150&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;151&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;152&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;153&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;154&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;155&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;156&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;157&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;158&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;159&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;160&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Create macros so that the matrices are stored in column-major order */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; A(i,j) a[ (j)*lda + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; B(i,j) b[ (j)*ldb + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; C(i,j) c[ (j)*ldc + (i) ]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Block sizes */&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; mc 256&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; kc 128&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; min( i, j ) ( (i)&amp;lt;(j) ? (i): (j) )&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Routine for computing C = A * B + C */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot4x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; )&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;PackMatrixA&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; * )&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;MY_MMult&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; m, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; n, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i, p, pb, ib;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* This time, we compute a mc x n block of C by a call to the InnerKernel */&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p+=kc )&amp;#123;&lt;br&gt;    pb = &lt;span class=&#34;hljs-built_in&#34;&gt;min&lt;/span&gt;( k-p, kc );&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;m; i+=mc )&amp;#123;&lt;br&gt;      ib = &lt;span class=&#34;hljs-built_in&#34;&gt;min&lt;/span&gt;( m-i, mc );&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;InnerKernel&lt;/span&gt;( ib, n, pb, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i,p ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;(p, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), ldb, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), ldc );&lt;br&gt;    &amp;#125;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;InnerKernel&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; m, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; n, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                       &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                       &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i, j;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;br&gt;    packedA[ m * k ];&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( j=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; j&amp;lt;n; j+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the columns of C, unrolled by 4 */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;m; i+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the rows of C */&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-comment&#34;&gt;/* Update C( i,j ), C( i,j+1 ), C( i,j+2 ), and C( i,j+3 ) in&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	 one routine (four inner products) */&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;PackMatrixA&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;packedA[ i*k ] );&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot4x4&lt;/span&gt;( k, &amp;amp;packedA[ i*k ], &lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt;, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;,j ), ldb, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,j ), ldc );&lt;br&gt;    &amp;#125;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;PackMatrixA&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a_to )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; j;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt;( j=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; j&amp;lt;k; j++)&amp;#123;  &lt;span class=&#34;hljs-comment&#34;&gt;/* loop over columns of A */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;br&gt;      *a_ij_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, j );&lt;br&gt;&lt;br&gt;    *a_to++ = *a_ij_pntr;&lt;br&gt;    *a_to++ = *(a_ij_pntr+&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;);&lt;br&gt;    *a_to++ = *(a_ij_pntr+&lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;);&lt;br&gt;    *a_to++ = *(a_ij_pntr+&lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;);&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;include&lt;/span&gt; &lt;span class=&#34;hljs-meta-string&#34;&gt;&amp;lt;mmintrin.h&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;include&lt;/span&gt; &lt;span class=&#34;hljs-meta-string&#34;&gt;&amp;lt;xmmintrin.h&amp;gt;&lt;/span&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;// SSE&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;include&lt;/span&gt; &lt;span class=&#34;hljs-meta-string&#34;&gt;&amp;lt;pmmintrin.h&amp;gt;&lt;/span&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;// SSE2&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;include&lt;/span&gt; &lt;span class=&#34;hljs-meta-string&#34;&gt;&amp;lt;emmintrin.h&amp;gt;&lt;/span&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;// SSE3&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;typedef&lt;/span&gt; &lt;span class=&#34;hljs-class&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;union&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-class&#34;&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;  __m128d v;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; d[&lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;];&lt;br&gt;&amp;#125; &lt;span class=&#34;hljs-keyword&#34;&gt;v2df_t&lt;/span&gt;;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot4x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* So, this routine computes a 4x4 block of matrix A&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 0, 0 ), C( 0, 1 ), C( 0, 2 ), C( 0, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 1, 0 ), C( 1, 1 ), C( 1, 2 ), C( 1, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 2, 0 ), C( 2, 1 ), C( 2, 2 ), C( 2, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 3, 0 ), C( 3, 1 ), C( 3, 2 ), C( 3, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     Notice that this routine is called with c = C( i, j ) in the&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     previous routine, so these are actually the elements &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i  , j ), C( i  , j+1 ), C( i  , j+2 ), C( i  , j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+1, j ), C( i+1, j+1 ), C( i+1, j+2 ), C( i+1, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+2, j ), C( i+2, j+1 ), C( i+2, j+2 ), C( i+2, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+3, j ), C( i+3, j+1 ), C( i+3, j+2 ), C( i+3, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     in the original matrix C &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     And now we use vector registers and instructions */&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; p;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;v2df_t&lt;/span&gt;&lt;br&gt;    c_00_c_10_vreg,    c_01_c_11_vreg,    c_02_c_12_vreg,    c_03_c_13_vreg,&lt;br&gt;    c_20_c_30_vreg,    c_21_c_31_vreg,    c_22_c_32_vreg,    c_23_c_33_vreg,&lt;br&gt;    a_0p_a_1p_vreg,&lt;br&gt;    a_2p_a_3p_vreg,&lt;br&gt;    b_p0_vreg, b_p1_vreg, b_p2_vreg, b_p3_vreg; &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* Point to the current elements in the four columns of B */&lt;/span&gt;&lt;br&gt;    *b_p0_pntr, *b_p1_pntr, *b_p2_pntr, *b_p3_pntr; &lt;br&gt;    &lt;br&gt;  b_p0_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; );&lt;br&gt;  b_p1_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; );&lt;br&gt;  b_p2_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; );&lt;br&gt;  b_p3_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; );&lt;br&gt;&lt;br&gt;  c_00_c_10_vreg.v = _mm_setzero_pd();   &lt;br&gt;  c_01_c_11_vreg.v = _mm_setzero_pd();&lt;br&gt;  c_02_c_12_vreg.v = _mm_setzero_pd(); &lt;br&gt;  c_03_c_13_vreg.v = _mm_setzero_pd(); &lt;br&gt;  c_20_c_30_vreg.v = _mm_setzero_pd();   &lt;br&gt;  c_21_c_31_vreg.v = _mm_setzero_pd();  &lt;br&gt;  c_22_c_32_vreg.v = _mm_setzero_pd();   &lt;br&gt;  c_23_c_33_vreg.v = _mm_setzero_pd(); &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    a_0p_a_1p_vreg.v = _mm_load_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p ) );&lt;br&gt;    a_2p_a_3p_vreg.v = _mm_load_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, p ) );&lt;br&gt;&lt;br&gt;    b_p0_vreg.v = _mm_loaddup_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) b_p0_pntr++ );   &lt;span class=&#34;hljs-comment&#34;&gt;/* load and duplicate */&lt;/span&gt;&lt;br&gt;    b_p1_vreg.v = _mm_loaddup_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) b_p1_pntr++ );   &lt;span class=&#34;hljs-comment&#34;&gt;/* load and duplicate */&lt;/span&gt;&lt;br&gt;    b_p2_vreg.v = _mm_loaddup_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) b_p2_pntr++ );   &lt;span class=&#34;hljs-comment&#34;&gt;/* load and duplicate */&lt;/span&gt;&lt;br&gt;    b_p3_vreg.v = _mm_loaddup_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) b_p3_pntr++ );   &lt;span class=&#34;hljs-comment&#34;&gt;/* load and duplicate */&lt;/span&gt;&lt;br&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* First row and second rows */&lt;/span&gt;&lt;br&gt;    c_00_c_10_vreg.v += a_0p_a_1p_vreg.v * b_p0_vreg.v;&lt;br&gt;    c_01_c_11_vreg.v += a_0p_a_1p_vreg.v * b_p1_vreg.v;&lt;br&gt;    c_02_c_12_vreg.v += a_0p_a_1p_vreg.v * b_p2_vreg.v;&lt;br&gt;    c_03_c_13_vreg.v += a_0p_a_1p_vreg.v * b_p3_vreg.v;&lt;br&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* Third and fourth rows */&lt;/span&gt;&lt;br&gt;    c_20_c_30_vreg.v += a_2p_a_3p_vreg.v * b_p0_vreg.v;&lt;br&gt;    c_21_c_31_vreg.v += a_2p_a_3p_vreg.v * b_p1_vreg.v;&lt;br&gt;    c_22_c_32_vreg.v += a_2p_a_3p_vreg.v * b_p2_vreg.v;&lt;br&gt;    c_23_c_33_vreg.v += a_2p_a_3p_vreg.v * b_p3_vreg.v;&lt;br&gt;  &amp;#125;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_00_c_10_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_01_c_11_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_02_c_12_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_03_c_13_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;]; &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_00_c_10_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_01_c_11_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_02_c_12_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_03_c_13_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;]; &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_20_c_30_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_21_c_31_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_22_c_32_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_23_c_33_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;]; &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_20_c_30_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_21_c_31_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_22_c_32_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_23_c_33_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;]; &lt;br&gt;&amp;#125;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;Optimization-4x4-13&#34;&gt;&lt;a href=&#34;#Optimization-4x4-13&#34; class=&#34;headerlink&#34; title=&#34;Optimization_4x4_13&#34;&gt;&lt;/a&gt;Optimization_4x4_13&lt;/h2&gt;&lt;p&gt;这个版本保存了A的打包块，以便在InnerKernel的外部循环的第一次迭代之后，使用保存的版本。性能的提升是显而易见的!与上一个版本相比，唯一的变化是增加了if (j&amp;#x3D;&amp;#x3D; 0)。&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;48&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;49&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;50&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;51&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;52&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;53&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;54&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;55&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;56&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;57&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;58&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;59&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;60&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;61&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;62&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;63&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;64&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;65&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;66&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;67&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;68&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;69&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;70&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;71&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;72&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;73&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;74&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;75&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;76&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;77&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;78&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;79&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;80&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;81&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;82&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;83&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;84&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;85&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;86&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;87&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;88&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;89&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;90&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;91&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;92&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;93&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;94&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;95&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;96&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;97&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;98&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;99&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;100&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;101&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;102&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;103&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;104&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;105&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;106&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;107&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;108&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;109&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;110&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;111&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;112&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;113&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;114&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;115&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;116&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;117&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;118&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;119&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;120&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;121&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;122&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;123&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;124&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;125&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;126&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;127&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;128&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;129&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;130&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;131&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;132&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;133&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;134&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;135&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;136&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;137&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;138&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;139&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;140&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;141&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;142&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;143&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;144&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;145&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;146&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;147&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;148&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;149&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;150&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;151&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;152&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;153&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;154&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;155&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;156&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;157&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;158&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;159&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;160&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;161&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs C++&#34;&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Create macros so that the matrices are stored in column-major order */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; A(i,j) a[ (j)*lda + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; B(i,j) b[ (j)*ldb + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; C(i,j) c[ (j)*ldc + (i) ]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Block sizes */&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; mc 256&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; kc 128&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; min( i, j ) ( (i)&amp;lt;(j) ? (i): (j) )&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Routine for computing C = A * B + C */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot4x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; )&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;PackMatrixA&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; * )&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;MY_MMult&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; m, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; n, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i, p, pb, ib;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* This time, we compute a mc x n block of C by a call to the InnerKernel */&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p+=kc )&amp;#123;&lt;br&gt;    pb = &lt;span class=&#34;hljs-built_in&#34;&gt;min&lt;/span&gt;( k-p, kc );&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;m; i+=mc )&amp;#123;&lt;br&gt;      ib = &lt;span class=&#34;hljs-built_in&#34;&gt;min&lt;/span&gt;( m-i, mc );&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;InnerKernel&lt;/span&gt;( ib, n, pb, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i,p ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;(p, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), ldb, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), ldc );&lt;br&gt;    &amp;#125;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;InnerKernel&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; m, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; n, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                       &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                       &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i, j;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;br&gt;    packedA[ m * k ];&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( j=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; j&amp;lt;n; j+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the columns of C, unrolled by 4 */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;m; i+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the rows of C */&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-comment&#34;&gt;/* Update C( i,j ), C( i,j+1 ), C( i,j+2 ), and C( i,j+3 ) in&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	 one routine (four inner products) */&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-keyword&#34;&gt;if&lt;/span&gt; ( j == &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) &lt;span class=&#34;hljs-built_in&#34;&gt;PackMatrixA&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;packedA[ i*k ] );&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot4x4&lt;/span&gt;( k, &amp;amp;packedA[ i*k ], &lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt;, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;,j ), ldb, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,j ), ldc );&lt;br&gt;    &amp;#125;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;PackMatrixA&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a_to )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; j;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt;( j=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; j&amp;lt;k; j++)&amp;#123;  &lt;span class=&#34;hljs-comment&#34;&gt;/* loop over columns of A */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;br&gt;      *a_ij_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, j );&lt;br&gt;&lt;br&gt;    *a_to++ = *a_ij_pntr;&lt;br&gt;    *a_to++ = *(a_ij_pntr+&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;);&lt;br&gt;    *a_to++ = *(a_ij_pntr+&lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;);&lt;br&gt;    *a_to++ = *(a_ij_pntr+&lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;);&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;include&lt;/span&gt; &lt;span class=&#34;hljs-meta-string&#34;&gt;&amp;lt;mmintrin.h&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;include&lt;/span&gt; &lt;span class=&#34;hljs-meta-string&#34;&gt;&amp;lt;xmmintrin.h&amp;gt;&lt;/span&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;// SSE&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;include&lt;/span&gt; &lt;span class=&#34;hljs-meta-string&#34;&gt;&amp;lt;pmmintrin.h&amp;gt;&lt;/span&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;// SSE2&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;include&lt;/span&gt; &lt;span class=&#34;hljs-meta-string&#34;&gt;&amp;lt;emmintrin.h&amp;gt;&lt;/span&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;// SSE3&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;typedef&lt;/span&gt; &lt;span class=&#34;hljs-class&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;union&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-class&#34;&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;  __m128d v;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; d[&lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;];&lt;br&gt;&amp;#125; &lt;span class=&#34;hljs-keyword&#34;&gt;v2df_t&lt;/span&gt;;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot4x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* So, this routine computes a 4x4 block of matrix A&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 0, 0 ), C( 0, 1 ), C( 0, 2 ), C( 0, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 1, 0 ), C( 1, 1 ), C( 1, 2 ), C( 1, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 2, 0 ), C( 2, 1 ), C( 2, 2 ), C( 2, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 3, 0 ), C( 3, 1 ), C( 3, 2 ), C( 3, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     Notice that this routine is called with c = C( i, j ) in the&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     previous routine, so these are actually the elements &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i  , j ), C( i  , j+1 ), C( i  , j+2 ), C( i  , j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+1, j ), C( i+1, j+1 ), C( i+1, j+2 ), C( i+1, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+2, j ), C( i+2, j+1 ), C( i+2, j+2 ), C( i+2, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+3, j ), C( i+3, j+1 ), C( i+3, j+2 ), C( i+3, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     in the original matrix C &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     And now we use vector registers and instructions */&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; p;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;v2df_t&lt;/span&gt;&lt;br&gt;    c_00_c_10_vreg,    c_01_c_11_vreg,    c_02_c_12_vreg,    c_03_c_13_vreg,&lt;br&gt;    c_20_c_30_vreg,    c_21_c_31_vreg,    c_22_c_32_vreg,    c_23_c_33_vreg,&lt;br&gt;    a_0p_a_1p_vreg,&lt;br&gt;    a_2p_a_3p_vreg,&lt;br&gt;    b_p0_vreg, b_p1_vreg, b_p2_vreg, b_p3_vreg; &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* Point to the current elements in the four columns of B */&lt;/span&gt;&lt;br&gt;    *b_p0_pntr, *b_p1_pntr, *b_p2_pntr, *b_p3_pntr; &lt;br&gt;    &lt;br&gt;  b_p0_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; );&lt;br&gt;  b_p1_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; );&lt;br&gt;  b_p2_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; );&lt;br&gt;  b_p3_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; );&lt;br&gt;&lt;br&gt;  c_00_c_10_vreg.v = _mm_setzero_pd();   &lt;br&gt;  c_01_c_11_vreg.v = _mm_setzero_pd();&lt;br&gt;  c_02_c_12_vreg.v = _mm_setzero_pd(); &lt;br&gt;  c_03_c_13_vreg.v = _mm_setzero_pd(); &lt;br&gt;  c_20_c_30_vreg.v = _mm_setzero_pd();   &lt;br&gt;  c_21_c_31_vreg.v = _mm_setzero_pd();  &lt;br&gt;  c_22_c_32_vreg.v = _mm_setzero_pd();   &lt;br&gt;  c_23_c_33_vreg.v = _mm_setzero_pd(); &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    a_0p_a_1p_vreg.v = _mm_load_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) a );&lt;br&gt;    a_2p_a_3p_vreg.v = _mm_load_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) ( a+&lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) );&lt;br&gt;    a += &lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt;;&lt;br&gt;&lt;br&gt;    b_p0_vreg.v = _mm_loaddup_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) b_p0_pntr++ );   &lt;span class=&#34;hljs-comment&#34;&gt;/* load and duplicate */&lt;/span&gt;&lt;br&gt;    b_p1_vreg.v = _mm_loaddup_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) b_p1_pntr++ );   &lt;span class=&#34;hljs-comment&#34;&gt;/* load and duplicate */&lt;/span&gt;&lt;br&gt;    b_p2_vreg.v = _mm_loaddup_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) b_p2_pntr++ );   &lt;span class=&#34;hljs-comment&#34;&gt;/* load and duplicate */&lt;/span&gt;&lt;br&gt;    b_p3_vreg.v = _mm_loaddup_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) b_p3_pntr++ );   &lt;span class=&#34;hljs-comment&#34;&gt;/* load and duplicate */&lt;/span&gt;&lt;br&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* First row and second rows */&lt;/span&gt;&lt;br&gt;    c_00_c_10_vreg.v += a_0p_a_1p_vreg.v * b_p0_vreg.v;&lt;br&gt;    c_01_c_11_vreg.v += a_0p_a_1p_vreg.v * b_p1_vreg.v;&lt;br&gt;    c_02_c_12_vreg.v += a_0p_a_1p_vreg.v * b_p2_vreg.v;&lt;br&gt;    c_03_c_13_vreg.v += a_0p_a_1p_vreg.v * b_p3_vreg.v;&lt;br&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* Third and fourth rows */&lt;/span&gt;&lt;br&gt;    c_20_c_30_vreg.v += a_2p_a_3p_vreg.v * b_p0_vreg.v;&lt;br&gt;    c_21_c_31_vreg.v += a_2p_a_3p_vreg.v * b_p1_vreg.v;&lt;br&gt;    c_22_c_32_vreg.v += a_2p_a_3p_vreg.v * b_p2_vreg.v;&lt;br&gt;    c_23_c_33_vreg.v += a_2p_a_3p_vreg.v * b_p3_vreg.v;&lt;br&gt;  &amp;#125;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_00_c_10_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_01_c_11_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_02_c_12_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_03_c_13_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;]; &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_00_c_10_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_01_c_11_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_02_c_12_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_03_c_13_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;]; &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_20_c_30_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_21_c_31_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_22_c_32_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_23_c_33_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;]; &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_20_c_30_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_21_c_31_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_22_c_32_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_23_c_33_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;]; &lt;br&gt;&amp;#125;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;Optimization-4x4-14&#34;&gt;&lt;a href=&#34;#Optimization-4x4-14&#34; class=&#34;headerlink&#34; title=&#34;Optimization_4x4_14&#34;&gt;&lt;/a&gt;Optimization_4x4_14&lt;/h2&gt;&lt;p&gt;我们现在打包b的kx4块，注意，在这个版本中，面板是重复打包的，这会对性能产生不利影响。&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;48&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;49&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;50&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;51&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;52&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;53&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;54&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;55&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;56&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;57&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;58&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;59&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;60&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;61&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;62&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;63&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;64&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;65&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;66&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;67&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;68&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;69&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;70&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;71&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;72&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;73&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;74&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;75&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;76&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;77&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;78&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;79&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;80&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;81&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;82&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;83&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;84&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;85&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;86&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;87&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;88&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;89&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;90&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;91&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;92&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;93&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;94&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;95&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;96&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;97&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;98&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;99&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;100&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;101&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;102&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;103&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;104&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;105&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;106&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;107&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;108&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;109&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;110&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;111&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;112&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;113&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;114&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;115&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;116&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;117&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;118&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;119&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;120&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;121&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;122&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;123&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;124&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;125&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;126&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;127&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;128&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;129&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;130&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;131&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;132&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;133&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;134&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;135&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;136&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;137&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;138&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;139&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;140&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;141&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;142&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;143&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;144&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;145&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;146&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;147&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;148&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;149&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;150&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;151&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;152&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;153&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;154&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;155&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;156&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;157&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;158&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;159&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;160&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;161&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;162&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;163&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;164&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;165&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;166&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;167&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;168&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;169&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;170&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;171&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;172&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;173&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;174&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Create macros so that the matrices are stored in column-major order */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; A(i,j) a[ (j)*lda + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; B(i,j) b[ (j)*ldb + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; C(i,j) c[ (j)*ldc + (i) ]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Block sizes */&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; mc 256&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; kc 128&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; min( i, j ) ( (i)&amp;lt;(j) ? (i): (j) )&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Routine for computing C = A * B + C */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot4x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; )&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;PackMatrixA&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; * )&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;PackMatrixB&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; * )&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;InnerKernel&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; )&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;MY_MMult&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; m, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; n, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i, p, pb, ib;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* This time, we compute a mc x n block of C by a call to the InnerKernel */&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p+=kc )&amp;#123;&lt;br&gt;    pb = &lt;span class=&#34;hljs-built_in&#34;&gt;min&lt;/span&gt;( k-p, kc );&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;m; i+=mc )&amp;#123;&lt;br&gt;      ib = &lt;span class=&#34;hljs-built_in&#34;&gt;min&lt;/span&gt;( m-i, mc );&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;InnerKernel&lt;/span&gt;( ib, n, pb, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i,p ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;(p, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), ldb, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), ldc, i==&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; );&lt;br&gt;    &amp;#125;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;InnerKernel&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; m, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; n, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                       &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                       &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; first_time )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i, j;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;br&gt;    packedA[ m * k ], packedB[ k*n ];&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( j=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; j&amp;lt;n; j+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the columns of C, unrolled by 4 */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;PackMatrixB&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, j ), ldb, &amp;amp;packedB[ j*k ] );&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;m; i+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the rows of C */&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-comment&#34;&gt;/* Update C( i,j ), C( i,j+1 ), C( i,j+2 ), and C( i,j+3 ) in&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	 one routine (four inner products) */&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-keyword&#34;&gt;if&lt;/span&gt; ( j == &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) &lt;br&gt;	&lt;span class=&#34;hljs-built_in&#34;&gt;PackMatrixA&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;packedA[ i*k ] );&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot4x4&lt;/span&gt;( k, &amp;amp;packedA[ i*k ], &lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt;, &amp;amp;packedB[ j*k ], k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,j ), ldc );&lt;br&gt;    &amp;#125;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;PackMatrixA&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a_to )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; j;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt;( j=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; j&amp;lt;k; j++)&amp;#123;  &lt;span class=&#34;hljs-comment&#34;&gt;/* loop over columns of A */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;br&gt;      *a_ij_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, j );&lt;br&gt;&lt;br&gt;    *a_to     = *a_ij_pntr;&lt;br&gt;    *(a_to+&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;) = *(a_ij_pntr+&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;);&lt;br&gt;    *(a_to+&lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;) = *(a_ij_pntr+&lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;);&lt;br&gt;    *(a_to+&lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;) = *(a_ij_pntr+&lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;);&lt;br&gt;&lt;br&gt;    a_to += &lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt;;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;PackMatrixB&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b_to )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;br&gt;    *b_i0_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), *b_i1_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ),&lt;br&gt;    *b_i2_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ), *b_i3_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; );&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt;( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;k; i++)&amp;#123;  &lt;span class=&#34;hljs-comment&#34;&gt;/* loop over rows of B */&lt;/span&gt;&lt;br&gt;    *b_to++ = *b_i0_pntr++;&lt;br&gt;    *b_to++ = *b_i1_pntr++;&lt;br&gt;    *b_to++ = *b_i2_pntr++;&lt;br&gt;    *b_to++ = *b_i3_pntr++;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;include&lt;/span&gt; &lt;span class=&#34;hljs-meta-string&#34;&gt;&amp;lt;mmintrin.h&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;include&lt;/span&gt; &lt;span class=&#34;hljs-meta-string&#34;&gt;&amp;lt;xmmintrin.h&amp;gt;&lt;/span&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;// SSE&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;include&lt;/span&gt; &lt;span class=&#34;hljs-meta-string&#34;&gt;&amp;lt;pmmintrin.h&amp;gt;&lt;/span&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;// SSE2&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;include&lt;/span&gt; &lt;span class=&#34;hljs-meta-string&#34;&gt;&amp;lt;emmintrin.h&amp;gt;&lt;/span&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;// SSE3&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;typedef&lt;/span&gt; &lt;span class=&#34;hljs-class&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;union&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-class&#34;&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;  __m128d v;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; d[&lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;];&lt;br&gt;&amp;#125; &lt;span class=&#34;hljs-keyword&#34;&gt;v2df_t&lt;/span&gt;;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot4x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* So, this routine computes a 4x4 block of matrix A&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 0, 0 ), C( 0, 1 ), C( 0, 2 ), C( 0, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 1, 0 ), C( 1, 1 ), C( 1, 2 ), C( 1, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 2, 0 ), C( 2, 1 ), C( 2, 2 ), C( 2, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 3, 0 ), C( 3, 1 ), C( 3, 2 ), C( 3, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     Notice that this routine is called with c = C( i, j ) in the&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     previous routine, so these are actually the elements &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i  , j ), C( i  , j+1 ), C( i  , j+2 ), C( i  , j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+1, j ), C( i+1, j+1 ), C( i+1, j+2 ), C( i+1, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+2, j ), C( i+2, j+1 ), C( i+2, j+2 ), C( i+2, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+3, j ), C( i+3, j+1 ), C( i+3, j+2 ), C( i+3, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     in the original matrix C &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     And now we use vector registers and instructions */&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; p;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;v2df_t&lt;/span&gt;&lt;br&gt;    c_00_c_10_vreg,    c_01_c_11_vreg,    c_02_c_12_vreg,    c_03_c_13_vreg,&lt;br&gt;    c_20_c_30_vreg,    c_21_c_31_vreg,    c_22_c_32_vreg,    c_23_c_33_vreg,&lt;br&gt;    a_0p_a_1p_vreg,&lt;br&gt;    a_2p_a_3p_vreg,&lt;br&gt;    b_p0_vreg, b_p1_vreg, b_p2_vreg, b_p3_vreg; &lt;br&gt;&lt;br&gt;  c_00_c_10_vreg.v = _mm_setzero_pd();   &lt;br&gt;  c_01_c_11_vreg.v = _mm_setzero_pd();&lt;br&gt;  c_02_c_12_vreg.v = _mm_setzero_pd(); &lt;br&gt;  c_03_c_13_vreg.v = _mm_setzero_pd(); &lt;br&gt;  c_20_c_30_vreg.v = _mm_setzero_pd();   &lt;br&gt;  c_21_c_31_vreg.v = _mm_setzero_pd();  &lt;br&gt;  c_22_c_32_vreg.v = _mm_setzero_pd();   &lt;br&gt;  c_23_c_33_vreg.v = _mm_setzero_pd(); &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    a_0p_a_1p_vreg.v = _mm_load_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) a );&lt;br&gt;    a_2p_a_3p_vreg.v = _mm_load_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) ( a+&lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) );&lt;br&gt;    a += &lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt;;&lt;br&gt;&lt;br&gt;    b_p0_vreg.v = _mm_loaddup_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) b );       &lt;span class=&#34;hljs-comment&#34;&gt;/* load and duplicate */&lt;/span&gt;&lt;br&gt;    b_p1_vreg.v = _mm_loaddup_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) (b+&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;) );   &lt;span class=&#34;hljs-comment&#34;&gt;/* load and duplicate */&lt;/span&gt;&lt;br&gt;    b_p2_vreg.v = _mm_loaddup_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) (b+&lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;) );   &lt;span class=&#34;hljs-comment&#34;&gt;/* load and duplicate */&lt;/span&gt;&lt;br&gt;    b_p3_vreg.v = _mm_loaddup_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) (b+&lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;) );   &lt;span class=&#34;hljs-comment&#34;&gt;/* load and duplicate */&lt;/span&gt;&lt;br&gt;&lt;br&gt;    b += &lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt;;&lt;br&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* First row and second rows */&lt;/span&gt;&lt;br&gt;    c_00_c_10_vreg.v += a_0p_a_1p_vreg.v * b_p0_vreg.v;&lt;br&gt;    c_01_c_11_vreg.v += a_0p_a_1p_vreg.v * b_p1_vreg.v;&lt;br&gt;    c_02_c_12_vreg.v += a_0p_a_1p_vreg.v * b_p2_vreg.v;&lt;br&gt;    c_03_c_13_vreg.v += a_0p_a_1p_vreg.v * b_p3_vreg.v;&lt;br&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* Third and fourth rows */&lt;/span&gt;&lt;br&gt;    c_20_c_30_vreg.v += a_2p_a_3p_vreg.v * b_p0_vreg.v;&lt;br&gt;    c_21_c_31_vreg.v += a_2p_a_3p_vreg.v * b_p1_vreg.v;&lt;br&gt;    c_22_c_32_vreg.v += a_2p_a_3p_vreg.v * b_p2_vreg.v;&lt;br&gt;    c_23_c_33_vreg.v += a_2p_a_3p_vreg.v * b_p3_vreg.v;&lt;br&gt;  &amp;#125;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_00_c_10_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_01_c_11_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_02_c_12_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_03_c_13_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;]; &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_00_c_10_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_01_c_11_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_02_c_12_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_03_c_13_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;]; &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_20_c_30_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_21_c_31_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_22_c_32_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_23_c_33_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;]; &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_20_c_30_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_21_c_31_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_22_c_32_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_23_c_33_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;]; &lt;br&gt;&amp;#125;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;Optimization-4x4-15&#34;&gt;&lt;a href=&#34;#Optimization-4x4-15&#34; class=&#34;headerlink&#34; title=&#34;Optimization_4x4_15&#34;&gt;&lt;/a&gt;Optimization_4x4_15&lt;/h2&gt;&lt;p&gt;并且，我们再次添加了一些代码，这样我们就可以避免重新打包b的kx4块。现在性能令人印象深刻!&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;48&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;49&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;50&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;51&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;52&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;53&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;54&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;55&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;56&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;57&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;58&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;59&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;60&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;61&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;62&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;63&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;64&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;65&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;66&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;67&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;68&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;69&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;70&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;71&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;72&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;73&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;74&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;75&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;76&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;77&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;78&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;79&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;80&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;81&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;82&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;83&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;84&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;85&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;86&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;87&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;88&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;89&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;90&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;91&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;92&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;93&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;94&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;95&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;96&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;97&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;98&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;99&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;100&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;101&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;102&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;103&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;104&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;105&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;106&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;107&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;108&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;109&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;110&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;111&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;112&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;113&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;114&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;115&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;116&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;117&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;118&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;119&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;120&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;121&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;122&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;123&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;124&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;125&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;126&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;127&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;128&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;129&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;130&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;131&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;132&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;133&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;134&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;135&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;136&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;137&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;138&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;139&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;140&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;141&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;142&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;143&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;144&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;145&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;146&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;147&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;148&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;149&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;150&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;151&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;152&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;153&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;154&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;155&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;156&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;157&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;158&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;159&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;160&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;161&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;162&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;163&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;164&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;165&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;166&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;167&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;168&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;169&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;170&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;171&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;172&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;173&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;174&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;175&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;176&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;177&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;178&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Create macros so that the matrices are stored in column-major order */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; A(i,j) a[ (j)*lda + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; B(i,j) b[ (j)*ldb + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; C(i,j) c[ (j)*ldc + (i) ]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Block sizes */&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; mc 256&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; kc 128&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; nb 1000&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; min( i, j ) ( (i)&amp;lt;(j) ? (i): (j) )&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Routine for computing C = A * B + C */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot4x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; )&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;PackMatrixA&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; * )&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;PackMatrixB&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; * )&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;InnerKernel&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; )&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;MY_MMult&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; m, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; n, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i, p, pb, ib;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* This time, we compute a mc x n block of C by a call to the InnerKernel */&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p+=kc )&amp;#123;&lt;br&gt;    pb = &lt;span class=&#34;hljs-built_in&#34;&gt;min&lt;/span&gt;( k-p, kc );&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;m; i+=mc )&amp;#123;&lt;br&gt;      ib = &lt;span class=&#34;hljs-built_in&#34;&gt;min&lt;/span&gt;( m-i, mc );&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;InnerKernel&lt;/span&gt;( ib, n, pb, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i,p ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;(p, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), ldb, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), ldc, i==&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; );&lt;br&gt;    &amp;#125;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;InnerKernel&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; m, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; n, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                       &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                       &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; first_time )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i, j;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;br&gt;    packedA[ m * k ];&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;br&gt;    packedB[ kc*nb ];    &lt;span class=&#34;hljs-comment&#34;&gt;/* Note: using a static buffer is not thread safe... */&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( j=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; j&amp;lt;n; j+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the columns of C, unrolled by 4 */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;if&lt;/span&gt; ( first_time )&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;PackMatrixB&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, j ), ldb, &amp;amp;packedB[ j*k ] );&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;m; i+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the rows of C */&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-comment&#34;&gt;/* Update C( i,j ), C( i,j+1 ), C( i,j+2 ), and C( i,j+3 ) in&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	 one routine (four inner products) */&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-keyword&#34;&gt;if&lt;/span&gt; ( j == &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) &lt;br&gt;	&lt;span class=&#34;hljs-built_in&#34;&gt;PackMatrixA&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;packedA[ i*k ] );&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot4x4&lt;/span&gt;( k, &amp;amp;packedA[ i*k ], &lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt;, &amp;amp;packedB[ j*k ], k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,j ), ldc );&lt;br&gt;    &amp;#125;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;PackMatrixA&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a_to )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; j;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt;( j=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; j&amp;lt;k; j++)&amp;#123;  &lt;span class=&#34;hljs-comment&#34;&gt;/* loop over columns of A */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;br&gt;      *a_ij_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, j );&lt;br&gt;&lt;br&gt;    *a_to     = *a_ij_pntr;&lt;br&gt;    *(a_to+&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;) = *(a_ij_pntr+&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;);&lt;br&gt;    *(a_to+&lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;) = *(a_ij_pntr+&lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;);&lt;br&gt;    *(a_to+&lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;) = *(a_ij_pntr+&lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;);&lt;br&gt;&lt;br&gt;    a_to += &lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt;;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;PackMatrixB&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b_to )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;br&gt;    *b_i0_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), *b_i1_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ),&lt;br&gt;    *b_i2_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ), *b_i3_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; );&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt;( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;k; i++)&amp;#123;  &lt;span class=&#34;hljs-comment&#34;&gt;/* loop over rows of B */&lt;/span&gt;&lt;br&gt;    *b_to++ = *b_i0_pntr++;&lt;br&gt;    *b_to++ = *b_i1_pntr++;&lt;br&gt;    *b_to++ = *b_i2_pntr++;&lt;br&gt;    *b_to++ = *b_i3_pntr++;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;include&lt;/span&gt; &lt;span class=&#34;hljs-meta-string&#34;&gt;&amp;lt;mmintrin.h&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;include&lt;/span&gt; &lt;span class=&#34;hljs-meta-string&#34;&gt;&amp;lt;xmmintrin.h&amp;gt;&lt;/span&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;// SSE&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;include&lt;/span&gt; &lt;span class=&#34;hljs-meta-string&#34;&gt;&amp;lt;pmmintrin.h&amp;gt;&lt;/span&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;// SSE2&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;include&lt;/span&gt; &lt;span class=&#34;hljs-meta-string&#34;&gt;&amp;lt;emmintrin.h&amp;gt;&lt;/span&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;// SSE3&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;typedef&lt;/span&gt; &lt;span class=&#34;hljs-class&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;union&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-class&#34;&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;  __m128d v;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; d[&lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;];&lt;br&gt;&amp;#125; &lt;span class=&#34;hljs-keyword&#34;&gt;v2df_t&lt;/span&gt;;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot4x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* So, this routine computes a 4x4 block of matrix A&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 0, 0 ), C( 0, 1 ), C( 0, 2 ), C( 0, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 1, 0 ), C( 1, 1 ), C( 1, 2 ), C( 1, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 2, 0 ), C( 2, 1 ), C( 2, 2 ), C( 2, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 3, 0 ), C( 3, 1 ), C( 3, 2 ), C( 3, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     Notice that this routine is called with c = C( i, j ) in the&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     previous routine, so these are actually the elements &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i  , j ), C( i  , j+1 ), C( i  , j+2 ), C( i  , j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+1, j ), C( i+1, j+1 ), C( i+1, j+2 ), C( i+1, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+2, j ), C( i+2, j+1 ), C( i+2, j+2 ), C( i+2, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+3, j ), C( i+3, j+1 ), C( i+3, j+2 ), C( i+3, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     in the original matrix C &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     And now we use vector registers and instructions */&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; p;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;v2df_t&lt;/span&gt;&lt;br&gt;    c_00_c_10_vreg,    c_01_c_11_vreg,    c_02_c_12_vreg,    c_03_c_13_vreg,&lt;br&gt;    c_20_c_30_vreg,    c_21_c_31_vreg,    c_22_c_32_vreg,    c_23_c_33_vreg,&lt;br&gt;    a_0p_a_1p_vreg,&lt;br&gt;    a_2p_a_3p_vreg,&lt;br&gt;    b_p0_vreg, b_p1_vreg, b_p2_vreg, b_p3_vreg; &lt;br&gt;&lt;br&gt;  c_00_c_10_vreg.v = _mm_setzero_pd();   &lt;br&gt;  c_01_c_11_vreg.v = _mm_setzero_pd();&lt;br&gt;  c_02_c_12_vreg.v = _mm_setzero_pd(); &lt;br&gt;  c_03_c_13_vreg.v = _mm_setzero_pd(); &lt;br&gt;  c_20_c_30_vreg.v = _mm_setzero_pd();   &lt;br&gt;  c_21_c_31_vreg.v = _mm_setzero_pd();  &lt;br&gt;  c_22_c_32_vreg.v = _mm_setzero_pd();   &lt;br&gt;  c_23_c_33_vreg.v = _mm_setzero_pd(); &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    a_0p_a_1p_vreg.v = _mm_load_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) a );&lt;br&gt;    a_2p_a_3p_vreg.v = _mm_load_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) ( a+&lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) );&lt;br&gt;    a += &lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt;;&lt;br&gt;&lt;br&gt;    b_p0_vreg.v = _mm_loaddup_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) b );       &lt;span class=&#34;hljs-comment&#34;&gt;/* load and duplicate */&lt;/span&gt;&lt;br&gt;    b_p1_vreg.v = _mm_loaddup_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) (b+&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;) );   &lt;span class=&#34;hljs-comment&#34;&gt;/* load and duplicate */&lt;/span&gt;&lt;br&gt;    b_p2_vreg.v = _mm_loaddup_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) (b+&lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;) );   &lt;span class=&#34;hljs-comment&#34;&gt;/* load and duplicate */&lt;/span&gt;&lt;br&gt;    b_p3_vreg.v = _mm_loaddup_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) (b+&lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;) );   &lt;span class=&#34;hljs-comment&#34;&gt;/* load and duplicate */&lt;/span&gt;&lt;br&gt;&lt;br&gt;    b += &lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt;;&lt;br&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* First row and second rows */&lt;/span&gt;&lt;br&gt;    c_00_c_10_vreg.v += a_0p_a_1p_vreg.v * b_p0_vreg.v;&lt;br&gt;    c_01_c_11_vreg.v += a_0p_a_1p_vreg.v * b_p1_vreg.v;&lt;br&gt;    c_02_c_12_vreg.v += a_0p_a_1p_vreg.v * b_p2_vreg.v;&lt;br&gt;    c_03_c_13_vreg.v += a_0p_a_1p_vreg.v * b_p3_vreg.v;&lt;br&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* Third and fourth rows */&lt;/span&gt;&lt;br&gt;    c_20_c_30_vreg.v += a_2p_a_3p_vreg.v * b_p0_vreg.v;&lt;br&gt;    c_21_c_31_vreg.v += a_2p_a_3p_vreg.v * b_p1_vreg.v;&lt;br&gt;    c_22_c_32_vreg.v += a_2p_a_3p_vreg.v * b_p2_vreg.v;&lt;br&gt;    c_23_c_33_vreg.v += a_2p_a_3p_vreg.v * b_p3_vreg.v;&lt;br&gt;  &amp;#125;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_00_c_10_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_01_c_11_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_02_c_12_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_03_c_13_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;]; &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_00_c_10_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_01_c_11_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_02_c_12_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_03_c_13_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;]; &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_20_c_30_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_21_c_31_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_22_c_32_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_23_c_33_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;]; &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_20_c_30_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_21_c_31_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_22_c_32_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_23_c_33_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;]; &lt;br&gt;&amp;#125;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://xingyuanjie.top/2023/06/07/gemm0006/</guid>
            <title>Blocking to maintain performance</title>
            <link>https://xingyuanjie.top/2023/06/07/gemm0006/</link>
            <category>blas</category>
            <category>gemm</category>
            <category>gemv</category>
            <pubDate>Wed, 07 Jun 2023 13:41:06 +0800</pubDate>
            <description><![CDATA[ &lt;h2 id=&#34;Blocking-to-maintain-performance&#34;&gt;&lt;a href=&#34;#Blocking-to-maintain-performance&#34; class=&#34;headerlink&#34; title=&#34;Blocking to maintain performance&#34;&gt;&lt;/a&gt;Blocking to maintain performance&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;为了保持较小问题规模的性能，我们分块矩阵C(以及相应的A和B):&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/flame/how-to-optimize-gemm/wiki/Optimization_4x4_11&#34;&gt;Optimization_4x4_11 · flame&amp;#x2F;how-to-optimize-gemm Wiki (github.com)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;现在，性能得到了保持:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/2023/06/07/gemm0006/compare_MMult0_MMult-4x4-11.png&#34; alt=&#34;img&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/2023/06/07/gemm0006/compare_MMult-4x4-10_MMult-4x4-11.png&#34; alt=&#34;img&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;Optimization-4x4-11&#34;&gt;&lt;a href=&#34;#Optimization-4x4-11&#34; class=&#34;headerlink&#34; title=&#34;Optimization_4x4_11&#34;&gt;&lt;/a&gt;Optimization_4x4_11&lt;/h2&gt;&lt;p&gt;我们注意到，对于迄今为止的所有优化，当涉及的矩阵比L2缓存所能容纳的矩阵大得多时，性能会大幅下降。在这个优化中，我们创建了一个额外的分块级别来克服这个问题。我们现在有一个主例程，它调用GotoBLAS和BLIS使用的内部内核，然后AddDot4x4例程是BLIS使用的微内核。&lt;/p&gt;
&lt;p&gt;这一步主要是为了分块，把原来的MY_MMult变成了InnerKernel，而现在的MY_MMult作用就是为了分块。分块大小通过宏定义给出。&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;48&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;49&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;50&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;51&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;52&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;53&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;54&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;55&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;56&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;57&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;58&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;59&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;60&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;61&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;62&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;63&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;64&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;65&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;66&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;67&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;68&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;69&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;70&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;71&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;72&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;73&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;74&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;75&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;76&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;77&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;78&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;79&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;80&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;81&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;82&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;83&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;84&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;85&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;86&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;87&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;88&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;89&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;90&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;91&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;92&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;93&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;94&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;95&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;96&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;97&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;98&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;99&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;100&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;101&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;102&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;103&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;104&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;105&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;106&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;107&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;108&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;109&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;110&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;111&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;112&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;113&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;114&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;115&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;116&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;117&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;118&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;119&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;120&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;121&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;122&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;123&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;124&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;125&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;126&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;127&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;128&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;129&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;130&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;131&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;132&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;133&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;134&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;135&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;136&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;137&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;138&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;139&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;140&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;141&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;142&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Create macros so that the matrices are stored in column-major order */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; A(i,j) a[ (j)*lda + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; B(i,j) b[ (j)*ldb + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; C(i,j) c[ (j)*ldc + (i) ]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Block sizes */&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; mc 256&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; kc 128&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; min( i, j ) ( (i)&amp;lt;(j) ? (i): (j) )&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Routine for computing C = A * B + C */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot4x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; )&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;MY_MMult&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; m, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; n, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i, j, p, pb, ib;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* This time, we compute a mc x n block of C by a call to the InnerKernel */&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p+=kc )&amp;#123;&lt;br&gt;    pb = &lt;span class=&#34;hljs-built_in&#34;&gt;min&lt;/span&gt;( k-p, kc );&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;m; i+=mc )&amp;#123;&lt;br&gt;      ib = &lt;span class=&#34;hljs-built_in&#34;&gt;min&lt;/span&gt;( m-i, mc );&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;InnerKernel&lt;/span&gt;( ib, n, pb, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i,p ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;(p, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), ldb, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), ldc );&lt;br&gt;    &amp;#125;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;InnerKernel&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; m, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; n, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                       &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                       &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i, j;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( j=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; j&amp;lt;n; j+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the columns of C, unrolled by 4 */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;m; i+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the rows of C */&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-comment&#34;&gt;/* Update C( i,j ), C( i,j+1 ), C( i,j+2 ), and C( i,j+3 ) in&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	 one routine (four inner products) */&lt;/span&gt;&lt;br&gt;&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot4x4&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i,&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;,j ), ldb, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,j ), ldc );&lt;br&gt;    &amp;#125;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;include&lt;/span&gt; &lt;span class=&#34;hljs-meta-string&#34;&gt;&amp;lt;mmintrin.h&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;include&lt;/span&gt; &lt;span class=&#34;hljs-meta-string&#34;&gt;&amp;lt;xmmintrin.h&amp;gt;&lt;/span&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;// SSE&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;include&lt;/span&gt; &lt;span class=&#34;hljs-meta-string&#34;&gt;&amp;lt;pmmintrin.h&amp;gt;&lt;/span&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;// SSE2&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;include&lt;/span&gt; &lt;span class=&#34;hljs-meta-string&#34;&gt;&amp;lt;emmintrin.h&amp;gt;&lt;/span&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;// SSE3&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;typedef&lt;/span&gt; &lt;span class=&#34;hljs-class&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;union&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-class&#34;&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;  __m128d v;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; d[&lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;];&lt;br&gt;&amp;#125; &lt;span class=&#34;hljs-keyword&#34;&gt;v2df_t&lt;/span&gt;;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot4x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* So, this routine computes a 4x4 block of matrix A&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 0, 0 ), C( 0, 1 ), C( 0, 2 ), C( 0, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 1, 0 ), C( 1, 1 ), C( 1, 2 ), C( 1, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 2, 0 ), C( 2, 1 ), C( 2, 2 ), C( 2, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 3, 0 ), C( 3, 1 ), C( 3, 2 ), C( 3, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     Notice that this routine is called with c = C( i, j ) in the&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     previous routine, so these are actually the elements &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i  , j ), C( i  , j+1 ), C( i  , j+2 ), C( i  , j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+1, j ), C( i+1, j+1 ), C( i+1, j+2 ), C( i+1, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+2, j ), C( i+2, j+1 ), C( i+2, j+2 ), C( i+2, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+3, j ), C( i+3, j+1 ), C( i+3, j+2 ), C( i+3, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     in the original matrix C &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     And now we use vector registers and instructions */&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; p;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;v2df_t&lt;/span&gt;&lt;br&gt;    c_00_c_10_vreg,    c_01_c_11_vreg,    c_02_c_12_vreg,    c_03_c_13_vreg,&lt;br&gt;    c_20_c_30_vreg,    c_21_c_31_vreg,    c_22_c_32_vreg,    c_23_c_33_vreg,&lt;br&gt;    a_0p_a_1p_vreg,&lt;br&gt;    a_2p_a_3p_vreg,&lt;br&gt;    b_p0_vreg, b_p1_vreg, b_p2_vreg, b_p3_vreg; &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* Point to the current elements in the four columns of B */&lt;/span&gt;&lt;br&gt;    *b_p0_pntr, *b_p1_pntr, *b_p2_pntr, *b_p3_pntr; &lt;br&gt;    &lt;br&gt;  b_p0_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; );&lt;br&gt;  b_p1_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; );&lt;br&gt;  b_p2_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; );&lt;br&gt;  b_p3_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; );&lt;br&gt;&lt;br&gt;  c_00_c_10_vreg.v = _mm_setzero_pd();   &lt;br&gt;  c_01_c_11_vreg.v = _mm_setzero_pd();&lt;br&gt;  c_02_c_12_vreg.v = _mm_setzero_pd(); &lt;br&gt;  c_03_c_13_vreg.v = _mm_setzero_pd(); &lt;br&gt;  c_20_c_30_vreg.v = _mm_setzero_pd();   &lt;br&gt;  c_21_c_31_vreg.v = _mm_setzero_pd();  &lt;br&gt;  c_22_c_32_vreg.v = _mm_setzero_pd();   &lt;br&gt;  c_23_c_33_vreg.v = _mm_setzero_pd(); &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    a_0p_a_1p_vreg.v = _mm_load_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p ) );&lt;br&gt;    a_2p_a_3p_vreg.v = _mm_load_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, p ) );&lt;br&gt;&lt;br&gt;    b_p0_vreg.v = _mm_loaddup_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) b_p0_pntr++ );   &lt;span class=&#34;hljs-comment&#34;&gt;/* load and duplicate */&lt;/span&gt;&lt;br&gt;    b_p1_vreg.v = _mm_loaddup_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) b_p1_pntr++ );   &lt;span class=&#34;hljs-comment&#34;&gt;/* load and duplicate */&lt;/span&gt;&lt;br&gt;    b_p2_vreg.v = _mm_loaddup_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) b_p2_pntr++ );   &lt;span class=&#34;hljs-comment&#34;&gt;/* load and duplicate */&lt;/span&gt;&lt;br&gt;    b_p3_vreg.v = _mm_loaddup_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) b_p3_pntr++ );   &lt;span class=&#34;hljs-comment&#34;&gt;/* load and duplicate */&lt;/span&gt;&lt;br&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* First row and second rows */&lt;/span&gt;&lt;br&gt;    c_00_c_10_vreg.v += a_0p_a_1p_vreg.v * b_p0_vreg.v;&lt;br&gt;    c_01_c_11_vreg.v += a_0p_a_1p_vreg.v * b_p1_vreg.v;&lt;br&gt;    c_02_c_12_vreg.v += a_0p_a_1p_vreg.v * b_p2_vreg.v;&lt;br&gt;    c_03_c_13_vreg.v += a_0p_a_1p_vreg.v * b_p3_vreg.v;&lt;br&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* Third and fourth rows */&lt;/span&gt;&lt;br&gt;    c_20_c_30_vreg.v += a_2p_a_3p_vreg.v * b_p0_vreg.v;&lt;br&gt;    c_21_c_31_vreg.v += a_2p_a_3p_vreg.v * b_p1_vreg.v;&lt;br&gt;    c_22_c_32_vreg.v += a_2p_a_3p_vreg.v * b_p2_vreg.v;&lt;br&gt;    c_23_c_33_vreg.v += a_2p_a_3p_vreg.v * b_p3_vreg.v;&lt;br&gt;  &amp;#125;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_00_c_10_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_01_c_11_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_02_c_12_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_03_c_13_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;]; &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_00_c_10_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_01_c_11_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_02_c_12_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_03_c_13_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;]; &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_20_c_30_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_21_c_31_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_22_c_32_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_23_c_33_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;]; &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_20_c_30_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_21_c_31_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_22_c_32_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_23_c_33_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;]; &lt;br&gt;&amp;#125;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://xingyuanjie.top/2023/06/07/gemm0005/</guid>
            <title>Further optimizing</title>
            <link>https://xingyuanjie.top/2023/06/07/gemm0005/</link>
            <category>blas</category>
            <category>gemm</category>
            <category>gemv</category>
            <pubDate>Wed, 07 Jun 2023 13:18:10 +0800</pubDate>
            <description><![CDATA[ &lt;h2 id=&#34;Further-optimizing&#34;&gt;&lt;a href=&#34;#Further-optimizing&#34; class=&#34;headerlink&#34; title=&#34;Further optimizing&#34;&gt;&lt;/a&gt;Further optimizing&lt;/h2&gt;&lt;p&gt;现在我们开始以不同的方式优化1x4的情况。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;我们在寄存器中存储一行k × 4矩阵B&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/flame/how-to-optimize-gemm/wiki/Optimization_4x4_8&#34;&gt;https://github.com/flame/how-to-optimize-gemm/wiki/Optimization_4x4_8&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;请注意，我们现在使用的常规寄存器比物理上可用的寄存器多得多……&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;我们重新安排计算，以便一次计算两行4x4的C块。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/flame/how-to-optimize-gemm/wiki/Optimization_4x4_9&#34;&gt;Optimization_4x4_9 · flame&amp;#x2F;how-to-optimize-gemm Wiki (github.com)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;我们使用向量寄存器和向量运算。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/flame/how-to-optimize-gemm/wiki/Optimization_4x4_10&#34;&gt;Optimization_4x4_10 · flame&amp;#x2F;how-to-optimize-gemm Wiki (github.com)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We notice a considerable performance boost:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/2023/06/07/gemm0005/compare_MMult0_MMult-4x4-10.png&#34; alt=&#34;img&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/2023/06/07/gemm0005/compare_MMult-1x4-9_MMult-4x4-10.png&#34; alt=&#34;img&#34;&gt;&lt;/p&gt;
&lt;p&gt;不过，还有很大的改进空间。&lt;/p&gt;
&lt;h2 id=&#34;Optimization-4x4-8&#34;&gt;&lt;a href=&#34;#Optimization-4x4-8&#34; class=&#34;headerlink&#34; title=&#34;Optimization_4x4_8&#34;&gt;&lt;/a&gt;Optimization_4x4_8&lt;/h2&gt;&lt;p&gt;现在我们使用寄存器来存储B当前行的元素。(注意，对于一次计算C四个元素的情况，我们没有这样做。)性能实际上略有下降。但是这个步骤支持进一步的优化。&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;48&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;49&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;50&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;51&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;52&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;53&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;54&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;55&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;56&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;57&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;58&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;59&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;60&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;61&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;62&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;63&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;64&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;65&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;66&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;67&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;68&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;69&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;70&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;71&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;72&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;73&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;74&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;75&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;76&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;77&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;78&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;79&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;80&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;81&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;82&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;83&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;84&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;85&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;86&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;87&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;88&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;89&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;90&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;91&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;92&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;93&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;94&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;95&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;96&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;97&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;98&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;99&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;100&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;101&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;102&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;103&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;104&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;105&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;106&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;107&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;108&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;109&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;110&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;111&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;112&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;113&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;114&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;115&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;116&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;117&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;118&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;119&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;120&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;121&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;122&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;123&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;124&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;125&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;126&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;127&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;128&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;129&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;130&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Create macros so that the matrices are stored in column-major order */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; A(i,j) a[ (j)*lda + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; B(i,j) b[ (j)*ldb + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; C(i,j) c[ (j)*ldc + (i) ]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Routine for computing C = A * B + C */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot4x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; )&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;MY_MMult&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; m, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; n, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i, j;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( j=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; j&amp;lt;n; j+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the columns of C, unrolled by 4 */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;m; i+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the rows of C */&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-comment&#34;&gt;/* Update C( i,j ), C( i,j+1 ), C( i,j+2 ), and C( i,j+3 ) in&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	 one routine (four inner products) */&lt;/span&gt;&lt;br&gt;&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot4x4&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i,&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;,j ), ldb, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,j ), ldc );&lt;br&gt;    &amp;#125;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot4x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* So, this routine computes a 4x4 block of matrix A&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 0, 0 ), C( 0, 1 ), C( 0, 2 ), C( 0, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 1, 0 ), C( 1, 1 ), C( 1, 2 ), C( 1, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 2, 0 ), C( 2, 1 ), C( 2, 2 ), C( 2, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 3, 0 ), C( 3, 1 ), C( 3, 2 ), C( 3, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     Notice that this routine is called with c = C( i, j ) in the&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     previous routine, so these are actually the elements &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i  , j ), C( i  , j+1 ), C( i  , j+2 ), C( i  , j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+1, j ), C( i+1, j+1 ), C( i+1, j+2 ), C( i+1, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+2, j ), C( i+2, j+1 ), C( i+2, j+2 ), C( i+2, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+3, j ), C( i+3, j+1 ), C( i+3, j+2 ), C( i+3, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     in the original matrix C &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     In this version, we use registers for elements in the current row&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     of B as well */&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; p;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;register&lt;/span&gt; &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* hold contributions to&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       C( 0, 0 ), C( 0, 1 ), C( 0, 2 ), C( 0, 3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       C( 1, 0 ), C( 1, 1 ), C( 1, 2 ), C( 1, 3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       C( 2, 0 ), C( 2, 1 ), C( 2, 2 ), C( 2, 3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       C( 3, 0 ), C( 3, 1 ), C( 3, 2 ), C( 3, 3 )   */&lt;/span&gt;&lt;br&gt;       c_00_reg,   c_01_reg,   c_02_reg,   c_03_reg,  &lt;br&gt;       c_10_reg,   c_11_reg,   c_12_reg,   c_13_reg,  &lt;br&gt;       c_20_reg,   c_21_reg,   c_22_reg,   c_23_reg,  &lt;br&gt;       c_30_reg,   c_31_reg,   c_32_reg,   c_33_reg,&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* hold &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       A( 0, p ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       A( 1, p ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       A( 2, p ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       A( 3, p ) */&lt;/span&gt;&lt;br&gt;       a_0p_reg,&lt;br&gt;       a_1p_reg,&lt;br&gt;       a_2p_reg,&lt;br&gt;       a_3p_reg,&lt;br&gt;       b_p0_reg,&lt;br&gt;       b_p1_reg,&lt;br&gt;       b_p2_reg,&lt;br&gt;       b_p3_reg;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* Point to the current elements in the four columns of B */&lt;/span&gt;&lt;br&gt;    *b_p0_pntr, *b_p1_pntr, *b_p2_pntr, *b_p3_pntr; &lt;br&gt;    &lt;br&gt;  b_p0_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; );&lt;br&gt;  b_p1_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; );&lt;br&gt;  b_p2_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; );&lt;br&gt;  b_p3_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; );&lt;br&gt;&lt;br&gt;  c_00_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_01_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_02_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_03_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;&lt;br&gt;  c_10_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_11_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_12_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_13_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;&lt;br&gt;  c_20_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_21_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_22_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_23_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;&lt;br&gt;  c_30_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_31_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_32_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_33_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    a_0p_reg = &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p );&lt;br&gt;    a_1p_reg = &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, p );&lt;br&gt;    a_2p_reg = &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, p );&lt;br&gt;    a_3p_reg = &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, p );&lt;br&gt;&lt;br&gt;    b_p0_reg = *b_p0_pntr++;&lt;br&gt;    b_p1_reg = *b_p1_pntr++;&lt;br&gt;    b_p2_reg = *b_p2_pntr++;&lt;br&gt;    b_p3_reg = *b_p3_pntr++;&lt;br&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* First row */&lt;/span&gt;&lt;br&gt;    c_00_reg += a_0p_reg * b_p0_reg;&lt;br&gt;    c_01_reg += a_0p_reg * b_p1_reg;&lt;br&gt;    c_02_reg += a_0p_reg * b_p2_reg;&lt;br&gt;    c_03_reg += a_0p_reg * b_p3_reg;&lt;br&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* Second row */&lt;/span&gt;&lt;br&gt;    c_10_reg += a_1p_reg * b_p0_reg;&lt;br&gt;    c_11_reg += a_1p_reg * b_p1_reg;&lt;br&gt;    c_12_reg += a_1p_reg * b_p2_reg;&lt;br&gt;    c_13_reg += a_1p_reg * b_p3_reg;&lt;br&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* Third row */&lt;/span&gt;&lt;br&gt;    c_20_reg += a_2p_reg * b_p0_reg;&lt;br&gt;    c_21_reg += a_2p_reg * b_p1_reg;&lt;br&gt;    c_22_reg += a_2p_reg * b_p2_reg;&lt;br&gt;    c_23_reg += a_2p_reg * b_p3_reg;&lt;br&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* Four row */&lt;/span&gt;&lt;br&gt;    c_30_reg += a_3p_reg * b_p0_reg;&lt;br&gt;    c_31_reg += a_3p_reg * b_p1_reg;&lt;br&gt;    c_32_reg += a_3p_reg * b_p2_reg;&lt;br&gt;    c_33_reg += a_3p_reg * b_p3_reg;&lt;br&gt;  &amp;#125;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_00_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_01_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_02_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_03_reg;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_10_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_11_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_12_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_13_reg;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_20_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_21_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_22_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_23_reg;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_30_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_31_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_32_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_33_reg;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;Optimization-4x4-9&#34;&gt;&lt;a href=&#34;#Optimization-4x4-9&#34; class=&#34;headerlink&#34; title=&#34;Optimization_4x4_9&#34;&gt;&lt;/a&gt;Optimization_4x4_9&lt;/h2&gt;&lt;p&gt;从4x4_8到4x4_9是一个微妙的变化:我们不是一次一行地更新4x4块C的行，而是一次计算两行。这为我们使用向量操作做好了准备，我们用向量操作更新对C(0,j)和C(1,j) (j &amp;#x3D;0，…，3)。&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;48&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;49&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;50&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;51&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;52&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;53&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;54&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;55&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;56&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;57&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;58&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;59&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;60&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;61&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;62&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;63&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;64&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;65&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;66&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;67&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;68&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;69&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;70&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;71&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;72&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;73&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;74&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;75&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;76&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;77&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;78&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;79&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;80&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;81&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;82&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;83&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;84&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;85&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;86&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;87&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;88&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;89&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;90&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;91&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;92&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;93&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;94&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;95&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;96&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;97&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;98&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;99&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;100&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;101&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;102&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;103&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;104&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;105&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;106&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;107&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;108&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;109&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;110&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;111&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;112&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;113&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;114&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;115&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;116&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;117&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;118&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;119&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;120&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;121&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;122&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;123&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;124&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;125&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;126&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;127&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;128&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;129&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;130&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;131&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Create macros so that the matrices are stored in column-major order */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; A(i,j) a[ (j)*lda + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; B(i,j) b[ (j)*ldb + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; C(i,j) c[ (j)*ldc + (i) ]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Routine for computing C = A * B + C */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot4x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; )&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;MY_MMult&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; m, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; n, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i, j;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( j=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; j&amp;lt;n; j+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the columns of C, unrolled by 4 */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;m; i+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the rows of C */&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-comment&#34;&gt;/* Update C( i,j ), C( i,j+1 ), C( i,j+2 ), and C( i,j+3 ) in&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	 one routine (four inner products) */&lt;/span&gt;&lt;br&gt;&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot4x4&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i,&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;,j ), ldb, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,j ), ldc );&lt;br&gt;    &amp;#125;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot4x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* So, this routine computes a 4x4 block of matrix A&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 0, 0 ), C( 0, 1 ), C( 0, 2 ), C( 0, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 1, 0 ), C( 1, 1 ), C( 1, 2 ), C( 1, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 2, 0 ), C( 2, 1 ), C( 2, 2 ), C( 2, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 3, 0 ), C( 3, 1 ), C( 3, 2 ), C( 3, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     Notice that this routine is called with c = C( i, j ) in the&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     previous routine, so these are actually the elements &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i  , j ), C( i  , j+1 ), C( i  , j+2 ), C( i  , j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+1, j ), C( i+1, j+1 ), C( i+1, j+2 ), C( i+1, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+2, j ), C( i+2, j+1 ), C( i+2, j+2 ), C( i+2, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+3, j ), C( i+3, j+1 ), C( i+3, j+2 ), C( i+3, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     in the original matrix C &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     A simple rearrangement to prepare for the use of vector registers */&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; p;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;register&lt;/span&gt; &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* hold contributions to&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       C( 0, 0 ), C( 0, 1 ), C( 0, 2 ), C( 0, 3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       C( 1, 0 ), C( 1, 1 ), C( 1, 2 ), C( 1, 3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       C( 2, 0 ), C( 2, 1 ), C( 2, 2 ), C( 2, 3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       C( 3, 0 ), C( 3, 1 ), C( 3, 2 ), C( 3, 3 )   */&lt;/span&gt;&lt;br&gt;       c_00_reg,   c_01_reg,   c_02_reg,   c_03_reg,  &lt;br&gt;       c_10_reg,   c_11_reg,   c_12_reg,   c_13_reg,  &lt;br&gt;       c_20_reg,   c_21_reg,   c_22_reg,   c_23_reg,  &lt;br&gt;       c_30_reg,   c_31_reg,   c_32_reg,   c_33_reg,&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* hold &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       A( 0, p ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       A( 1, p ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       A( 2, p ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       A( 3, p ) */&lt;/span&gt;&lt;br&gt;       a_0p_reg,&lt;br&gt;       a_1p_reg,&lt;br&gt;       a_2p_reg,&lt;br&gt;       a_3p_reg,&lt;br&gt;       b_p0_reg,&lt;br&gt;       b_p1_reg,&lt;br&gt;       b_p2_reg,&lt;br&gt;       b_p3_reg;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* Point to the current elements in the four columns of B */&lt;/span&gt;&lt;br&gt;    *b_p0_pntr, *b_p1_pntr, *b_p2_pntr, *b_p3_pntr; &lt;br&gt;    &lt;br&gt;  b_p0_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; );&lt;br&gt;  b_p1_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; );&lt;br&gt;  b_p2_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; );&lt;br&gt;  b_p3_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; );&lt;br&gt;&lt;br&gt;  c_00_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_01_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_02_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_03_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;&lt;br&gt;  c_10_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_11_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_12_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_13_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;&lt;br&gt;  c_20_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_21_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_22_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_23_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;&lt;br&gt;  c_30_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_31_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_32_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_33_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    a_0p_reg = &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p );&lt;br&gt;    a_1p_reg = &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, p );&lt;br&gt;    a_2p_reg = &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, p );&lt;br&gt;    a_3p_reg = &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, p );&lt;br&gt;&lt;br&gt;    b_p0_reg = *b_p0_pntr++;&lt;br&gt;    b_p1_reg = *b_p1_pntr++;&lt;br&gt;    b_p2_reg = *b_p2_pntr++;&lt;br&gt;    b_p3_reg = *b_p3_pntr++;&lt;br&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* First row and second rows */&lt;/span&gt;&lt;br&gt;    c_00_reg += a_0p_reg * b_p0_reg;&lt;br&gt;    c_10_reg += a_1p_reg * b_p0_reg;&lt;br&gt;&lt;br&gt;    c_01_reg += a_0p_reg * b_p1_reg;&lt;br&gt;    c_11_reg += a_1p_reg * b_p1_reg;&lt;br&gt;&lt;br&gt;    c_02_reg += a_0p_reg * b_p2_reg;&lt;br&gt;    c_12_reg += a_1p_reg * b_p2_reg;&lt;br&gt;&lt;br&gt;    c_03_reg += a_0p_reg * b_p3_reg;&lt;br&gt;    c_13_reg += a_1p_reg * b_p3_reg;&lt;br&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* Third and fourth rows */&lt;/span&gt;&lt;br&gt;    c_20_reg += a_2p_reg * b_p0_reg;&lt;br&gt;    c_30_reg += a_3p_reg * b_p0_reg;&lt;br&gt;&lt;br&gt;    c_21_reg += a_2p_reg * b_p1_reg;&lt;br&gt;    c_31_reg += a_3p_reg * b_p1_reg;&lt;br&gt;&lt;br&gt;    c_22_reg += a_2p_reg * b_p2_reg;&lt;br&gt;    c_32_reg += a_3p_reg * b_p2_reg;&lt;br&gt;&lt;br&gt;    c_23_reg += a_2p_reg * b_p3_reg;&lt;br&gt;    c_33_reg += a_3p_reg * b_p3_reg;&lt;br&gt;  &amp;#125;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_00_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_01_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_02_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_03_reg;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_10_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_11_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_12_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_13_reg;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_20_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_21_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_22_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_23_reg;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_30_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_31_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_32_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_33_reg;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;Optimization-4x4-10&#34;&gt;&lt;a href=&#34;#Optimization-4x4-10&#34; class=&#34;headerlink&#34; title=&#34;Optimization_4x4_10&#34;&gt;&lt;/a&gt;Optimization_4x4_10&lt;/h2&gt;&lt;p&gt;在这里，我们开始使用向量寄存器和向量操作。&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;48&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;49&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;50&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;51&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;52&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;53&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;54&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;55&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;56&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;57&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;58&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;59&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;60&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;61&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;62&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;63&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;64&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;65&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;66&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;67&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;68&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;69&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;70&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;71&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;72&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;73&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;74&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;75&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;76&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;77&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;78&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;79&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;80&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;81&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;82&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;83&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;84&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;85&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;86&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;87&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;88&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;89&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;90&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;91&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;92&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;93&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;94&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;95&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;96&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;97&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;98&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;99&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;100&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;101&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;102&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;103&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;104&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;105&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;106&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;107&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;108&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;109&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;110&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;111&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;112&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;113&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;114&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;115&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;116&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;117&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;118&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;119&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;120&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Create macros so that the matrices are stored in column-major order */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; A(i,j) a[ (j)*lda + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; B(i,j) b[ (j)*ldb + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; C(i,j) c[ (j)*ldc + (i) ]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Routine for computing C = A * B + C */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot4x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; )&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;MY_MMult&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; m, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; n, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i, j;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( j=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; j&amp;lt;n; j+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the columns of C, unrolled by 4 */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;m; i+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the rows of C */&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-comment&#34;&gt;/* Update C( i,j ), C( i,j+1 ), C( i,j+2 ), and C( i,j+3 ) in&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	 one routine (four inner products) */&lt;/span&gt;&lt;br&gt;&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot4x4&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i,&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;,j ), ldb, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,j ), ldc );&lt;br&gt;    &amp;#125;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;include&lt;/span&gt; &lt;span class=&#34;hljs-meta-string&#34;&gt;&amp;lt;mmintrin.h&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;include&lt;/span&gt; &lt;span class=&#34;hljs-meta-string&#34;&gt;&amp;lt;xmmintrin.h&amp;gt;&lt;/span&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;// SSE&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;include&lt;/span&gt; &lt;span class=&#34;hljs-meta-string&#34;&gt;&amp;lt;pmmintrin.h&amp;gt;&lt;/span&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;// SSE2&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;include&lt;/span&gt; &lt;span class=&#34;hljs-meta-string&#34;&gt;&amp;lt;emmintrin.h&amp;gt;&lt;/span&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;// SSE3&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;typedef&lt;/span&gt; &lt;span class=&#34;hljs-class&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;union&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-class&#34;&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;  __m128d v;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; d[&lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;];&lt;br&gt;&amp;#125; &lt;span class=&#34;hljs-keyword&#34;&gt;v2df_t&lt;/span&gt;;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot4x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* So, this routine computes a 4x4 block of matrix A&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 0, 0 ), C( 0, 1 ), C( 0, 2 ), C( 0, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 1, 0 ), C( 1, 1 ), C( 1, 2 ), C( 1, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 2, 0 ), C( 2, 1 ), C( 2, 2 ), C( 2, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 3, 0 ), C( 3, 1 ), C( 3, 2 ), C( 3, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     Notice that this routine is called with c = C( i, j ) in the&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     previous routine, so these are actually the elements &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i  , j ), C( i  , j+1 ), C( i  , j+2 ), C( i  , j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+1, j ), C( i+1, j+1 ), C( i+1, j+2 ), C( i+1, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+2, j ), C( i+2, j+1 ), C( i+2, j+2 ), C( i+2, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+3, j ), C( i+3, j+1 ), C( i+3, j+2 ), C( i+3, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     in the original matrix C &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     And now we use vector registers and instructions */&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; p;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;v2df_t&lt;/span&gt;&lt;br&gt;    c_00_c_10_vreg,    c_01_c_11_vreg,    c_02_c_12_vreg,    c_03_c_13_vreg,&lt;br&gt;    c_20_c_30_vreg,    c_21_c_31_vreg,    c_22_c_32_vreg,    c_23_c_33_vreg,&lt;br&gt;    a_0p_a_1p_vreg,&lt;br&gt;    a_2p_a_3p_vreg,&lt;br&gt;    b_p0_vreg, b_p1_vreg, b_p2_vreg, b_p3_vreg; &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* Point to the current elements in the four columns of B */&lt;/span&gt;&lt;br&gt;    *b_p0_pntr, *b_p1_pntr, *b_p2_pntr, *b_p3_pntr; &lt;br&gt;    &lt;br&gt;  b_p0_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; );&lt;br&gt;  b_p1_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; );&lt;br&gt;  b_p2_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; );&lt;br&gt;  b_p3_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; );&lt;br&gt;&lt;br&gt;  c_00_c_10_vreg.v = _mm_setzero_pd();   &lt;br&gt;  c_01_c_11_vreg.v = _mm_setzero_pd();&lt;br&gt;  c_02_c_12_vreg.v = _mm_setzero_pd(); &lt;br&gt;  c_03_c_13_vreg.v = _mm_setzero_pd(); &lt;br&gt;  c_20_c_30_vreg.v = _mm_setzero_pd();   &lt;br&gt;  c_21_c_31_vreg.v = _mm_setzero_pd();  &lt;br&gt;  c_22_c_32_vreg.v = _mm_setzero_pd();   &lt;br&gt;  c_23_c_33_vreg.v = _mm_setzero_pd(); &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    a_0p_a_1p_vreg.v = _mm_load_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p ) );&lt;br&gt;    a_2p_a_3p_vreg.v = _mm_load_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, p ) );&lt;br&gt;&lt;br&gt;    b_p0_vreg.v = _mm_loaddup_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) b_p0_pntr++ );   &lt;span class=&#34;hljs-comment&#34;&gt;/* load and duplicate */&lt;/span&gt;&lt;br&gt;    b_p1_vreg.v = _mm_loaddup_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) b_p1_pntr++ );   &lt;span class=&#34;hljs-comment&#34;&gt;/* load and duplicate */&lt;/span&gt;&lt;br&gt;    b_p2_vreg.v = _mm_loaddup_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) b_p2_pntr++ );   &lt;span class=&#34;hljs-comment&#34;&gt;/* load and duplicate */&lt;/span&gt;&lt;br&gt;    b_p3_vreg.v = _mm_loaddup_pd( (&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *) b_p3_pntr++ );   &lt;span class=&#34;hljs-comment&#34;&gt;/* load and duplicate */&lt;/span&gt;&lt;br&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* First row and second rows *  向量化，一次计算两个double/&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;    c_00_c_10_vreg.v += a_0p_a_1p_vreg.v * b_p0_vreg.v;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;    c_01_c_11_vreg.v += a_0p_a_1p_vreg.v * b_p1_vreg.v;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;    c_02_c_12_vreg.v += a_0p_a_1p_vreg.v * b_p2_vreg.v;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;    c_03_c_13_vreg.v += a_0p_a_1p_vreg.v * b_p3_vreg.v;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;    /* Third and fourth rows */&lt;/span&gt;&lt;br&gt;    c_20_c_30_vreg.v += a_2p_a_3p_vreg.v * b_p0_vreg.v;&lt;br&gt;    c_21_c_31_vreg.v += a_2p_a_3p_vreg.v * b_p1_vreg.v;&lt;br&gt;    c_22_c_32_vreg.v += a_2p_a_3p_vreg.v * b_p2_vreg.v;&lt;br&gt;    c_23_c_33_vreg.v += a_2p_a_3p_vreg.v * b_p3_vreg.v;&lt;br&gt;  &amp;#125;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_00_c_10_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_01_c_11_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_02_c_12_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_03_c_13_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;]; &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_00_c_10_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_01_c_11_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_02_c_12_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_03_c_13_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;]; &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_20_c_30_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_21_c_31_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_22_c_32_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_23_c_33_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;]; &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_20_c_30_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_21_c_31_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_22_c_32_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;];  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_23_c_33_vreg.d[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;]; &lt;br&gt;&amp;#125;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://xingyuanjie.top/2023/05/31/gemm0004/</guid>
            <title>Repeating the same optimizations</title>
            <link>https://xingyuanjie.top/2023/05/31/gemm0004/</link>
            <category>blas</category>
            <category>gemm</category>
            <category>gemv</category>
            <pubDate>Wed, 31 May 2023 15:16:29 +0800</pubDate>
            <description><![CDATA[ &lt;h2 id=&#34;Repeating-the-same-optimizations&#34;&gt;&lt;a href=&#34;#Repeating-the-same-optimizations&#34; class=&#34;headerlink&#34; title=&#34;Repeating the same optimizations&#34;&gt;&lt;/a&gt;Repeating the same optimizations&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;我们在AddDot4x4子程序中一次计算4个C元素，该子程序一次执行16个乘积:&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/flame/how-to-optimize-gemm/wiki/Optimization_4x4_3&#34;&gt;Optimization_4x4_3 · flame&amp;#x2F;how-to-optimize-gemm Wiki (github.com)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;现在我们内联16个独立的内积，并将循环融合为一个，从而在一个循环中同时计算16个乘积:&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/flame/how-to-optimize-gemm/wiki/Optimization_4x4_4&#34;&gt;Optimization_4x4_4 · flame&amp;#x2F;how-to-optimize-gemm Wiki (github.com)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/flame/how-to-optimize-gemm/wiki/Optimization_4x4_5&#34;&gt;Optimization_4x4_5 · flame&amp;#x2F;how-to-optimize-gemm Wiki (github.com)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在这一点上，我们再次开始看到一些性能改进:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/2023/05/31/gemm0004/compare_MMult0_MMult-4x4-5.png&#34; alt=&#34;img&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/2023/05/31/gemm0004/compare_MMult-1x4-5_MMult-4x4-5.png&#34; alt=&#34;img&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;我们将C的元素累加到寄存器中，并使用寄存器存储a的元素&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/flame/how-to-optimize-gemm/wiki/Optimization_4x4_6&#34;&gt;Optimization_4x4_6 · flame&amp;#x2F;how-to-optimize-gemm Wiki (github.com)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;我们使用指针来定位B中的元素&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/flame/how-to-optimize-gemm/wiki/Optimization_4x4_7&#34;&gt;Optimization_4x4_7 · flame&amp;#x2F;how-to-optimize-gemm Wiki (github.com)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;Optimization-4x4-3&#34;&gt;&lt;a href=&#34;#Optimization-4x4-3&#34; class=&#34;headerlink&#34; title=&#34;Optimization_4x4_3&#34;&gt;&lt;/a&gt;Optimization_4x4_3&lt;/h1&gt;&lt;p&gt;对循环变量i进行展开。由原来AddDot1x4变为AddDot4x4，一次计算16个乘积。&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;48&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;49&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;50&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;51&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;52&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;53&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;54&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;55&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;56&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;57&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;58&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;59&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;60&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;61&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;62&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;63&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;64&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;65&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;66&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;67&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;68&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;69&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;70&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;71&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;72&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;73&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;74&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;75&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;76&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;77&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;78&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;79&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;80&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;81&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;82&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;83&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;84&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;85&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;86&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;87&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;88&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;89&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;90&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Create macros so that the matrices are stored in column-major order */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; A(i,j) a[ (j)*lda + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; B(i,j) b[ (j)*ldb + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; C(i,j) c[ (j)*ldc + (i) ]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Routine for computing C = A * B + C */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; * )&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;MY_MMult&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; m, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; n, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i, j;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( j=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; j&amp;lt;n; j+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the columns of C, unrolled by 4 */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;m; i+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the rows of C */&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-comment&#34;&gt;/* Update C( i,j ), C( i,j+1 ), C( i,j+2 ), and C( i,j+3 ) in&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	 one routine (four inner products) */&lt;/span&gt;&lt;br&gt;&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot4x4&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i,&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;,j ), ldb, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,j ), ldc );&lt;br&gt;    &amp;#125;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot4x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* So, this routine computes a 4x4 block of matrix A&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 0, 0 ), C( 0, 1 ), C( 0, 2 ), C( 0, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 1, 0 ), C( 1, 1 ), C( 1, 2 ), C( 1, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 2, 0 ), C( 2, 1 ), C( 2, 2 ), C( 2, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 3, 0 ), C( 3, 1 ), C( 3, 2 ), C( 3, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     Notice that this routine is called with c = C( i, j ) in the&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     previous routine, so these are actually the elements &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i  , j ), C( i  , j+1 ), C( i  , j+2 ), C( i  , j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+1, j ), C( i+1, j+1 ), C( i+1, j+2 ), C( i+1, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+2, j ), C( i+2, j+1 ), C( i+2, j+2 ), C( i+2, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+3, j ), C( i+3, j+1 ), C( i+3, j+2 ), C( i+3, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     in the original matrix C */&lt;/span&gt; &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* First row */&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) );&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ), &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) );&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ), &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) );&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ), &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) );&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* Second row */&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) );&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ), &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) );&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ), &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) );&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ), &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) );&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* Third row */&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) );&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ), &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) );&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ), &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) );&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ), &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) );&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* Four row */&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) );&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ), &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) );&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ), &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) );&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ), &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) );&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Create macro to let X( i ) equal the ith element of x */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; X(i) x[ (i)*incx ]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *x, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; incx,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *y, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *gamma )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* compute gamma := x&amp;#x27; * y + gamma with vectors x and y of length n.&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     Here x starts at location x with increment (stride) incx and y starts at location y and has (implicit) stride of 1.&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;  */&lt;/span&gt;&lt;br&gt; &lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; p;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    *gamma += &lt;span class=&#34;hljs-built_in&#34;&gt;X&lt;/span&gt;( p ) * y[ p ];     &lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;Optimization-4x4-4&#34;&gt;&lt;a href=&#34;#Optimization-4x4-4&#34; class=&#34;headerlink&#34; title=&#34;Optimization_4x4_4&#34;&gt;&lt;/a&gt;Optimization_4x4_4&lt;/h1&gt;&lt;p&gt;把AddDot计算kernel合并到AddDot4x4里面。&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;48&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;49&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;50&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;51&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;52&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;53&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;54&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;55&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;56&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;57&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;58&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;59&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;60&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;61&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;62&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;63&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;64&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;65&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;66&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;67&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;68&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;69&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;70&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;71&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;72&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;73&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;74&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;75&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;76&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;77&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;78&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;79&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;80&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;81&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;82&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;83&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;84&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;85&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;86&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;87&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;88&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;89&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;90&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;91&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;92&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;93&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;94&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;95&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;96&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;97&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;98&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;99&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;100&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;101&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;102&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;103&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;104&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;105&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;106&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;107&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;108&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;109&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;110&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;111&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;112&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;113&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;114&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;115&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;116&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;117&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;118&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;119&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;120&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;121&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;122&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;123&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;124&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Create macros so that the matrices are stored in column-major order */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; A(i,j) a[ (j)*lda + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; B(i,j) b[ (j)*ldb + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; C(i,j) c[ (j)*ldc + (i) ]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Routine for computing C = A * B + C */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot4x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; )&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; * )&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;MY_MMult&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; m, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; n, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i, j;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( j=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; j&amp;lt;n; j+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the columns of C, unrolled by 4 */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;m; i+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the rows of C */&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-comment&#34;&gt;/* Update C( i,j ), C( i,j+1 ), C( i,j+2 ), and C( i,j+3 ) in&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	 one routine (four inner products) */&lt;/span&gt;&lt;br&gt;&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot4x4&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i,&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;,j ), ldb, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,j ), ldc );&lt;br&gt;    &amp;#125;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot4x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* So, this routine computes a 4x4 block of matrix A&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 0, 0 ), C( 0, 1 ), C( 0, 2 ), C( 0, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 1, 0 ), C( 1, 1 ), C( 1, 2 ), C( 1, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 2, 0 ), C( 2, 1 ), C( 2, 2 ), C( 2, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 3, 0 ), C( 3, 1 ), C( 3, 2 ), C( 3, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     Notice that this routine is called with c = C( i, j ) in the&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     previous routine, so these are actually the elements &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i  , j ), C( i  , j+1 ), C( i  , j+2 ), C( i  , j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+1, j ), C( i+1, j+1 ), C( i+1, j+2 ), C( i+1, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+2, j ), C( i+2, j+1 ), C( i+2, j+2 ), C( i+2, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+3, j ), C( i+3, j+1 ), C( i+3, j+2 ), C( i+3, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     in the original matrix C &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     In this version, we &amp;quot;inline&amp;quot; AddDot */&lt;/span&gt; &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; p;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* First row 第一行*/&lt;/span&gt;   &lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//  AddDot( k, &amp;amp;A( 0, 0 ), lda, &amp;amp;B( 0, 0 ), &amp;amp;C( 0, 0 ) );&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; );     &lt;br&gt;  &amp;#125;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//  AddDot( k, &amp;amp;A( 0, 0 ), lda, &amp;amp;B( 0, 1 ), &amp;amp;C( 0, 1 ) );&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; );     &lt;br&gt;  &amp;#125;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//  AddDot( k, &amp;amp;A( 0, 0 ), lda, &amp;amp;B( 0, 2 ), &amp;amp;C( 0, 2 ) );&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; );     &lt;br&gt;  &amp;#125;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//  AddDot( k, &amp;amp;A( 0, 0 ), lda, &amp;amp;B( 0, 3 ), &amp;amp;C( 0, 3 ) );&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; );     &lt;br&gt;  &amp;#125;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* Second row 第二行*/&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//  AddDot( k, &amp;amp;A( 1, 0 ), lda, &amp;amp;B( 0, 0 ), &amp;amp;C( 1, 0 ) );&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; );     &lt;br&gt;  &amp;#125;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//  AddDot( k, &amp;amp;A( 1, 0 ), lda, &amp;amp;B( 0, 1 ), &amp;amp;C( 1, 1 ) );&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; );     &lt;br&gt;  &amp;#125;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//  AddDot( k, &amp;amp;A( 1, 0 ), lda, &amp;amp;B( 0, 2 ), &amp;amp;C( 1, 2 ) );&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; );     &lt;br&gt;  &amp;#125;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//  AddDot( k, &amp;amp;A( 1, 0 ), lda, &amp;amp;B( 0, 3 ), &amp;amp;C( 1, 3 ) );&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; );     &lt;br&gt;  &amp;#125;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* Third row 第三行*/&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//  AddDot( k, &amp;amp;A( 2, 0 ), lda, &amp;amp;B( 0, 0 ), &amp;amp;C( 2, 0 ) );&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; );     &lt;br&gt;  &amp;#125;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//  AddDot( k, &amp;amp;A( 2, 0 ), lda, &amp;amp;B( 0, 1 ), &amp;amp;C( 2, 1 ) );&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; );     &lt;br&gt;  &amp;#125;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//  AddDot( k, &amp;amp;A( 2, 0 ), lda, &amp;amp;B( 0, 2 ), &amp;amp;C( 2, 2 ) );&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; );     &lt;br&gt;  &amp;#125;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//  AddDot( k, &amp;amp;A( 2, 0 ), lda, &amp;amp;B( 0, 3 ), &amp;amp;C( 2, 3 ) );&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; );     &lt;br&gt;  &amp;#125;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* Four row 第四行*/&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//  AddDot( k, &amp;amp;A( 3, 0 ), lda, &amp;amp;B( 0, 0 ), &amp;amp;C( 3, 0 ) );&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; );     &lt;br&gt;  &amp;#125;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//  AddDot( k, &amp;amp;A( 3, 0 ), lda, &amp;amp;B( 0, 1 ), &amp;amp;C( 3, 1 ) );&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; );     &lt;br&gt;  &amp;#125;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//  AddDot( k, &amp;amp;A( 3, 0 ), lda, &amp;amp;B( 0, 2 ), &amp;amp;C( 3, 2 ) );&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; );     &lt;br&gt;  &amp;#125;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//  AddDot( k, &amp;amp;A( 3, 0 ), lda, &amp;amp;B( 0, 3 ), &amp;amp;C( 3, 3 ) );&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; );     &lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;Optimization-4x4-5&#34;&gt;&lt;a href=&#34;#Optimization-4x4-5&#34; class=&#34;headerlink&#34; title=&#34;Optimization_4x4_5&#34;&gt;&lt;/a&gt;Optimization_4x4_5&lt;/h1&gt;&lt;p&gt;合并16个for循环。&lt;/p&gt;
&lt;p&gt;现在，当矩阵变大时，我们看到了性能上的好处，因为数据在被放入寄存器后会得到更多的重用。&lt;/p&gt;
&lt;p&gt;以前是：1x4_5(一次计算C的4个元素)现在是：4x4_5(一次计算C的16个元素)。&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;48&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;49&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;50&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;51&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;52&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;53&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;54&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;55&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;56&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;57&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;58&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;59&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;60&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;61&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;62&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;63&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;64&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;65&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;66&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;67&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;68&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;69&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;70&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;71&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;72&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;73&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;74&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;75&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;76&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;77&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;78&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;79&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Create macros so that the matrices are stored in column-major order */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; A(i,j) a[ (j)*lda + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; B(i,j) b[ (j)*ldb + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; C(i,j) c[ (j)*ldc + (i) ]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Routine for computing C = A * B + C */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot4x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; )&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; * )&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;MY_MMult&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; m, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; n, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i, j;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( j=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; j&amp;lt;n; j+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the columns of C, unrolled by 4 */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;m; i+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the rows of C */&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-comment&#34;&gt;/* Update C( i,j ), C( i,j+1 ), C( i,j+2 ), and C( i,j+3 ) in&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	 one routine (four inner products) */&lt;/span&gt;&lt;br&gt;&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot4x4&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i,&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;,j ), ldb, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,j ), ldc );&lt;br&gt;    &amp;#125;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot4x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* So, this routine computes a 4x4 block of matrix A&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 0, 0 ), C( 0, 1 ), C( 0, 2 ), C( 0, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 1, 0 ), C( 1, 1 ), C( 1, 2 ), C( 1, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 2, 0 ), C( 2, 1 ), C( 2, 2 ), C( 2, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 3, 0 ), C( 3, 1 ), C( 3, 2 ), C( 3, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     Notice that this routine is called with c = C( i, j ) in the&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     previous routine, so these are actually the elements &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i  , j ), C( i  , j+1 ), C( i  , j+2 ), C( i  , j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+1, j ), C( i+1, j+1 ), C( i+1, j+2 ), C( i+1, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+2, j ), C( i+2, j+1 ), C( i+2, j+2 ), C( i+2, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+3, j ), C( i+3, j+1 ), C( i+3, j+2 ), C( i+3, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     in the original matrix C &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     In this version, we merge each set of four loops, computing four&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     inner products simultaneously. */&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; p;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* First row */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; );     &lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; );     &lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; );     &lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; );     &lt;br&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* Second row */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; );     &lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; );     &lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; );     &lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; );     &lt;br&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* Third row */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; );     &lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; );     &lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; );     &lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; );     &lt;br&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* Fourth row */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; );     &lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; );     &lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; );     &lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; );     &lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;Optimization-4x4-6&#34;&gt;&lt;a href=&#34;#Optimization-4x4-6&#34; class=&#34;headerlink&#34; title=&#34;Optimization_4x4_6&#34;&gt;&lt;/a&gt;Optimization_4x4_6&lt;/h1&gt;&lt;p&gt;矩阵C和A采用寄存器来存。&lt;/p&gt;
&lt;p&gt;我们为C的4x4块和A的当前4x1列的元素使用(常规)寄存器，这一事实使性能受益。请注意，我们使用的是比实际存在的更多的常规寄存器，所以任何人都可以猜测编译器会用它做什么。&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;48&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;49&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;50&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;51&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;52&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;53&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;54&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;55&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;56&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;57&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;58&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;59&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;60&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;61&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;62&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;63&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;64&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;65&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;66&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;67&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;68&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;69&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;70&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;71&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;72&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;73&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;74&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;75&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;76&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;77&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;78&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;79&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;80&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;81&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;82&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;83&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;84&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;85&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;86&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;87&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;88&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;89&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;90&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;91&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;92&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;93&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;94&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;95&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;96&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;97&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;98&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;99&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;100&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;101&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;102&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;103&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;104&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;105&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;106&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;107&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;108&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;109&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;110&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;111&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Create macros so that the matrices are stored in column-major order */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; A(i,j) a[ (j)*lda + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; B(i,j) b[ (j)*ldb + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; C(i,j) c[ (j)*ldc + (i) ]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Routine for computing C = A * B + C */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot4x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; )&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;MY_MMult&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; m, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; n, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i, j;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( j=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; j&amp;lt;n; j+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the columns of C, unrolled by 4 */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;m; i+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the rows of C */&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-comment&#34;&gt;/* Update C( i,j ), C( i,j+1 ), C( i,j+2 ), and C( i,j+3 ) in&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	 one routine (four inner products) */&lt;/span&gt;&lt;br&gt;&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot4x4&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i,&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;,j ), ldb, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,j ), ldc );&lt;br&gt;    &amp;#125;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot4x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* So, this routine computes a 4x4 block of matrix A&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 0, 0 ), C( 0, 1 ), C( 0, 2 ), C( 0, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 1, 0 ), C( 1, 1 ), C( 1, 2 ), C( 1, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 2, 0 ), C( 2, 1 ), C( 2, 2 ), C( 2, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 3, 0 ), C( 3, 1 ), C( 3, 2 ), C( 3, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     Notice that this routine is called with c = C( i, j ) in the&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     previous routine, so these are actually the elements &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i  , j ), C( i  , j+1 ), C( i  , j+2 ), C( i  , j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+1, j ), C( i+1, j+1 ), C( i+1, j+2 ), C( i+1, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+2, j ), C( i+2, j+1 ), C( i+2, j+2 ), C( i+2, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+3, j ), C( i+3, j+1 ), C( i+3, j+2 ), C( i+3, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     in the original matrix C &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     In this version, we accumulate in registers and put A( 0, p ) in a register */&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; p;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;register&lt;/span&gt; &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* hold contributions to&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       C( 0, 0 ), C( 0, 1 ), C( 0, 2 ), C( 0, 3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       C( 1, 0 ), C( 1, 1 ), C( 1, 2 ), C( 1, 3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       C( 2, 0 ), C( 2, 1 ), C( 2, 2 ), C( 2, 3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       C( 3, 0 ), C( 3, 1 ), C( 3, 2 ), C( 3, 3 )   */&lt;/span&gt;&lt;br&gt;       c_00_reg,   c_01_reg,   c_02_reg,   c_03_reg,  &lt;br&gt;       c_10_reg,   c_11_reg,   c_12_reg,   c_13_reg,  &lt;br&gt;       c_20_reg,   c_21_reg,   c_22_reg,   c_23_reg,  &lt;br&gt;       c_30_reg,   c_31_reg,   c_32_reg,   c_33_reg,&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* hold &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       A( 0, p ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       A( 1, p ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       A( 2, p ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       A( 3, p ) */&lt;/span&gt;&lt;br&gt;       a_0p_reg,&lt;br&gt;       a_1p_reg,&lt;br&gt;       a_2p_reg,&lt;br&gt;       a_3p_reg;&lt;br&gt;&lt;br&gt;  c_00_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_01_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_02_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_03_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;&lt;br&gt;  c_10_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_11_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_12_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_13_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;&lt;br&gt;  c_20_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_21_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_22_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_23_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;&lt;br&gt;  c_30_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_31_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_32_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_33_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    a_0p_reg = &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p );&lt;br&gt;    a_1p_reg = &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, p );&lt;br&gt;    a_2p_reg = &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, p );&lt;br&gt;    a_3p_reg = &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, p );&lt;br&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* First row */&lt;/span&gt;&lt;br&gt;    c_00_reg += a_0p_reg * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; );     &lt;br&gt;    c_01_reg += a_0p_reg * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; );     &lt;br&gt;    c_02_reg += a_0p_reg * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; );     &lt;br&gt;    c_03_reg += a_0p_reg * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; );     &lt;br&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* Second row */&lt;/span&gt;&lt;br&gt;    c_10_reg += a_1p_reg * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; );     &lt;br&gt;    c_11_reg += a_1p_reg * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; );     &lt;br&gt;    c_12_reg += a_1p_reg * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; );     &lt;br&gt;    c_13_reg += a_1p_reg * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; );     &lt;br&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* Third row */&lt;/span&gt;&lt;br&gt;    c_20_reg += a_2p_reg * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; );     &lt;br&gt;    c_21_reg += a_2p_reg * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; );     &lt;br&gt;    c_22_reg += a_2p_reg * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; );     &lt;br&gt;    c_23_reg += a_2p_reg * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; );     &lt;br&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* Four row */&lt;/span&gt;&lt;br&gt;    c_30_reg += a_3p_reg * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; );     &lt;br&gt;    c_31_reg += a_3p_reg * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; );     &lt;br&gt;    c_32_reg += a_3p_reg * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; );     &lt;br&gt;    c_33_reg += a_3p_reg * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; );     &lt;br&gt;  &amp;#125;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_00_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_01_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_02_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_03_reg;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_10_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_11_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_12_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_13_reg;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_20_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_21_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_22_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_23_reg;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_30_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_31_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_32_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_33_reg;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;Optimization-4x4-7&#34;&gt;&lt;a href=&#34;#Optimization-4x4-7&#34; class=&#34;headerlink&#34; title=&#34;Optimization_4x4_7&#34;&gt;&lt;/a&gt;Optimization_4x4_7&lt;/h1&gt;&lt;p&gt;这里我们改为使用指针来跟踪B的当前4x1块。&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;48&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;49&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;50&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;51&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;52&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;53&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;54&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;55&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;56&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;57&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;58&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;59&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;60&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;61&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;62&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;63&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;64&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;65&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;66&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;67&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;68&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;69&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;70&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;71&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;72&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;73&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;74&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;75&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;76&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;77&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;78&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;79&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;80&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;81&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;82&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;83&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;84&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;85&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;86&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;87&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;88&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;89&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;90&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;91&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;92&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;93&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;94&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;95&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;96&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;97&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;98&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;99&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;100&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;101&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;102&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;103&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;104&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;105&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;106&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;107&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;108&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;109&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;110&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;111&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;112&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;113&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;114&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;115&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;116&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;117&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;118&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;119&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Create macros so that the matrices are stored in column-major order */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; A(i,j) a[ (j)*lda + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; B(i,j) b[ (j)*ldb + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; C(i,j) c[ (j)*ldc + (i) ]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Routine for computing C = A * B + C */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot4x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; )&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;MY_MMult&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; m, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; n, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i, j;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( j=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; j&amp;lt;n; j+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the columns of C, unrolled by 4 */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;m; i+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the rows of C */&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-comment&#34;&gt;/* Update C( i,j ), C( i,j+1 ), C( i,j+2 ), and C( i,j+3 ) in&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	 one routine (four inner products) */&lt;/span&gt;&lt;br&gt;&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot4x4&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i,&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;,j ), ldb, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,j ), ldc );&lt;br&gt;    &amp;#125;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot4x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* So, this routine computes a 4x4 block of matrix A&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 0, 0 ), C( 0, 1 ), C( 0, 2 ), C( 0, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 1, 0 ), C( 1, 1 ), C( 1, 2 ), C( 1, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 2, 0 ), C( 2, 1 ), C( 2, 2 ), C( 2, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 3, 0 ), C( 3, 1 ), C( 3, 2 ), C( 3, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     Notice that this routine is called with c = C( i, j ) in the&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     previous routine, so these are actually the elements &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i  , j ), C( i  , j+1 ), C( i  , j+2 ), C( i  , j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+1, j ), C( i+1, j+1 ), C( i+1, j+2 ), C( i+1, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+2, j ), C( i+2, j+1 ), C( i+2, j+2 ), C( i+2, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i+3, j ), C( i+3, j+1 ), C( i+3, j+2 ), C( i+3, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     in the original matrix C &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     In this version, we use pointer to track where in four columns of B we are */&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; p;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;register&lt;/span&gt; &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* hold contributions to&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       C( 0, 0 ), C( 0, 1 ), C( 0, 2 ), C( 0, 3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       C( 1, 0 ), C( 1, 1 ), C( 1, 2 ), C( 1, 3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       C( 2, 0 ), C( 2, 1 ), C( 2, 2 ), C( 2, 3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       C( 3, 0 ), C( 3, 1 ), C( 3, 2 ), C( 3, 3 )   */&lt;/span&gt;&lt;br&gt;       c_00_reg,   c_01_reg,   c_02_reg,   c_03_reg,  &lt;br&gt;       c_10_reg,   c_11_reg,   c_12_reg,   c_13_reg,  &lt;br&gt;       c_20_reg,   c_21_reg,   c_22_reg,   c_23_reg,  &lt;br&gt;       c_30_reg,   c_31_reg,   c_32_reg,   c_33_reg,&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* hold &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       A( 0, p ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       A( 1, p ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       A( 2, p ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       A( 3, p ) */&lt;/span&gt;&lt;br&gt;       a_0p_reg,&lt;br&gt;       a_1p_reg,&lt;br&gt;       a_2p_reg,&lt;br&gt;       a_3p_reg;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* Point to the current elements in the four columns of B */&lt;/span&gt;&lt;br&gt;    *b_p0_pntr, *b_p1_pntr, *b_p2_pntr, *b_p3_pntr; &lt;br&gt;&lt;br&gt;  c_00_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_01_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_02_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_03_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;&lt;br&gt;  c_10_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_11_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_12_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_13_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;&lt;br&gt;  c_20_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_21_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_22_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_23_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;&lt;br&gt;  c_30_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_31_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_32_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;   c_33_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    a_0p_reg = &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p );&lt;br&gt;    a_1p_reg = &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, p );&lt;br&gt;    a_2p_reg = &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, p );&lt;br&gt;    a_3p_reg = &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, p );&lt;br&gt;	  &lt;br&gt;    b_p0_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; );&lt;br&gt;    b_p1_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; );&lt;br&gt;    b_p2_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; );&lt;br&gt;    b_p3_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; );	  &lt;br&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* First row */&lt;/span&gt;&lt;br&gt;    c_00_reg += a_0p_reg * *b_p0_pntr;     &lt;br&gt;    c_01_reg += a_0p_reg * *b_p1_pntr;     &lt;br&gt;    c_02_reg += a_0p_reg * *b_p2_pntr;     &lt;br&gt;    c_03_reg += a_0p_reg * *b_p3_pntr;     &lt;br&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* Second row */&lt;/span&gt;&lt;br&gt;    c_10_reg += a_1p_reg * *b_p0_pntr;     &lt;br&gt;    c_11_reg += a_1p_reg * *b_p1_pntr;     &lt;br&gt;    c_12_reg += a_1p_reg * *b_p2_pntr;     &lt;br&gt;    c_13_reg += a_1p_reg * *b_p3_pntr;     &lt;br&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* Third row */&lt;/span&gt;&lt;br&gt;    c_20_reg += a_2p_reg * *b_p0_pntr;     &lt;br&gt;    c_21_reg += a_2p_reg * *b_p1_pntr;     &lt;br&gt;    c_22_reg += a_2p_reg * *b_p2_pntr;     &lt;br&gt;    c_23_reg += a_2p_reg * *b_p3_pntr;     &lt;br&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* Four row */&lt;/span&gt;&lt;br&gt;    c_30_reg += a_3p_reg * *b_p0_pntr++;     &lt;br&gt;    c_31_reg += a_3p_reg * *b_p1_pntr++;     &lt;br&gt;    c_32_reg += a_3p_reg * *b_p2_pntr++;     &lt;br&gt;    c_33_reg += a_3p_reg * *b_p3_pntr++;     &lt;br&gt;  &amp;#125;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_00_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_01_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_02_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_03_reg;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_10_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_11_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_12_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_13_reg;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_20_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_21_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_22_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_23_reg;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_30_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_31_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_32_reg;   &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_33_reg;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://xingyuanjie.top/2023/05/26/gemm0003/</guid>
            <title>Further optimizing</title>
            <link>https://xingyuanjie.top/2023/05/26/gemm0003/</link>
            <category>blas</category>
            <category>gemm</category>
            <category>gemv</category>
            <pubDate>Fri, 26 May 2023 17:20:18 +0800</pubDate>
            <description><![CDATA[ &lt;h2 id=&#34;Further-optimizing&#34;&gt;&lt;a href=&#34;#Further-optimizing&#34; class=&#34;headerlink&#34; title=&#34;Further optimizing&#34;&gt;&lt;/a&gt;Further optimizing&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;我们将C的元素累加到寄存器中，并使用寄存器存储a的元素&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/flame/how-to-optimize-gemm/wiki/Optimization_1x4_6&#34;&gt;Optimization_1x4_6 · flame&amp;#x2F;how-to-optimize-gemm Wiki (github.com)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;我们使用指针来定位B中的元素&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/flame/how-to-optimize-gemm/wiki/Optimization_1x4_7&#34;&gt;Optimization_1x4_7 · flame&amp;#x2F;how-to-optimize-gemm Wiki (github.com)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;我们将循环展开4次(展开因子的选择相对任意)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/flame/how-to-optimize-gemm/wiki/Optimization_1x4_8&#34;&gt;Optimization_1x4_8 · flame&amp;#x2F;how-to-optimize-gemm Wiki (github.com)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;我们使用间接寻址来减少需要更新指针的次数&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/flame/how-to-optimize-gemm/wiki/Optimization_1x4_9&#34;&gt;Optimization_1x4_9 · flame&amp;#x2F;how-to-optimize-gemm Wiki (github.com)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对于问题大小适合L2缓存(至少部分地)有相当大的改进。不过，还有很大的改进空间。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/2023/05/26/gemm0003/compare_MMult0_MMult-1x4-9.png&#34; alt=&#34;img&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;Optimization-1x4-6&#34;&gt;&lt;a href=&#34;#Optimization-1x4-6&#34; class=&#34;headerlink&#34; title=&#34;Optimization_1x4_6&#34;&gt;&lt;/a&gt;Optimization_1x4_6&lt;/h2&gt;&lt;p&gt;我们在寄存器中对当前1x4行C的更新累积，并将元素A(p, 0)放在寄存器中，以减少缓存(cache)和寄存器(reg)之间的流量(traffic)。&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;48&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;49&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;50&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;51&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;52&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;53&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;54&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;55&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;56&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;57&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;58&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;59&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;60&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;61&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;62&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;63&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;64&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;65&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;66&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;67&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;68&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;69&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;70&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;71&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;72&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Create macros so that the matrices are stored in column-major order */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; A(i,j) a[ (j)*lda + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; B(i,j) b[ (j)*ldb + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; C(i,j) c[ (j)*ldc + (i) ]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Routine for computing C = A * B + C */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot1x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;MY_MMult&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; m, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; n, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i, j;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( j=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; j&amp;lt;n; j+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the columns of C, unrolled by 4 */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;m; i+=&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the rows of C */&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-comment&#34;&gt;/* Update C( i,j ), C( i,j+1 ), C( i,j+2 ), and C( i,j+3 ) in&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	 one routine (four inner products) */&lt;/span&gt;&lt;br&gt;&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot1x4&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i,&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;,j ), ldb, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,j ), ldc );&lt;br&gt;    &amp;#125;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot1x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* So, this routine computes four elements of C: &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 0, 0 ), C( 0, 1 ), C( 0, 2 ), C( 0, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     Notice that this routine is called with c = C( i, j ) in the&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     previous routine, so these are actually the elements &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i, j ), C( i, j+1 ), C( i, j+2 ), C( i, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     in the original matrix C.&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     In this version, we accumulate in registers and put A( 0, p ) in a register */&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; p;&lt;br&gt;    &lt;br&gt;    &lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//C的累加在寄存器中，同时A也放在寄存器中&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;register&lt;/span&gt; &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* hold contributions to&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       C( 0, 0 ), C( 0, 1 ), C( 0, 2 ), C( 0, 3 ) */&lt;/span&gt;&lt;br&gt;       c_00_reg,   c_01_reg,   c_02_reg,   c_03_reg,  &lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* holds A( 0, p ) */&lt;/span&gt;&lt;br&gt;       a_0p_reg;&lt;br&gt;    &lt;br&gt;  c_00_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;; &lt;br&gt;  c_01_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;; &lt;br&gt;  c_02_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;; &lt;br&gt;  c_03_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;&lt;br&gt; &lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    a_0p_reg = &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p );&lt;br&gt;&lt;br&gt;    c_00_reg += a_0p_reg * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; );     &lt;br&gt;    c_01_reg += a_0p_reg * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; );     &lt;br&gt;    c_02_reg += a_0p_reg * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; );     &lt;br&gt;    c_03_reg += a_0p_reg * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; );     &lt;br&gt;  &amp;#125;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//计算完成后，再通过寄存器写回C&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_00_reg; &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_01_reg; &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_02_reg; &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_03_reg;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;Optimization-1x4-7&#34;&gt;&lt;a href=&#34;#Optimization-1x4-7&#34; class=&#34;headerlink&#34; title=&#34;Optimization_1x4_7&#34;&gt;&lt;/a&gt;Optimization_1x4_7&lt;/h2&gt;&lt;p&gt;现在使用bp0_pntr、bp1_pntr、bp2_pntr和bp3_pntr四个指针来访问元素B(p, 0)、B(p, 1)、B(p, 2)、B(p, 3)。这减少了索引开销。&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;48&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;49&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;50&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;51&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;52&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;53&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;54&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;55&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;56&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;57&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;58&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;59&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;60&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;61&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;62&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;63&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;64&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;65&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;66&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;67&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;68&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;69&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;70&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;71&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;72&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;73&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;74&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;75&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;76&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;77&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;78&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Create macros so that the matrices are stored in column-major order */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; A(i,j) a[ (j)*lda + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; B(i,j) b[ (j)*ldb + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; C(i,j) c[ (j)*ldc + (i) ]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Routine for computing C = A * B + C */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot1x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;MY_MMult&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; m, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; n, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i, j;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( j=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; j&amp;lt;n; j+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the columns of C, unrolled by 4 */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;m; i+=&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the rows of C */&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-comment&#34;&gt;/* Update C( i,j ), C( i,j+1 ), C( i,j+2 ), and C( i,j+3 ) in&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	 one routine (four inner products) */&lt;/span&gt;&lt;br&gt;&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot1x4&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i,&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;,j ), ldb, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,j ), ldc );&lt;br&gt;    &amp;#125;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot1x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* So, this routine computes four elements of C: &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 0, 0 ), C( 0, 1 ), C( 0, 2 ), C( 0, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     Notice that this routine is called with c = C( i, j ) in the&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     previous routine, so these are actually the elements &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i, j ), C( i, j+1 ), C( i, j+2 ), C( i, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     in the original matrix C.&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     In this version, we use pointer to track where in four columns of B we are */&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; p;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;register&lt;/span&gt; &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* hold contributions to&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       C( 0, 0 ), C( 0, 1 ), C( 0, 2 ), C( 0, 3 ) */&lt;/span&gt;&lt;br&gt;       c_00_reg,   c_01_reg,   c_02_reg,   c_03_reg,  &lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* holds A( 0, p ) */&lt;/span&gt;&lt;br&gt;       a_0p_reg;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* Point to the current elements in the four columns of B */&lt;/span&gt;&lt;br&gt;    *bp0_pntr, *bp1_pntr, *bp2_pntr, *bp3_pntr; &lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//由于使用了宏定义，每次B(i,j)都会计算B中元素的位置&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//使用指针后，后续访问不需要再额外计算B中元素位置，只需在当前指针向后移动一位即可&lt;/span&gt;&lt;br&gt;  bp0_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; );&lt;br&gt;  bp1_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; );&lt;br&gt;  bp2_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; );&lt;br&gt;  bp3_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; );&lt;br&gt;&lt;br&gt;  c_00_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;; &lt;br&gt;  c_01_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;; &lt;br&gt;  c_02_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;; &lt;br&gt;  c_03_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;&lt;br&gt; &lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    a_0p_reg = &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p );&lt;br&gt;&lt;br&gt;    c_00_reg += a_0p_reg * *bp0_pntr++;&lt;br&gt;    c_01_reg += a_0p_reg * *bp1_pntr++;&lt;br&gt;    c_02_reg += a_0p_reg * *bp2_pntr++;&lt;br&gt;    c_03_reg += a_0p_reg * *bp3_pntr++;&lt;br&gt;  &amp;#125;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_00_reg; &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_01_reg; &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_02_reg; &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_03_reg;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;Optimization-1x4-8&#34;&gt;&lt;a href=&#34;#Optimization-1x4-8&#34; class=&#34;headerlink&#34; title=&#34;Optimization_1x4_8&#34;&gt;&lt;/a&gt;Optimization_1x4_8&lt;/h2&gt;&lt;p&gt;我们现在展开了4个循环。有趣的是，这会略微降低性能。这可能意味着，通过添加优化，我们混淆了编译器，因此它不能做以前做的优化。&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;48&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;49&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;50&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;51&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;52&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;53&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;54&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;55&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;56&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;57&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;58&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;59&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;60&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;61&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;62&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;63&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;64&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;65&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;66&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;67&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;68&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;69&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;70&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;71&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;72&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;73&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;74&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;75&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;76&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;77&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;78&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;79&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;80&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;81&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;82&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;83&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;84&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;85&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;86&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;87&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;88&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;89&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;90&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;91&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;92&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;93&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;94&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;95&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;96&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;97&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;98&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Create macros so that the matrices are stored in column-major order */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; A(i,j) a[ (j)*lda + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; B(i,j) b[ (j)*ldb + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; C(i,j) c[ (j)*ldc + (i) ]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Routine for computing C = A * B + C */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot1x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;MY_MMult&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; m, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; n, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i, j;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( j=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; j&amp;lt;n; j+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the columns of C, unrolled by 4 */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;m; i+=&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the rows of C */&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-comment&#34;&gt;/* Update C( i,j ), C( i,j+1 ), C( i,j+2 ), and C( i,j+3 ) in&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	 one routine (four inner products) */&lt;/span&gt;&lt;br&gt;&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot1x4&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i,&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;,j ), ldb, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,j ), ldc );&lt;br&gt;    &amp;#125;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot1x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* So, this routine computes four elements of C: &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 0, 0 ), C( 0, 1 ), C( 0, 2 ), C( 0, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     Notice that this routine is called with c = C( i, j ) in the&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     previous routine, so these are actually the elements &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i, j ), C( i, j+1 ), C( i, j+2 ), C( i, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     in the original matrix C.&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     We now unroll the loop */&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; p;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;register&lt;/span&gt; &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* hold contributions to&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       C( 0, 0 ), C( 0, 1 ), C( 0, 2 ), C( 0, 3 ) */&lt;/span&gt;&lt;br&gt;       c_00_reg,   c_01_reg,   c_02_reg,   c_03_reg,  &lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* holds A( 0, p ) */&lt;/span&gt;&lt;br&gt;       a_0p_reg;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* Point to the current elements in the four columns of B */&lt;/span&gt;&lt;br&gt;    *bp0_pntr, *bp1_pntr, *bp2_pntr, *bp3_pntr; &lt;br&gt;    &lt;br&gt;  bp0_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; );&lt;br&gt;  bp1_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; );&lt;br&gt;  bp2_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; );&lt;br&gt;  bp3_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; );&lt;br&gt;&lt;br&gt;  c_00_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;; &lt;br&gt;  c_01_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;; &lt;br&gt;  c_02_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;; &lt;br&gt;  c_03_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//这里对循环变量p进行了展开，注意这里计算是顺序的&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;&lt;br&gt;    a_0p_reg = &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p );&lt;br&gt;&lt;br&gt;    c_00_reg += a_0p_reg * *bp0_pntr++;&lt;br&gt;    c_01_reg += a_0p_reg * *bp1_pntr++;&lt;br&gt;    c_02_reg += a_0p_reg * *bp2_pntr++;&lt;br&gt;    c_03_reg += a_0p_reg * *bp3_pntr++;&lt;br&gt;&lt;br&gt;    a_0p_reg = &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p+&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; );&lt;br&gt;&lt;br&gt;    c_00_reg += a_0p_reg * *bp0_pntr++;&lt;br&gt;    c_01_reg += a_0p_reg * *bp1_pntr++;&lt;br&gt;    c_02_reg += a_0p_reg * *bp2_pntr++;&lt;br&gt;    c_03_reg += a_0p_reg * *bp3_pntr++;&lt;br&gt;&lt;br&gt;    a_0p_reg = &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p+&lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; );&lt;br&gt;&lt;br&gt;    c_00_reg += a_0p_reg * *bp0_pntr++;&lt;br&gt;    c_01_reg += a_0p_reg * *bp1_pntr++;&lt;br&gt;    c_02_reg += a_0p_reg * *bp2_pntr++;&lt;br&gt;    c_03_reg += a_0p_reg * *bp3_pntr++;&lt;br&gt;&lt;br&gt;    a_0p_reg = &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p+&lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; );&lt;br&gt;&lt;br&gt;    c_00_reg += a_0p_reg * *bp0_pntr++;&lt;br&gt;    c_01_reg += a_0p_reg * *bp1_pntr++;&lt;br&gt;    c_02_reg += a_0p_reg * *bp2_pntr++;&lt;br&gt;    c_03_reg += a_0p_reg * *bp3_pntr++;&lt;br&gt;  &amp;#125;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_00_reg; &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_01_reg; &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_02_reg; &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_03_reg;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;Optimization-1x4-9&#34;&gt;&lt;a href=&#34;#Optimization-1x4-9&#34; class=&#34;headerlink&#34; title=&#34;Optimization_1x4_9&#34;&gt;&lt;/a&gt;Optimization_1x4_9&lt;/h2&gt;&lt;p&gt;在这里，*a0p_reg保存元素A(0, p+1)。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;我们希望bp0_pntr指向元素B（p，0）。因此，bp0_pntr+1寻址元素B（p+1，0）。有一条特殊的机器指令可以访问bp0_pntr+1处的元素，该指令不需要更新指针。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;因此，指向B列中元素的指针只需要在循环的第四次迭代中更新一次。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;48&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;49&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;50&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;51&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;52&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;53&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;54&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;55&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;56&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;57&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;58&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;59&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;60&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;61&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;62&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;63&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;64&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;65&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;66&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;67&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;68&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;69&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;70&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;71&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;72&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;73&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;74&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;75&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;76&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;77&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;78&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;79&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;80&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;81&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;82&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;83&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;84&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;85&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;86&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;87&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;88&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;89&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;90&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;91&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;92&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;93&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;94&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;95&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;96&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;97&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;98&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;99&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;100&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;101&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;102&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;103&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;104&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;105&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;106&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Create macros so that the matrices are stored in column-major order */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; A(i,j) a[ (j)*lda + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; B(i,j) b[ (j)*ldb + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; C(i,j) c[ (j)*ldc + (i) ]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Routine for computing C = A * B + C */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot1x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;MY_MMult&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; m, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; n, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i, j;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( j=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; j&amp;lt;n; j+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the columns of C, unrolled by 4 */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;m; i+=&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the rows of C */&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-comment&#34;&gt;/* Update C( i,j ), C( i,j+1 ), C( i,j+2 ), and C( i,j+3 ) in&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	 one routine (four inner products) */&lt;/span&gt;&lt;br&gt;&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot1x4&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i,&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;,j ), ldb, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,j ), ldc );&lt;br&gt;    &amp;#125;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot1x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* So, this routine computes four elements of C: &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 0, 0 ), C( 0, 1 ), C( 0, 2 ), C( 0, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     Notice that this routine is called with c = C( i, j ) in the&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     previous routine, so these are actually the elements &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i, j ), C( i, j+1 ), C( i, j+2 ), C( i, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     in the original matrix C.&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     We next use indirect addressing */&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; p;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;register&lt;/span&gt; &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* hold contributions to&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;       C( 0, 0 ), C( 0, 1 ), C( 0, 2 ), C( 0, 3 ) */&lt;/span&gt;&lt;br&gt;       c_00_reg,   c_01_reg,   c_02_reg,   c_03_reg,  &lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* holds A( 0, p ) */&lt;/span&gt;&lt;br&gt;       a_0p_reg;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;/* Point to the current elements in the four columns of B */&lt;/span&gt;&lt;br&gt;    *bp0_pntr, *bp1_pntr, *bp2_pntr, *bp3_pntr; &lt;br&gt;    &lt;br&gt;  bp0_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; );&lt;br&gt;  bp1_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; );&lt;br&gt;  bp2_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; );&lt;br&gt;  bp3_pntr = &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; );&lt;br&gt;&lt;br&gt;  c_00_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;; &lt;br&gt;  c_01_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;; &lt;br&gt;  c_02_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;; &lt;br&gt;  c_03_reg = &lt;span class=&#34;hljs-number&#34;&gt;0.0&lt;/span&gt;;&lt;br&gt; &lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;&lt;br&gt;    a_0p_reg = &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p );&lt;br&gt;&lt;br&gt;    c_00_reg += a_0p_reg * *bp0_pntr;&lt;br&gt;    c_01_reg += a_0p_reg * *bp1_pntr;&lt;br&gt;    c_02_reg += a_0p_reg * *bp2_pntr;&lt;br&gt;    c_03_reg += a_0p_reg * *bp3_pntr;&lt;br&gt;&lt;br&gt;    a_0p_reg = &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p+&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; );&lt;br&gt;	&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;//现在我们使用间接寻址，&amp;#x27;indirect addressing&amp;#x27;&lt;/span&gt;&lt;br&gt;    c_00_reg += a_0p_reg * *(bp0_pntr+&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;);&lt;br&gt;    c_01_reg += a_0p_reg * *(bp1_pntr+&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;);&lt;br&gt;    c_02_reg += a_0p_reg * *(bp2_pntr+&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;);&lt;br&gt;    c_03_reg += a_0p_reg * *(bp3_pntr+&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;);&lt;br&gt;&lt;br&gt;    a_0p_reg = &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p+&lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; );&lt;br&gt;&lt;br&gt;    c_00_reg += a_0p_reg * *(bp0_pntr+&lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;);&lt;br&gt;    c_01_reg += a_0p_reg * *(bp1_pntr+&lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;);&lt;br&gt;    c_02_reg += a_0p_reg * *(bp2_pntr+&lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;);&lt;br&gt;    c_03_reg += a_0p_reg * *(bp3_pntr+&lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;);&lt;br&gt;&lt;br&gt;    a_0p_reg = &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p+&lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; );&lt;br&gt;&lt;br&gt;    c_00_reg += a_0p_reg * *(bp0_pntr+&lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;);&lt;br&gt;    c_01_reg += a_0p_reg * *(bp1_pntr+&lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;);&lt;br&gt;    c_02_reg += a_0p_reg * *(bp2_pntr+&lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;);&lt;br&gt;    c_03_reg += a_0p_reg * *(bp3_pntr+&lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;);&lt;br&gt;	&lt;br&gt;      &lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;//更新指针，4次迭代中仅更新一次&lt;/span&gt;&lt;br&gt;    bp0_pntr+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt;;&lt;br&gt;    bp1_pntr+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt;;&lt;br&gt;    bp2_pntr+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt;;&lt;br&gt;    bp3_pntr+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt;;&lt;br&gt;  &amp;#125;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += c_00_reg; &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += c_01_reg; &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += c_02_reg; &lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += c_03_reg;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://xingyuanjie.top/2023/05/26/gemm0002/</guid>
            <title>Computing four elements at a time</title>
            <link>https://xingyuanjie.top/2023/05/26/gemm0002/</link>
            <category>blas</category>
            <category>gemm</category>
            <category>gemv</category>
            <pubDate>Fri, 26 May 2023 16:37:45 +0800</pubDate>
            <description><![CDATA[ &lt;h2 id=&#34;Computing-four-elements-at-a-time&#34;&gt;&lt;a href=&#34;#Computing-four-elements-at-a-time&#34; class=&#34;headerlink&#34; title=&#34;Computing four elements at a time&#34;&gt;&lt;/a&gt;Computing four elements at a time&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;我们在子程序AddDot1x4中一次计算4个元素，该子程序一次执行4个内部乘积&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/flame/how-to-optimize-gemm/wiki/Optimization_1x4_3&#34;&gt;Optimization_1x4_3 · flame&amp;#x2F;how-to-optimize-gemm Wiki (github.com)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;现在我们内联(inline)四个独立的内积，并将循环融合为一个，从而在一个循环中同时计算四个内积:&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/flame/how-to-optimize-gemm/wiki/Optimization_1x4_4&#34;&gt;Optimization_1x4_4 · flame&amp;#x2F;how-to-optimize-gemm Wiki (github.com)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/flame/how-to-optimize-gemm/wiki/Optimization_1x4_5&#34;&gt;Optimization_1x4_5 · flame&amp;#x2F;how-to-optimize-gemm Wiki (github.com)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在这一点上，我们开始看到一些性能改进:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/2023/05/26/gemm0002/compare_MMult0_MMult-1x4-5.png&#34; alt=&#34;img&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;Optimization-1x4-3&#34;&gt;&lt;a href=&#34;#Optimization-1x4-3&#34; class=&#34;headerlink&#34; title=&#34;Optimization_1x4_3&#34;&gt;&lt;/a&gt;Optimization_1x4_3&lt;/h2&gt;&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;48&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;49&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;50&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;51&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;52&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;53&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;54&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;55&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;56&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;57&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;58&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;59&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;60&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;61&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;62&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;63&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;64&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;65&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Create macros so that the matrices are stored in column-major order */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; A(i,j) a[ (j)*lda + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; B(i,j) b[ (j)*ldb + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; C(i,j) c[ (j)*ldc + (i) ]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Routine for computing C = A * B + C */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; * )&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot1x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;MY_MMult&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; m, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; n, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i, j;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( j=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; j&amp;lt;n; j+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the columns of C, unrolled by 4 */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;m; i+=&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the rows of C */&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-comment&#34;&gt;/* Update C( i,j ), C( i,j+1 ), C( i,j+2 ), and C( i,j+3 ) in&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	 one routine (four inner products) */&lt;/span&gt;&lt;br&gt;	  &lt;span class=&#34;hljs-comment&#34;&gt;//相交于上个版本，把4个AddDot合并成了一个AddDot1x4&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot1x4&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i,&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;,j ), ldb, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,j ), ldc );&lt;br&gt;    &amp;#125;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot1x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* So, this routine computes four elements of C: &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 0, 0 ), C( 0, 1 ), C( 0, 2 ), C( 0, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     Notice that this routine is called with c = C( i, j ) in the&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     previous routine, so these are actually the elements &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i, j ), C( i, j+1 ), C( i, j+2 ), C( i, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     in the original matrix C */&lt;/span&gt; &lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//一次AddDot1x4完成四次AddDot运算&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) );&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ), &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) );&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ), &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) );&lt;br&gt;  &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ), &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) );&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Create macro to let X( i ) equal the ith element of x */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; X(i) x[ (i)*incx ]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *x, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; incx,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *y, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *gamma )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* compute gamma := x&amp;#x27; * y + gamma with vectors x and y of length n.&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     Here x starts at location x with increment (stride) incx and y starts at location y and has (implicit) stride of 1.&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;  */&lt;/span&gt;&lt;br&gt; &lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; p;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    *gamma += &lt;span class=&#34;hljs-built_in&#34;&gt;X&lt;/span&gt;( p ) * y[ p ];     &lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;Optimization-1x4-4&#34;&gt;&lt;a href=&#34;#Optimization-1x4-4&#34; class=&#34;headerlink&#34; title=&#34;Optimization_1x4_4&#34;&gt;&lt;/a&gt;Optimization_1x4_4&lt;/h2&gt;&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;48&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;49&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;50&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;51&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;52&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;53&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;54&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;55&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;56&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;57&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;58&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;59&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;60&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;61&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;62&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;63&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;64&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Create macros so that the matrices are stored in column-major order */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; A(i,j) a[ (j)*lda + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; B(i,j) b[ (j)*ldb + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; C(i,j) c[ (j)*ldc + (i) ]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Routine for computing C = A * B + C */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot1x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;MY_MMult&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; m, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; n, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i, j;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( j=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; j&amp;lt;n; j+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the columns of C, unrolled by 4 */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;m; i+=&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the rows of C */&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-comment&#34;&gt;/* Update C( i,j ), C( i,j+1 ), C( i,j+2 ), and C( i,j+3 ) in&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	 one routine (four inner products) */&lt;/span&gt;&lt;br&gt;&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot1x4&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i,&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;,j ), ldb, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,j ), ldc );&lt;br&gt;    &amp;#125;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot1x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* So, this routine computes four elements of C: &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 0, 0 ), C( 0, 1 ), C( 0, 2 ), C( 0, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     Notice that this routine is called with c = C( i, j ) in the&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     previous routine, so these are actually the elements &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i, j ), C( i, j+1 ), C( i, j+2 ), C( i, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     in the original matrix C.&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     In this version, we &amp;quot;inline&amp;quot; AddDot */&lt;/span&gt; &lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; p;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//在这里我们把AddDot中的运算，全部集成到了AddDot1x4中，即4段for执行4个内部乘积&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//  AddDot( k, &amp;amp;A( 0, 0 ), lda, &amp;amp;B( 0, 0 ), &amp;amp;C( 0, 0 ) );&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; );     &lt;br&gt;  &amp;#125;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//  AddDot( k, &amp;amp;A( 0, 0 ), lda, &amp;amp;B( 0, 1 ), &amp;amp;C( 0, 1 ) );&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; );     &lt;br&gt;  &amp;#125;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//  AddDot( k, &amp;amp;A( 0, 0 ), lda, &amp;amp;B( 0, 2 ), &amp;amp;C( 0, 2 ) );&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; );     &lt;br&gt;  &amp;#125;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//  AddDot( k, &amp;amp;A( 0, 0 ), lda, &amp;amp;B( 0, 3 ), &amp;amp;C( 0, 3 ) );&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; );     &lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;Optimization-1x4-5&#34;&gt;&lt;a href=&#34;#Optimization-1x4-5&#34; class=&#34;headerlink&#34; title=&#34;Optimization_1x4_5&#34;&gt;&lt;/a&gt;Optimization_1x4_5&lt;/h2&gt;&lt;p&gt;在这个版本，我们开始看到性能上的好处。原因是四个循环已经融合，因此四个内部乘积运算现在正在同时进行。这有以下好处:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;索引p只需要每8次浮点操作更新一次(4次乘法4次加法)。&lt;/li&gt;
&lt;li&gt;元素A(0, p)只需要从内存中取出一次，而不是四次。(只有当矩阵不再适合二级缓存时，这才有好处)&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;48&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;49&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;50&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;51&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;52&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;53&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;54&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;55&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;56&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Create macros so that the matrices are stored in column-major order */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; A(i,j) a[ (j)*lda + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; B(i,j) b[ (j)*ldb + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; C(i,j) c[ (j)*ldc + (i) ]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Routine for computing C = A * B + C */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot1x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;MY_MMult&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; m, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; n, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i, j;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( j=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; j&amp;lt;n; j+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the columns of C, unrolled by 4 */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;m; i+=&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the rows of C */&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-comment&#34;&gt;/* Update C( i,j ), C( i,j+1 ), C( i,j+2 ), and C( i,j+3 ) in&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	 one routine (four inner products) */&lt;/span&gt;&lt;br&gt;&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot1x4&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i,&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;,j ), ldb, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,j ), ldc );&lt;br&gt;    &amp;#125;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot1x4&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* So, this routine computes four elements of C: &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( 0, 0 ), C( 0, 1 ), C( 0, 2 ), C( 0, 3 ).  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     Notice that this routine is called with c = C( i, j ) in the&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     previous routine, so these are actually the elements &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;           C( i, j ), C( i, j+1 ), C( i, j+2 ), C( i, j+3 ) &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     in the original matrix C.&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     In this version, we merge the four loops, computing four inner&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     products simultaneously. */&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; p;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//在这个版本中，我们合并了4个for循环，使得可以同时计算4个乘积运算&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//  AddDot( k, &amp;amp;A( 0, 0 ), lda, &amp;amp;B( 0, 0 ), &amp;amp;C( 0, 0 ) );&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//  AddDot( k, &amp;amp;A( 0, 0 ), lda, &amp;amp;B( 0, 1 ), &amp;amp;C( 0, 1 ) );&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//  AddDot( k, &amp;amp;A( 0, 0 ), lda, &amp;amp;B( 0, 2 ), &amp;amp;C( 0, 2 ) );&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//  AddDot( k, &amp;amp;A( 0, 0 ), lda, &amp;amp;B( 0, 3 ), &amp;amp;C( 0, 3 ) );&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; );     &lt;span class=&#34;hljs-comment&#34;&gt;//第一次取A( 0, p )&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; );     &lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; );     &lt;br&gt;    &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) += &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;, p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p, &lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; );     &lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://xingyuanjie.top/2023/05/26/gemm0001/</guid>
            <title>Hiding computation in a subroutine</title>
            <link>https://xingyuanjie.top/2023/05/26/gemm0001/</link>
            <category>blas</category>
            <category>gemm</category>
            <category>gemv</category>
            <pubDate>Fri, 26 May 2023 15:06:49 +0800</pubDate>
            <description><![CDATA[ &lt;h2 id=&#34;Hiding-computation-in-a-subroutine&#34;&gt;&lt;a href=&#34;#Hiding-computation-in-a-subroutine&#34; class=&#34;headerlink&#34; title=&#34;Hiding computation in a subroutine&#34;&gt;&lt;/a&gt;Hiding computation in a subroutine&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;我们首先重写基本实现，将内部循环隐藏在子程序AddDot中:&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/flame/how-to-optimize-gemm/wiki/Optimization1&#34;&gt;Optimization1 · flame&amp;#x2F;how-to-optimize-gemm Wiki (github.com)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/flame/how-to-optimize-gemm/wiki/Optimization2&#34;&gt;Optimization2 · flame&amp;#x2F;how-to-optimize-gemm Wiki (github.com)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这一步不会产生任何性能提升：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://github.com/flame/how-to-optimize-gemm/raw/master/figures/compare_MMult0_MMult2.png&#34; alt=&#34;img&#34;&gt;&lt;/p&gt;
&lt;p&gt;它其实是为我们下一步做好准备。&lt;/p&gt;
&lt;h2 id=&#34;Optimization1&#34;&gt;&lt;a href=&#34;#Optimization1&#34; class=&#34;headerlink&#34; title=&#34;Optimization1&#34;&gt;&lt;/a&gt;Optimization1&lt;/h2&gt;&lt;p&gt;这里最原始的矩阵乘代码：&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Create macros so that the matrices are stored in column-major order */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;//创建宏，使矩阵是列主序&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; A(i,j) a[ (j)*lda + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; B(i,j) b[ (j)*ldb + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; C(i,j) c[ (j)*ldc + (i) ]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Routine for computing C = A * B + C */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;MY_MMult&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; m, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; n, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i, j, p;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//loop i j p&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;m; i++ )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the rows of C 遍历C的行 */&lt;/span&gt;   &lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( j=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; j&amp;lt;n; j++ )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the columns of C 遍历C的列 */&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Update C( i,j ) with the inner&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;				       product of the ith row of A and&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;				       the jth column of B */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;//A的一行B的一列更新C(i,j)&lt;/span&gt;&lt;br&gt;	&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,j ) = &lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,j ) +  &lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i,p ) * &lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( p,j );&lt;br&gt;      &amp;#125;&lt;br&gt;    &amp;#125;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;拆分内部循环，把乘加运算放在子程序AddDot中:&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;46&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Create macros so that the matrices are stored in column-major order */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; A(i,j) a[ (j)*lda + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; B(i,j) b[ (j)*ldb + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; C(i,j) c[ (j)*ldc + (i) ]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Routine for computing C = A * B + C */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; * )&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;MY_MMult&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; m, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; n, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i, j;&lt;br&gt;	&lt;br&gt;   &lt;span class=&#34;hljs-comment&#34;&gt;//loop j i p   在这里更改了循环变量的顺序&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( j=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; j&amp;lt;n; j+=&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the columns of C */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;m; i+=&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the rows of C */&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-comment&#34;&gt;/* Update the C( i,j ) with the inner product of the ith row of A&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	 and the jth column of B */&lt;/span&gt;&lt;br&gt;	  &lt;span class=&#34;hljs-comment&#34;&gt;//拆分内部循环(循环变量p)，把乘加运算放在子程序AddDot中:&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-comment&#34;&gt;//A的第i行，B的第j列&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i,&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;,j ), &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,j ) );&lt;br&gt;    &amp;#125;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Create macro to let X( i ) equal the ith element of x */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; X(i) x[ (i)*incx ]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *x, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; incx,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *y, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *gamma )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* compute gamma := x&amp;#x27; * y + gamma with vectors x and y of length n.&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     Here x starts at location x with increment (stride) incx and y starts at location y and has (implicit) stride of 1.&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;  */&lt;/span&gt;&lt;br&gt; &lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; p;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//列主序，同行访问带跨步，同列访问无需跨步。跨步大小lda&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    *gamma += &lt;span class=&#34;hljs-built_in&#34;&gt;X&lt;/span&gt;( p ) * y[ p ];     &lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;Optimization2&#34;&gt;&lt;a href=&#34;#Optimization2&#34; class=&#34;headerlink&#34; title=&#34;Optimization2&#34;&gt;&lt;/a&gt;Optimization2&lt;/h2&gt;&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;48&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;49&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;50&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;51&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;52&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;53&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;54&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;55&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;56&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;57&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;58&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;59&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;60&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Create macros so that the matrices are stored in column-major order */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; A(i,j) a[ (j)*lda + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; B(i,j) b[ (j)*ldb + (i) ]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; C(i,j) c[ (j)*ldc + (i) ]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Routine for computing C = A * B + C */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; * )&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;MY_MMult&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; m, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; n, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *a, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; lda, &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *b, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldb,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-params&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;                                    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *c, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; ldc )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i, j;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;//在这里对C的列进行了循环展开，展开数为4。列主序&lt;/span&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( j=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; j&amp;lt;n; j+=&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the columns of C, unrolled by 4 */&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( i=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; i&amp;lt;m; i+=&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; )&amp;#123;        &lt;span class=&#34;hljs-comment&#34;&gt;/* Loop over the rows of C */&lt;/span&gt;&lt;br&gt;      &lt;span class=&#34;hljs-comment&#34;&gt;/* Update the C( i,j ) with the inner product of the ith row of A&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	 and the jth column of B */&lt;/span&gt;&lt;br&gt;&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i,&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;,j ), &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,j ) );&lt;br&gt;&lt;br&gt;      &lt;span class=&#34;hljs-comment&#34;&gt;/* Update the C( i,j+1 ) with the inner product of the ith row of A&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	 and the (j+1)th column of B */&lt;/span&gt;&lt;br&gt;&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i,&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;,j+&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ), &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,j+&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt; ) );&lt;br&gt;&lt;br&gt;      &lt;span class=&#34;hljs-comment&#34;&gt;/* Update the C( i,j+2 ) with the inner product of the ith row of A&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	 and the (j+2)th column of B */&lt;/span&gt;&lt;br&gt;&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i,&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;,j+&lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ), &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,j+&lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt; ) );&lt;br&gt;&lt;br&gt;      &lt;span class=&#34;hljs-comment&#34;&gt;/* Update the C( i,j+3 ) with the inner product of the ith row of A&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;	 and the (j+1)th column of B */&lt;/span&gt;&lt;br&gt;&lt;br&gt;      &lt;span class=&#34;hljs-built_in&#34;&gt;AddDot&lt;/span&gt;( k, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;A&lt;/span&gt;( i,&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt; ), lda, &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;B&lt;/span&gt;( &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;,j+&lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ), &amp;amp;&lt;span class=&#34;hljs-built_in&#34;&gt;C&lt;/span&gt;( i,j+&lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt; ) );&lt;br&gt;    &amp;#125;&lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;/* Create macro to let X( i ) equal the ith element of x */&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-meta&#34;&gt;#&lt;span class=&#34;hljs-meta-keyword&#34;&gt;define&lt;/span&gt; X(i) x[ (i)*incx ]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;//内层核心相较于上次来说，并没有修改&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;AddDot&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;( &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; k, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *x, &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; incx,  &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *y, &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; *gamma )&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;  &lt;span class=&#34;hljs-comment&#34;&gt;/* compute gamma := x&amp;#x27; * y + gamma with vectors x and y of length n.&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;     Here x starts at location x with increment (stride) incx and y starts at location y and has (implicit) stride of 1.&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;  */&lt;/span&gt;&lt;br&gt; &lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; p;&lt;br&gt;&lt;br&gt;  &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; ( p=&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;; p&amp;lt;k; p++ )&amp;#123;&lt;br&gt;    *gamma += &lt;span class=&#34;hljs-built_in&#34;&gt;X&lt;/span&gt;( p ) * y[ p ];     &lt;br&gt;  &amp;#125;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://xingyuanjie.top/2023/05/22/blas/</guid>
            <title>BLAS（Basic Linear Algebra Subprograms）-基础线性代数子程序库</title>
            <link>https://xingyuanjie.top/2023/05/22/blas/</link>
            <category>blas</category>
            <category>gemm</category>
            <category>gemv</category>
            <pubDate>Mon, 22 May 2023 20:35:17 +0800</pubDate>
            <description><![CDATA[ &lt;h2 id=&#34;how-to-optimize-gemm&#34;&gt;&lt;a href=&#34;#how-to-optimize-gemm&#34; class=&#34;headerlink&#34; title=&#34;how-to-optimize-gemm&#34;&gt;&lt;/a&gt;how-to-optimize-gemm&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;项目地址：&lt;/strong&gt;&lt;a href=&#34;https://github.com/flame/how-to-optimize-gemm&#34;&gt;flame&amp;#x2F;how-to-optimize-gemm (github.com)&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;Computing-four-elements-of-C-at-a-time&#34;&gt;&lt;a href=&#34;#Computing-four-elements-of-C-at-a-time&#34; class=&#34;headerlink&#34; title=&#34;Computing four elements of C at a time&#34;&gt;&lt;/a&gt;Computing four elements of C at a time&lt;/h3&gt;&lt;p&gt;&lt;a href=&#34;https://xingyuanjie.top/2023/05/26/gemm0001/&#34;&gt;Hiding computation in a subroutine - Amicoyuan (xingyuanjie.top)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://xingyuanjie.top/2023/05/26/gemm0002/&#34;&gt;Computing four elements at a time - Amicoyuan (xingyuanjie.top)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://xingyuanjie.top/2023/05/26/gemm0003/&#34;&gt;Further optimizing - Amicoyuan (xingyuanjie.top)&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;Computing-a-4-x-4-block-of-C-at-a-time&#34;&gt;&lt;a href=&#34;#Computing-a-4-x-4-block-of-C-at-a-time&#34; class=&#34;headerlink&#34; title=&#34;Computing a 4 x 4 block of C at a time&#34;&gt;&lt;/a&gt;Computing a 4 x 4 block of C at a time&lt;/h3&gt;&lt;p&gt;为了有效地使用向量指令和向量寄存器，我们现在一次计算一个4 x 4的C代码块。其思想如下:作为SSE3指令集的一部分，有一些特殊的指令允许每个时钟周期执行两次“乘法累加”操作(两次乘法和两次加法)，每个时钟周期总共执行四个浮点操作。要使用这些，必须将数据放入“向量寄存器”中。有16个这样的向量寄存器，每个向量寄存器可以容纳两个双精度数。因此，我们可以在寄存器中保存32个双精度数。我们将使用其中的16个来保存C的元素，一个4 x 4的块。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://xingyuanjie.top/2023/05/31/gemm0004/&#34;&gt;Repeating the same optimizations - Amicoyuan (xingyuanjie.top)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://xingyuanjie.top/2023/06/07/gemm0005/&#34;&gt;Further optimizing - Amicoyuan (xingyuanjie.top)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://xingyuanjie.top/2023/06/07/gemm0006/&#34;&gt;Blocking to maintain performance - Amicoyuan (xingyuanjie.top)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://xingyuanjie.top/2023/06/07/gemm0007/&#34;&gt;Packing into contiguous memory - Amicoyuan (xingyuanjie.top)&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;Acknowledgement&#34;&gt;&lt;a href=&#34;#Acknowledgement&#34; class=&#34;headerlink&#34; title=&#34;Acknowledgement&#34;&gt;&lt;/a&gt;Acknowledgement&lt;/h3&gt;&lt;p&gt;This material was partially sponsored by grants from the National Science Foundation (Awards ACI-1148125&amp;#x2F;1340293).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Any opinions, findings and conclusions or recommendations expressed in this material are those of the author(s) and do not necessarily reflect the views of the National Science Foundation (NSF).&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;论文阅读&#34;&gt;&lt;a href=&#34;#论文阅读&#34; class=&#34;headerlink&#34; title=&#34;论文阅读&#34;&gt;&lt;/a&gt;论文阅读&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://xingyuanjie.top/2023/06/09/gemm0008/&#34;&gt;论文阅读：面向国产申威 26010 众核处理器的 SpMV 实现与优化 - Amicoyuan (xingyuanjie.top)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://xingyuanjie.top/2023/07/03/gemm0009/&#34;&gt;论文阅读：稀疏矩阵向量乘法在申威众核架构上的性能优化 - Amicoyuan (xingyuanjie.top)&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;&lt;a href=&#34;#参考资料&#34; class=&#34;headerlink&#34; title=&#34;参考资料&#34;&gt;&lt;/a&gt;参考资料&lt;/h2&gt;&lt;h3 id=&#34;博客&#34;&gt;&lt;a href=&#34;#博客&#34; class=&#34;headerlink&#34; title=&#34;博客:&#34;&gt;&lt;/a&gt;博客:&lt;/h3&gt;&lt;p&gt;&lt;a href=&#34;https://www.jianshu.com/p/e01024892afb&#34;&gt;矩阵相乘在GPU上的终极优化：深度解析Maxas汇编器工作原理 - 简书 (jianshu.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.leiphone.com/category/yanxishe/Puevv3ZWxn0heoEv.html&#34;&gt;OpenBLAS项目与矩阵乘法优化 | AI 研习社 | 雷峰网 (leiphone.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://jcf94.com/2021/08/28/2021-08-28-simd/&#34;&gt;矩阵乘法与 SIMD | Chenfan Blog (jcf94.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://zhenhuaw.me/blog/2019/gemm-optimization.html&#34;&gt;通用矩阵乘（GEMM）优化算法 | 黎明灰烬 博客 (zhenhuaw.me)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://zhuanlan.zhihu.com/p/383115932&#34;&gt;大佬是怎么优雅实现矩阵乘法的？ - 知乎 (zhihu.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://zhuanlan.zhihu.com/p/65436463&#34;&gt;OpenBLAS gemm从零入门 - 知乎 (zhihu.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://harleyszhang.github.io/cv_note/&#34;&gt;Introduction · cv算法工程师成长之路 (harleyszhang.github.io)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://zhuanlan.zhihu.com/p/435908830&#34;&gt;深入浅出GPU优化系列：GEMM优化（一） - 知乎 (zhihu.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://zhuanlan.zhihu.com/p/410278370&#34;&gt;CUDA 矩阵乘法终极优化指南 - 知乎 (zhihu.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://zhuanlan.zhihu.com/p/368870275&#34;&gt;矩阵乘法的并行优化（1）：OPENMP、CUDA实现 - 知乎 (zhihu.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://zhuanlan.zhihu.com/p/617296073&#34;&gt;并行计算入门 UIUC ECE408 Lecture 7&amp;amp;8 - 知乎 (zhihu.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://zhuanlan.zhihu.com/p/143328317&#34;&gt;移动端arm cpu优化学习笔记第4弹–内联汇编入门 - 知乎 (zhihu.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://zhuanlan.zhihu.com/p/348372132&#34;&gt;C语言的内嵌汇编 - 知乎 (zhihu.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://zhuanlan.zhihu.com/p/105616727&#34;&gt;内嵌汇编学习 - 知乎 (zhihu.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.csdn.net/unbutun/article/details/6123472&#34;&gt;(88条消息) #define barrier() &lt;strong&gt;asm&lt;/strong&gt; &lt;strong&gt;volatile&lt;/strong&gt;(“”: : :”memory”) 中的memory是gcc的东西_unbutun的博客-CSDN博客&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.csdn.net/weixin_38669561/article/details/105192200?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.control&amp;depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.control&#34;&gt;(88条消息) MIPS指令集：内嵌汇编asm语法介绍_daddu指令_无色云的博客-CSDN博客&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;论文：&#34;&gt;&lt;a href=&#34;#论文：&#34; class=&#34;headerlink&#34; title=&#34;论文：&#34;&gt;&lt;/a&gt;论文：&lt;/h3&gt;&lt;p&gt;&lt;a href=&#34;https://www.cs.utexas.edu/users/flame/FLAMEPublications.html&#34;&gt;Publications Related to the FLAME Project (utexas.edu)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://dl.acm.org/doi/10.1145/1356052.1356053&#34;&gt;Anatomy of high-performance matrix multiplication | ACM Transactions on Mathematical Software&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://dl.acm.org/doi/10.1145/3018743.3018755&#34;&gt;Understanding the GPU Microarchitecture to Achieve Bare-Metal Performance Tuning | Proceedings of the 22nd ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[&lt;a href=&#34;https://arxiv.org/abs/1804.06826&#34;&gt;1804.06826] Dissecting the NVIDIA Volta GPU Architecture via Microbenchmarking (arxiv.org)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://ieeexplore.ieee.org/document/6114452&#34;&gt;Fast implementation of DGEMM on Fermi GPU | IEEE Conference Publication | IEEE Xplore&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://dl.acm.org/doi/abs/10.1145/3369583.3393611&#34;&gt;High Performance is All about Minimizing Data Movement | Proceedings of the 29th International Symposium on High-Performance Parallel and Distributed Computing (acm.org)&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;社区-x2F-论坛&#34;&gt;&lt;a href=&#34;#社区-x2F-论坛&#34; class=&#34;headerlink&#34; title=&#34;社区&amp;#x2F;论坛:&#34;&gt;&lt;/a&gt;社区&amp;#x2F;论坛:&lt;/h3&gt;&lt;p&gt;&lt;a href=&#34;http://tvm.d2l.ai/chapter_gpu_schedules/vector_add.html#cuda-programming&#34;&gt;2. Vector Add — Dive into Deep Learning Compiler 0.1 documentation (d2l.ai)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html&#34;&gt;Intel® Intrinsics Guide&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/pytorch/QNNPACK&#34;&gt;https://github.com/pytorch/QNNPACK&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/flame/blis&#34;&gt;https://github.com/flame/blis&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.mathematik.uni-ulm.de/~lehn/apfel/ulmBLAS/&#34;&gt;ulmBLAS (index) (uni-ulm.de)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.mathematik.uni-ulm.de/~lehn/apfel/sghpc/gemm/index.html&#34;&gt;work&amp;#x2F;sghpc (index) (uni-ulm.de)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://shpc.oden.utexas.edu/&#34;&gt;The Science of High-Performance Computing Group (utexas.edu)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/BBuf/how-to-optimize-gemm&#34;&gt;GitHub - BBuf&amp;#x2F;how-to-optimize-gemm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/Liu-xiandong/How_to_optimize_in_GPU&#34;&gt;GitHub - Liu-xiandong&amp;#x2F;How_to_optimize_in_GPU: This is a series of GPU optimization topics. Here we will introduce how to optimize the CUDA kernel in detail. I will introduce several basic kernel optimizations, including: elementwise, reduce, sgemv, sgemm, etc. The performance of these kernels is basically at or near the theoretical limit.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.nvidia.com/cuda/cuda-c-programming-guide/#&#34;&gt;CUDA C++ Programming Guide (nvidia.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/NervanaSystems/maxas/wiki/SGEMM&#34;&gt;SGEMM · NervanaSystems&amp;#x2F;maxas Wiki · GitHub&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/Cjkkkk/CUDA_gemm&#34;&gt;GitHub - Cjkkkk&amp;#x2F;CUDA_gemm: A simple high performance CUDA GEMM implementation.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/yzhaiustc/Optimizing-SGEMM-on-NVIDIA-Turing-GPUs&#34;&gt;GitHub - yzhaiustc&amp;#x2F;Optimizing-SGEMM-on-NVIDIA-Turing-GPUs: Optimizing SGEMM kernel functions on NVIDIA GPUs to a close-to-cuBLAS performance.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://developer.nvidia.com/blog/cutlass-linear-algebra-cuda/&#34;&gt;https://developer.nvidia.com/blog/cutlass-linear-algebra-cuda/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://wiki.illinois.edu/wiki/display/ECE408/Class+Schedule&#34;&gt;Class Schedule - ECE408 - Illinois Wiki&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#toc2&#34;&gt;GCC-Inline-Assembly-HOWTO (ibiblio.org)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://missing-semester-cn.github.io/&#34;&gt;计算机教育中缺失的一课 · the missing semester of your cs education (missing-semester-cn.github.io)&lt;/a&gt;&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://xingyuanjie.top/2023/04/30/enum/</guid>
            <title>C/C++枚举类型 enum</title>
            <link>https://xingyuanjie.top/2023/04/30/enum/</link>
            <category>C/C++</category>
            <pubDate>Sun, 30 Apr 2023 15:44:23 +0800</pubDate>
            <description><![CDATA[ &lt;h2 id=&#34;C-x2F-C-枚举类型-enum&#34;&gt;&lt;a href=&#34;#C-x2F-C-枚举类型-enum&#34; class=&#34;headerlink&#34; title=&#34;C&amp;#x2F;C++枚举类型 enum&#34;&gt;&lt;/a&gt;C&amp;#x2F;C++枚举类型 enum&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;枚举类型的定义：&lt;/strong&gt;枚举类型(enumeration)是 C++ 中的一种派生数据类型，它是由用户定义的若干枚举常量的集合。&lt;/p&gt;
&lt;p&gt;定义格式：枚举类型的定义格式为：&lt;/p&gt;
&lt;figure class=&#34;highlight bnf&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs bnf&#34;&gt;enum &lt;span class=&#34;hljs-attribute&#34;&gt;&amp;lt;类型名&amp;gt;&lt;/span&gt; &amp;#123;&lt;span class=&#34;hljs-attribute&#34;&gt;&amp;lt;枚举常量表&amp;gt;&lt;/span&gt;&amp;#125;;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;格式说明：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;关键字enum——指明其后的标识符是一个枚举类型的名字。&lt;/li&gt;
&lt;li&gt;枚举常量表——由枚举常量构成。”枚举常量”或称”枚举成员”，是以标识符形式表示的整型量，表示枚举类型的取值。枚举常量表列出枚举类型的所有取值，各枚举常量之间以”，”间隔，且必须各不相同。取值类型与条件表达式相同。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;应用举例：&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;span class=&#34;hljs-class&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;enum&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;color_set1&lt;/span&gt; &amp;#123;&lt;/span&gt;RED, BLUE, WHITE, BLACK&amp;#125;; &lt;span class=&#34;hljs-comment&#34;&gt;// 定义枚举类型color_set1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-class&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;enum&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;week&lt;/span&gt; &amp;#123;&lt;/span&gt;Sun, Mon, Tue, Wed, Thu, Fri, Sat&amp;#125;; &lt;span class=&#34;hljs-comment&#34;&gt;// 定义枚举类型week&lt;/span&gt;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;重要提示：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;枚举常量代表该枚举类型的变量可能取的值，编译系统为每个枚举常量指定一个整数值，默认状态下，这个整数就是所列举元素的序号，序号从0开始。 可以在定义枚举类型时为部分或全部枚举常量指定整数值，在指定值之前的枚举常量仍按默认方式取值，而指定值之后的枚举常量按依次加1的原则取值。 各枚举常量的值可以重复。例如：&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;span class=&#34;hljs-class&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;enum&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;fruit_set&lt;/span&gt; &amp;#123;&lt;/span&gt;apple, orange, banana=&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, peach, grape&amp;#125;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;//枚举常量apple=0,orange=1, banana=1,peach=2,grape=3。&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;enum&lt;/span&gt; week &amp;#123;Sun=&lt;span class=&#34;hljs-number&#34;&gt;7&lt;/span&gt;, Mon=&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, Tue, Wed, Thu, Fri, Sat&amp;#125;;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;//枚举常量Sun,Mon,Tue,Wed,Thu,Fri,Sat的值分别为7、1、2、3、4、5、6。&lt;/span&gt;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;枚举常量只能以标识符形式表示，而不能是整型、字符型等文字常量。例如，以下定义非法：&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;span class=&#34;hljs-class&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;enum&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;letter_set&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;span class=&#34;hljs-string&#34;&gt;&amp;#x27;a&amp;#x27;&lt;/span&gt;,&lt;span class=&#34;hljs-string&#34;&gt;&amp;#x27;d&amp;#x27;&lt;/span&gt;,&lt;span class=&#34;hljs-string&#34;&gt;&amp;#x27;F&amp;#x27;&lt;/span&gt;,&lt;span class=&#34;hljs-string&#34;&gt;&amp;#x27;s&amp;#x27;&lt;/span&gt;,&lt;span class=&#34;hljs-string&#34;&gt;&amp;#x27;T&amp;#x27;&lt;/span&gt;&amp;#125;; &lt;span class=&#34;hljs-comment&#34;&gt;//枚举常量不能是字符常量&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-class&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;enum&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;year_set&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;span class=&#34;hljs-number&#34;&gt;2000&lt;/span&gt;,&lt;span class=&#34;hljs-number&#34;&gt;2001&lt;/span&gt;,&lt;span class=&#34;hljs-number&#34;&gt;2002&lt;/span&gt;,&lt;span class=&#34;hljs-number&#34;&gt;2003&lt;/span&gt;,&lt;span class=&#34;hljs-number&#34;&gt;2004&lt;/span&gt;,&lt;span class=&#34;hljs-number&#34;&gt;2005&lt;/span&gt;&amp;#125;; &lt;span class=&#34;hljs-comment&#34;&gt;//枚举常量不能是整型常量&lt;/span&gt;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;可改为以下形式则定义合法：&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;span class=&#34;hljs-class&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;enum&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;letter_set&lt;/span&gt; &amp;#123;&lt;/span&gt;a, d, F, s, T&amp;#125;;&lt;br&gt;&lt;span class=&#34;hljs-class&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;enum&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;year_set&lt;/span&gt;&amp;#123;&lt;/span&gt;y2000, y2001, y2002, y2003, y2004, y2005&amp;#125;;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;hr&gt;
&lt;h2 id=&#34;枚举变量的使用&#34;&gt;&lt;a href=&#34;#枚举变量的使用&#34; class=&#34;headerlink&#34; title=&#34;枚举变量的使用&#34;&gt;&lt;/a&gt;枚举变量的使用&lt;/h2&gt;&lt;p&gt;定义枚举类型的主要目的是：增加程序的可读性。枚举类型最常见也最有意义的用处之一就是用来描述状态量，这点将在第9章 输入输出流类看到。&lt;/p&gt;
&lt;p&gt;定义格式：定义枚举类型之后，就可以定义该枚举类型的变量，如：&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;color_set1 color1, color2;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;亦可类型与变量同时定义（甚至类型名可省），格式如下：&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;span class=&#34;hljs-class&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;enum&lt;/span&gt; &amp;#123;&lt;/span&gt;Sun,Mon,Tue,Wed,Thu,Fri,Sat&amp;#125; weekday1, weekday2;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h3 id=&#34;相关操作&#34;&gt;&lt;a href=&#34;#相关操作&#34; class=&#34;headerlink&#34; title=&#34;相关操作&#34;&gt;&lt;/a&gt;相关操作&lt;/h3&gt;&lt;p&gt;枚举变量的值只能取枚举常量表中所列的值，就是整型数的一个子集。&lt;/p&gt;
&lt;p&gt;枚举变量占用内存的大小与整型数相同。&lt;/p&gt;
&lt;p&gt;枚举变量只能参与赋值和关系运算以及输出操作，参与运算时用其本身的整数值。例如，设有定义：&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;span class=&#34;hljs-class&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;enum&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;color_set1&lt;/span&gt; &amp;#123;&lt;/span&gt;RED, BLUE, WHITE, BLACK&amp;#125; color1, color2;&lt;br&gt;&lt;span class=&#34;hljs-class&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;enum&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;color_set2&lt;/span&gt; &amp;#123;&lt;/span&gt; GREEN, RED, YELLOW, WHITE&amp;#125; color3, color4;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;则允许的赋值操作如下：&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;color3=RED;           &lt;span class=&#34;hljs-comment&#34;&gt;//将枚举常量值赋给枚举变量&lt;/span&gt;&lt;br&gt;color4=color3;        &lt;span class=&#34;hljs-comment&#34;&gt;//相同类型的枚举变量赋值，color4的值为RED&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;  i=color3;        &lt;span class=&#34;hljs-comment&#34;&gt;//将枚举变量赋给整型变量，i的值为1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt;  j=GREEN;         &lt;span class=&#34;hljs-comment&#34;&gt;//将枚举常量赋给整型变量，j的值为0&lt;/span&gt;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;允许的关系运算有：&amp;#x3D;&amp;#x3D;、&amp;lt;、&amp;gt;、&amp;lt;&amp;#x3D;、&amp;gt;&amp;#x3D;、!&amp;#x3D;等，例如：&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;span class=&#34;hljs-comment&#34;&gt;//比较同类型枚举变量color3，color4是否相等&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;if&lt;/span&gt; (color3==color4) cout&amp;lt;&amp;lt;&lt;span class=&#34;hljs-string&#34;&gt;&amp;quot;相等&amp;quot;&lt;/span&gt;；&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;//输出的是变量color3与WHITE的比较结果，结果为1&lt;/span&gt;&lt;br&gt;cout&amp;lt;&amp;lt; color3&amp;lt;WHITE;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;枚举变量可以直接输出，输出的是变量的整数值。例如：&lt;/p&gt;
&lt;figure class=&#34;highlight apache&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs apache&#34;&gt;&lt;span class=&#34;hljs-attribute&#34;&gt;cout&lt;/span&gt;&amp;lt;&amp;lt; color&lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;;         //输出的是color&lt;span class=&#34;hljs-number&#34;&gt;3&lt;/span&gt;的整数值，即RED的整数值&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h3 id=&#34;重要提示&#34;&gt;&lt;a href=&#34;#重要提示&#34; class=&#34;headerlink&#34; title=&#34;重要提示&#34;&gt;&lt;/a&gt;重要提示&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;枚举变量可以直接输出，但不能直接输入。如：cout &amp;gt;&amp;gt; color3;  &amp;#x2F;&amp;#x2F;非法&lt;/li&gt;
&lt;li&gt;不能直接将常量赋给枚举变量。如： color1&amp;#x3D;1; &amp;#x2F;&amp;#x2F;非法&lt;/li&gt;
&lt;li&gt;不同类型的枚举变量之间不能相互赋值。如： color1&amp;#x3D;color3; &amp;#x2F;&amp;#x2F;非法&lt;/li&gt;
&lt;li&gt;枚举变量的输入输出一般都采用switch语句将其转换为字符或字符串；枚举类型数据的其他处理也往往应用switch语句，以保证程序的合法性和可读性。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;&lt;a href=&#34;#参考资料&#34; class=&#34;headerlink&#34; title=&#34;参考资料&#34;&gt;&lt;/a&gt;参考资料&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://www.runoob.com/w3cnote/cpp-enum-intro.html&#34;&gt;C++ 枚举类型详解 | 菜鸟教程 (runoob.com)&lt;/a&gt;&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://xingyuanjie.top/2023/04/30/violate/</guid>
            <title>C/C++ volatile关键字</title>
            <link>https://xingyuanjie.top/2023/04/30/violate/</link>
            <category>C/C++</category>
            <pubDate>Sun, 30 Apr 2023 15:30:24 +0800</pubDate>
            <description><![CDATA[ &lt;h2 id=&#34;C-x2F-C-volatile关键字&#34;&gt;&lt;a href=&#34;#C-x2F-C-volatile关键字&#34; class=&#34;headerlink&#34; title=&#34;C&amp;#x2F;C++ volatile关键字&#34;&gt;&lt;/a&gt;C&amp;#x2F;C++ volatile关键字&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;volatile后面的变量，是常变量，会直接访问地址，如果没有这个关键字，就可能会暂时使用寄存器的值，而不是读取地址。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;C&amp;#x2F;C++ 中的 volatile 关键字和 const 对应，用来修饰变量。volatile 关键字是一种类型修饰符，用它声明的类型变量表示可以被某些编译器未知的因素更改，比如：操作系统、硬件或者其它线程等。遇到这个关键字声明的变量，编译器对访问该变量的代码就不再进行优化，从而可以提供对特殊地址的稳定访问。声明时语法：&lt;/p&gt;
&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;volatile&lt;/span&gt; &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i=&lt;span class=&#34;hljs-number&#34;&gt;10&lt;/span&gt;;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;当要求使用 volatile 声明的变量的值的时候，系统总是重新从它所在的内存读取数据，即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。&lt;/p&gt;
&lt;p&gt;volatile 指出 i 是随时可能发生变化的，每次使用它的时候必须从 i的地址中读取，因而编译器生成的汇编代码会重新从i的地址读取数据放在 b 中。而优化做法是，由于编译器发现两次从 i读数据的代码之间的代码没有对 i 进行过操作，它会自动把上次读的数据放在 b 中。而不是重新从 i 里面读。这样以来，如果 i是一个寄存器变量或者表示一个端口数据就容易出错，所以说 volatile 可以保证对特殊地址的稳定访问。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;volatile关键字的实现：如在并行环境下，进行同步操作，用volatile修饰回答字地址，即可实现并行环境下的同步。这种方法一般使用在非阻塞通信中。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;&lt;a href=&#34;#参考资料&#34; class=&#34;headerlink&#34; title=&#34;参考资料&#34;&gt;&lt;/a&gt;参考资料&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://blog.csdn.net/ijn842/article/details/81273232&#34;&gt;浅谈C语言的volatile关键字_琼琼的博客的博客-CSDN博客&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.csdn.net/GreatTang/article/details/90454011&#34;&gt;C++ volatile_c++ violate_来日梦多长的博客-CSDN博客&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.csdn.net/jerry_wuhao/article/details/113247800&#34;&gt;C&amp;#x2F;C++ 中 volatile 关键字_c++ violate关键字_王俊洁、�的博客-CSDN博客&lt;/a&gt;&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://xingyuanjie.top/2023/03/13/CMU15-213001/</guid>
            <title>CMU 15-213 Lecture 01:Course Overview</title>
            <link>https://xingyuanjie.top/2023/03/13/CMU15-213001/</link>
            <category>CMU</category>
            <category>CSAPP</category>
            <pubDate>Mon, 13 Mar 2023 20:29:35 +0800</pubDate>
            <description><![CDATA[ &lt;h2 id=&#34;2015-CMU-15-213-CSAPP-深入理解计算机系统-Lecture-01-Course-Overview&#34;&gt;&lt;a href=&#34;#2015-CMU-15-213-CSAPP-深入理解计算机系统-Lecture-01-Course-Overview&#34; class=&#34;headerlink&#34; title=&#34;2015 CMU 15-213 CSAPP 深入理解计算机系统 Lecture 01: Course Overview&#34;&gt;&lt;/a&gt;2015 CMU 15-213 CSAPP 深入理解计算机系统 Lecture 01: Course Overview&lt;/h2&gt;&lt;h3 id=&#34;例子一：&#34;&gt;&lt;a href=&#34;#例子一：&#34; class=&#34;headerlink&#34; title=&#34;例子一：&#34;&gt;&lt;/a&gt;例子一：&lt;/h3&gt;&lt;figure class=&#34;highlight c++&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs c++&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;typedef&lt;/span&gt; &lt;span class=&#34;hljs-class&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;struct&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; a[&lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;];&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; d;&lt;br&gt;&amp;#125;&lt;span class=&#34;hljs-keyword&#34;&gt;struct_t&lt;/span&gt;;&lt;br&gt;&lt;br&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;double&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;fun&lt;/span&gt;&lt;span class=&#34;hljs-params&#34;&gt;(&lt;span class=&#34;hljs-keyword&#34;&gt;int&lt;/span&gt; i)&lt;/span&gt;&lt;/span&gt;&amp;#123;&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;volatile&lt;/span&gt; &lt;span class=&#34;hljs-keyword&#34;&gt;struct_t&lt;/span&gt; s;   &lt;span class=&#34;hljs-comment&#34;&gt;//volatile关键字&lt;/span&gt;&lt;br&gt;    s.d = &lt;span class=&#34;hljs-number&#34;&gt;3.14&lt;/span&gt;;&lt;br&gt;    s.a[i] = &lt;span class=&#34;hljs-number&#34;&gt;1073741824&lt;/span&gt;;   &lt;span class=&#34;hljs-comment&#34;&gt;/*Possibly out of bounds*/&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;return&lt;/span&gt; s.d;&lt;br&gt;&amp;#125;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;figure class=&#34;highlight shell&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs shell&#34;&gt;fun(0)   -&amp;gt;   3.14&lt;br&gt;fun(1)   -&amp;gt;   3.14&lt;br&gt;fun(2)   -&amp;gt;   3.1399998664856&lt;br&gt;fun(3)   -&amp;gt;   2.00000061035156&lt;br&gt;fun(4)   -&amp;gt;   3.14&lt;br&gt;fun(6)   -&amp;gt;   Segmentation falut&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;img src=&#34;/2023/03/13/CMU15-213001/image-20230313201550219.png&#34; alt=&#34;image-20230313201550219&#34;&gt;&lt;/p&gt;
&lt;p&gt;【图中假设memory line大小为4B】根据结构体可知我们拥有一个int型的数组大小为2，一个double型的变量。因为int数组的大小为2，当fun(0),fun(1)时，s.a[i]访问是正确的，所以fun(0),fun(1)返回正确值s.d及3.14。而当fun(i):i&amp;gt;1时，就会返回奇怪的结果，这是因为数组大小为2，我们越界了，实际上s.a[i]写的是double的内存空间，如图中的2，3。而6代表程序状态，我们去修改它就会造成程序状态的改变，导致Segmentation fault。这里提醒我们在写C代码的时候一定要注意边界处理。【这里需要清楚C语言中堆区和栈区存的是什么】&lt;/p&gt;
&lt;h3 id=&#34;例子二：&#34;&gt;&lt;a href=&#34;#例子二：&#34; class=&#34;headerlink&#34; title=&#34;例子二：&#34;&gt;&lt;/a&gt;例子二：&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;/2023/03/13/CMU15-213001/image-20230313202535864.png&#34; alt=&#34;image-20230313202535864&#34;&gt;&lt;/p&gt;
&lt;p&gt;【src和dst是大小2048*2048的二维数组】上面的图片，我们可以十分清楚代码的逻辑。他想把src数组的值拷贝到dst。而左右代码的功能完全一样，仅仅是for循环顺序不一样，但是却会有这么大的性能差距，这是什么原因呢？总的来说就是左边代码cache命中率高，右边cache命中率的。cache命中和cache miss的速度差距很大甚至是数量级别的差距，这是导致两者差距巨大的原因。【注意这里还可以更细致的分析，但是会有很多其他因素会影响】&lt;/p&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;&lt;a href=&#34;#参考资料&#34; class=&#34;headerlink&#34; title=&#34;参考资料&#34;&gt;&lt;/a&gt;参考资料&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;http://www.cs.cmu.edu/afs/cs/academic/class/15213-f15/www/index.html&#34;&gt;15-213: Introduction to Computer Systems (cmu.edu)&lt;/a&gt;&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://xingyuanjie.top/2023/03/13/CMU15-213/</guid>
            <title>2015 CMU 15-213 CSAPP 深入理解计算机系统</title>
            <link>https://xingyuanjie.top/2023/03/13/CMU15-213/</link>
            <category>CMU</category>
            <category>CSAPP</category>
            <pubDate>Mon, 13 Mar 2023 18:29:35 +0800</pubDate>
            <description><![CDATA[ &lt;h1 id=&#34;2015-CMU-15-213-CSAPP-深入理解计算机系统&#34;&gt;&lt;a href=&#34;#2015-CMU-15-213-CSAPP-深入理解计算机系统&#34; class=&#34;headerlink&#34; title=&#34;2015 CMU 15-213 CSAPP 深入理解计算机系统&#34;&gt;&lt;/a&gt;2015 CMU 15-213 CSAPP 深入理解计算机系统&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;项目地址：&lt;/strong&gt;&lt;a href=&#34;https://github.com/EugeneLiu/translationCSAPP&#34;&gt;EugeneLiu&amp;#x2F;translationCSAPP: 为 CSAPP 视频课程提供字幕，翻译 PPT，Lab。 (github.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;bilibili翻译：&lt;/strong&gt;&lt;a href=&#34;https://www.bilibili.com/video/av31289365/&#34;&gt;【精校中英字幕】2015 CMU 15-213 CSAPP 深入理解计算机系统 课程视频_哔哩哔哩_bilibili&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;CSAPP-3e-官方链接&#34;&gt;&lt;a href=&#34;#CSAPP-3e-官方链接&#34; class=&#34;headerlink&#34; title=&#34;CSAPP:3e 官方链接&#34;&gt;&lt;/a&gt;CSAPP:3e 官方链接&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://csapp.cs.cmu.edu/&#34;&gt;课程主页&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.cs.cmu.edu/afs/cs/academic/class/15213-f15/www/schedule.html&#34;&gt;课件下载链接&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://csapp.cs.cmu.edu/3e/labs.html&#34;&gt;课程 Lab 页面&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://scs.hosted.panopto.com/Panopto/Pages/Sessions/List.aspx#folderID=%22b96d90ae-9871-4fae-91e2-b1627b43e25e%22&amp;sortColumn=0&amp;sortAscending=true&#34;&gt;课程视频地址&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://xingyuanjie.top/2023/03/13/ML003/</guid>
            <title>线性回归的梯度下降</title>
            <link>https://xingyuanjie.top/2023/03/13/ML003/</link>
            <category>Tensorflow</category>
            <category>Machine Learning</category>
            <pubDate>Mon, 13 Mar 2023 14:37:12 +0800</pubDate>
            <description><![CDATA[ &lt;h2 id=&#34;线性回归的梯度下降&#34;&gt;&lt;a href=&#34;#线性回归的梯度下降&#34; class=&#34;headerlink&#34; title=&#34;线性回归的梯度下降&#34;&gt;&lt;/a&gt;线性回归的梯度下降&lt;/h2&gt;&lt;p&gt;&lt;img src=&#34;/2023/03/13/ML003/image-20230313145346118.png&#34; alt=&#34;image-20230313145346118&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;Goals&#34;&gt;&lt;a href=&#34;#Goals&#34; class=&#34;headerlink&#34; title=&#34;Goals&#34;&gt;&lt;/a&gt;Goals&lt;/h2&gt;&lt;p&gt;在本实验中，您将:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用梯度下降自动优化w和b的过程&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;Tools&#34;&gt;&lt;a href=&#34;#Tools&#34; class=&#34;headerlink&#34; title=&#34;Tools&#34;&gt;&lt;/a&gt;Tools&lt;/h2&gt;&lt;p&gt;在本实验中，我们将使用:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NumPy，一个用于科学计算的流行库&lt;/li&gt;
&lt;li&gt;Matplotlib，用于绘制数据的流行库&lt;/li&gt;
&lt;li&gt;在本地目录的lab_utils.py文件中绘制例程&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight python&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs python&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;import&lt;/span&gt; math, copy&lt;br&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;import&lt;/span&gt; numpy &lt;span class=&#34;hljs-keyword&#34;&gt;as&lt;/span&gt; np&lt;br&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;import&lt;/span&gt; matplotlib.pyplot &lt;span class=&#34;hljs-keyword&#34;&gt;as&lt;/span&gt; plt&lt;br&gt;plt.style.use(&lt;span class=&#34;hljs-string&#34;&gt;&amp;#x27;./deeplearning.mplstyle&amp;#x27;&lt;/span&gt;)&lt;br&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;from&lt;/span&gt; lab_utils_uni &lt;span class=&#34;hljs-keyword&#34;&gt;import&lt;/span&gt; plt_house_x, plt_contour_wgrad, plt_divergence, plt_gradients&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;Problem-Statement&#34;&gt;&lt;a href=&#34;#Problem-Statement&#34; class=&#34;headerlink&#34; title=&#34;Problem Statement&#34;&gt;&lt;/a&gt;Problem Statement&lt;/h2&gt;&lt;p&gt;让我们使用与之前相同的两个数据点——1000平方英尺的房子以30万美元的价格出售，2000平方英尺的房子以50万美元的价格出售。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Size(1000 sqft)&lt;/th&gt;
&lt;th&gt;Price(1000s of dollars)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;figure class=&#34;highlight python&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs python&#34;&gt;&lt;span class=&#34;hljs-comment&#34;&gt;#Load our data set&lt;/span&gt;&lt;br&gt;x_train = np.array([&lt;span class=&#34;hljs-number&#34;&gt;1.0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2.0&lt;/span&gt;])	&lt;span class=&#34;hljs-comment&#34;&gt;#features&lt;/span&gt;&lt;br&gt;y_train = np.array([&lt;span class=&#34;hljs-number&#34;&gt;300.0&lt;/span&gt;,&lt;span class=&#34;hljs-number&#34;&gt;500.0&lt;/span&gt;])	&lt;span class=&#34;hljs-comment&#34;&gt;#target value&lt;/span&gt;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;Compute-Cost&#34;&gt;&lt;a href=&#34;#Compute-Cost&#34; class=&#34;headerlink&#34; title=&#34;Compute_Cost&#34;&gt;&lt;/a&gt;Compute_Cost&lt;/h2&gt;&lt;p&gt;这是上一个实验室开发的。我们在这里还会用到它。&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs pyhton&#34;&gt;#Function to calculate the cost&lt;br&gt;def compute_cost(x, y, w, b,):&lt;br&gt;	&lt;br&gt;	m = x.shape[0]&lt;br&gt;	cost = 0&lt;br&gt;	&lt;br&gt;	for i in range(m):&lt;br&gt;		f_wb = w * x[i] + b&lt;br&gt;		cost = cost + (f_wb - y[i])**2&lt;br&gt;	total_cost = 1 / (2 * m)*cost&lt;br&gt;	&lt;br&gt;	return total_cost&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;Gradient-descent-summary&#34;&gt;&lt;a href=&#34;#Gradient-descent-summary&#34; class=&#34;headerlink&#34; title=&#34;Gradient descent summary&#34;&gt;&lt;/a&gt;Gradient descent summary&lt;/h2&gt;&lt;p&gt;到目前为止，在这门课程中，你已经建立了一个线性模型来预测f_w,b(x^i):&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/2023/03/13/ML003/image-20230313150848463.png&#34; alt=&#34;image-20230313150848463&#34;&gt;&lt;/p&gt;
&lt;p&gt;在线性回归中，您使用输入训练数据来拟合参数𝑤,𝑏;来最小化我们的预测之间的误差测量f_𝑤，𝑏(𝑥^(𝑖))和实际数据𝑦(𝑖)。这种测量成为代价，J（w,b）。在训练中，你可以衡量我们所有训练样本的成本𝑥(𝑖)，𝑦(𝑖)。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/2023/03/13/ML003/image-20230313151251919.png&#34; alt=&#34;image-20230313151251919&#34;&gt;&lt;/p&gt;
&lt;p&gt;在课堂上，梯度下降被描述为:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/2023/03/13/ML003/image-20230313151329621.png&#34; alt=&#34;image-20230313151329621&#34;&gt;&lt;/p&gt;
&lt;p&gt;其中参数𝑤,𝑏同时更新。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/2023/03/13/ML003/image-20230313151450500.png&#34; alt=&#34;image-20230313151450500&#34;&gt;&lt;/p&gt;
&lt;p&gt;这里同时意味着在更新任何参数之前计算所有参数的偏导数。&lt;/p&gt;
&lt;h2 id=&#34;Implement-Gradient-Descent&#34;&gt;&lt;a href=&#34;#Implement-Gradient-Descent&#34; class=&#34;headerlink&#34; title=&#34;Implement Gradient Descent&#34;&gt;&lt;/a&gt;Implement Gradient Descent&lt;/h2&gt;&lt;p&gt;你将为一个特征实现梯度下降算法。你需要三个函数。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;compute_gradient实现上述式(4)和(5)&lt;/li&gt;
&lt;li&gt;上面的compute_cost实现方程(2)(代码来自以前的实验室)&lt;/li&gt;
&lt;li&gt;gradient_descent，使用compute_gradient和compute_cost&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Conventions:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/2023/03/13/ML003/image-20230313151857315.png&#34; alt=&#34;image-20230313151857315&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;compute-gradient&#34;&gt;&lt;a href=&#34;#compute-gradient&#34; class=&#34;headerlink&#34; title=&#34;compute_gradient&#34;&gt;&lt;/a&gt;compute_gradient&lt;/h2&gt;&lt;p&gt;&lt;img src=&#34;/2023/03/13/ML003/image-20230313151947363.png&#34; alt=&#34;image-20230313151947363&#34;&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight python&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs python&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;compute_gradient&lt;/span&gt;(&lt;span class=&#34;hljs-params&#34;&gt;x, y, w, b&lt;/span&gt;):&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-string&#34;&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;    Computes the gradient for linear regression&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;    Args:&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;    	x (ndarray (m,)): Data, m examples&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;    	y (ndarray (m,)): target values&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;    	w,b (scalar)	: model parameters&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;    Returns&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;    	dj_dw (scalar): The gradient of the cost w.r.t. the parameters w&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;    	dj_db (scalar): The gradient of the cost w.r.t. the parameter b &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;br&gt;    &lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;#Number of training examples&lt;/span&gt;&lt;br&gt;    m = x.shape[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;]&lt;br&gt;    dj_de = &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;&lt;br&gt;    dj_db = &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;&lt;br&gt;    &lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; i &lt;span class=&#34;hljs-keyword&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;hljs-built_in&#34;&gt;range&lt;/span&gt;(m):&lt;br&gt;        f_wb = w * x[i] + b;&lt;br&gt;        dj_dw_i = (f_wb - y[i]) * x[i]&lt;br&gt;        dj_db_i = f_wb - y[i]&lt;br&gt;        dj_db += dj_db_i&lt;br&gt;        dj_dw += dj_dw_i&lt;br&gt;    dj_dw = dj_dw / m&lt;br&gt;    dj_db = dj_db / m&lt;br&gt;    &lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;return&lt;/span&gt; dj_dw, dj_db&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;课程描述了梯度下降如何利用在某一点上对参数代价的偏导数来更新该参数。&lt;/p&gt;
&lt;p&gt;让我们使用compute_gradient函数来查找并绘制代价函数相对于其中一个参数𝑤0的偏导数。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/2023/03/13/ML003/image-20230313154012173.png&#34; alt=&#34;image-20230313154012173&#34;&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight python&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs python&#34;&gt;plt_gradients(x_train,y_train, compute_cost, compute_gradient)&lt;br&gt;plt.show()&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;img src=&#34;/2023/03/13/ML003/image-20230313154210478.png&#34; alt=&#34;image-20230313154210478&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/2023/03/13/ML003/image-20230313154333429.png&#34; alt=&#34;image-20230313154333429&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;Gradient-Descent&#34;&gt;&lt;a href=&#34;#Gradient-Descent&#34; class=&#34;headerlink&#34; title=&#34;Gradient Descent&#34;&gt;&lt;/a&gt;Gradient Descent&lt;/h2&gt;&lt;p&gt;现在可以计算梯度，上面公式(3)中描述的梯度下降可以在下面的gradient_descent中实现。注释中描述了实现的细节。下面，您将利用这个函数在训练数据上找到w和b的最佳值。&lt;/p&gt;
&lt;figure class=&#34;highlight python&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;47&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs python&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;gradient_descent&lt;/span&gt;(&lt;span class=&#34;hljs-params&#34;&gt;x, y, w_in, b_in, alpha, num_iters, cost_function, gradient_function&lt;/span&gt;):&lt;/span&gt; &lt;br&gt;    &lt;span class=&#34;hljs-string&#34;&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;    Performs gradient descent to fit w,b. Updates w,b by taking &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;    num_iters gradient steps with learning rate alpha&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;    Args:&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;      x (ndarray (m,))  : Data, m examples &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;      y (ndarray (m,))  : target values&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;      w_in,b_in (scalar): initial values of model parameters  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;      alpha (float):     Learning rate&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;      num_iters (int):   number of iterations to run gradient descent&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;      cost_function:     function to call to produce cost&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;      gradient_function: function to call to produce gradient&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;      &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;    Returns:&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;      w (scalar): Updated value of parameter after running gradient descent&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;      b (scalar): Updated value of parameter after running gradient descent&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;      J_history (List): History of cost values&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;      p_history (list): History of parameters [w,b] &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;      &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;br&gt;    &lt;br&gt;    w = copy.deepcopy(w_in) &lt;span class=&#34;hljs-comment&#34;&gt;# avoid modifying global w_in&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;# An array to store cost J and w&amp;#x27;s at each iteration primarily for graphing later&lt;/span&gt;&lt;br&gt;    J_history = []&lt;br&gt;    p_history = []&lt;br&gt;    b = b_in&lt;br&gt;    w = w_in&lt;br&gt;    &lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; i &lt;span class=&#34;hljs-keyword&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;hljs-built_in&#34;&gt;range&lt;/span&gt;(num_iters):&lt;br&gt;        &lt;span class=&#34;hljs-comment&#34;&gt;# Calculate the gradient and update the parameters using gradient_function&lt;/span&gt;&lt;br&gt;        dj_dw, dj_db = gradient_function(x, y, w , b)     &lt;br&gt;&lt;br&gt;        &lt;span class=&#34;hljs-comment&#34;&gt;# Update Parameters using equation (3) above&lt;/span&gt;&lt;br&gt;        b = b - alpha * dj_db                            &lt;br&gt;        w = w - alpha * dj_dw                            &lt;br&gt;&lt;br&gt;        &lt;span class=&#34;hljs-comment&#34;&gt;# Save cost J at each iteration&lt;/span&gt;&lt;br&gt;        &lt;span class=&#34;hljs-keyword&#34;&gt;if&lt;/span&gt; i&amp;lt;&lt;span class=&#34;hljs-number&#34;&gt;100000&lt;/span&gt;:      &lt;span class=&#34;hljs-comment&#34;&gt;# prevent resource exhaustion &lt;/span&gt;&lt;br&gt;            J_history.append( cost_function(x, y, w , b))&lt;br&gt;            p_history.append([w,b])&lt;br&gt;        &lt;span class=&#34;hljs-comment&#34;&gt;# Print cost every at intervals 10 times or as many iterations if &amp;lt; 10&lt;/span&gt;&lt;br&gt;        &lt;span class=&#34;hljs-keyword&#34;&gt;if&lt;/span&gt; i% math.ceil(num_iters/&lt;span class=&#34;hljs-number&#34;&gt;10&lt;/span&gt;) == &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;:&lt;br&gt;            &lt;span class=&#34;hljs-built_in&#34;&gt;print&lt;/span&gt;(&lt;span class=&#34;hljs-string&#34;&gt;f&amp;quot;Iteration &lt;span class=&#34;hljs-subst&#34;&gt;&amp;#123;i:&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt;&amp;#125;&lt;/span&gt;: Cost &lt;span class=&#34;hljs-subst&#34;&gt;&amp;#123;J_history[-&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;]:&lt;span class=&#34;hljs-number&#34;&gt;0.2&lt;/span&gt;e&amp;#125;&lt;/span&gt; &amp;quot;&lt;/span&gt;,&lt;br&gt;                  &lt;span class=&#34;hljs-string&#34;&gt;f&amp;quot;dj_dw: &lt;span class=&#34;hljs-subst&#34;&gt;&amp;#123;dj_dw: &lt;span class=&#34;hljs-number&#34;&gt;0.3&lt;/span&gt;e&amp;#125;&lt;/span&gt;, dj_db: &lt;span class=&#34;hljs-subst&#34;&gt;&amp;#123;dj_db: &lt;span class=&#34;hljs-number&#34;&gt;0.3&lt;/span&gt;e&amp;#125;&lt;/span&gt;  &amp;quot;&lt;/span&gt;,&lt;br&gt;                  &lt;span class=&#34;hljs-string&#34;&gt;f&amp;quot;w: &lt;span class=&#34;hljs-subst&#34;&gt;&amp;#123;w: &lt;span class=&#34;hljs-number&#34;&gt;0.3&lt;/span&gt;e&amp;#125;&lt;/span&gt;, b:&lt;span class=&#34;hljs-subst&#34;&gt;&amp;#123;b: &lt;span class=&#34;hljs-number&#34;&gt;0.5&lt;/span&gt;e&amp;#125;&lt;/span&gt;&amp;quot;&lt;/span&gt;)&lt;br&gt; &lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;return&lt;/span&gt; w, b, J_history, p_history &lt;span class=&#34;hljs-comment&#34;&gt;#return w and J,w history for graphing&lt;/span&gt;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;figure class=&#34;highlight python&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs python&#34;&gt;Iteration    &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;: Cost &lt;span class=&#34;hljs-number&#34;&gt;7.93e+04&lt;/span&gt;  dj_dw: -&lt;span class=&#34;hljs-number&#34;&gt;6.500e+02&lt;/span&gt;, dj_db: -&lt;span class=&#34;hljs-number&#34;&gt;4.000e+02&lt;/span&gt;   w:  &lt;span class=&#34;hljs-number&#34;&gt;6.500e+00&lt;/span&gt;, b: &lt;span class=&#34;hljs-number&#34;&gt;4.00000e+00&lt;/span&gt;&lt;br&gt;Iteration &lt;span class=&#34;hljs-number&#34;&gt;1000&lt;/span&gt;: Cost &lt;span class=&#34;hljs-number&#34;&gt;3.41e+00&lt;/span&gt;  dj_dw: -&lt;span class=&#34;hljs-number&#34;&gt;3.712e-01&lt;/span&gt;, dj_db:  &lt;span class=&#34;hljs-number&#34;&gt;6.007e-01&lt;/span&gt;   w:  &lt;span class=&#34;hljs-number&#34;&gt;1.949e+02&lt;/span&gt;, b: &lt;span class=&#34;hljs-number&#34;&gt;1.08228e+02&lt;/span&gt;&lt;br&gt;Iteration &lt;span class=&#34;hljs-number&#34;&gt;2000&lt;/span&gt;: Cost &lt;span class=&#34;hljs-number&#34;&gt;7.93e-01&lt;/span&gt;  dj_dw: -&lt;span class=&#34;hljs-number&#34;&gt;1.789e-01&lt;/span&gt;, dj_db:  &lt;span class=&#34;hljs-number&#34;&gt;2.895e-01&lt;/span&gt;   w:  &lt;span class=&#34;hljs-number&#34;&gt;1.975e+02&lt;/span&gt;, b: &lt;span class=&#34;hljs-number&#34;&gt;1.03966e+02&lt;/span&gt;&lt;br&gt;Iteration &lt;span class=&#34;hljs-number&#34;&gt;3000&lt;/span&gt;: Cost &lt;span class=&#34;hljs-number&#34;&gt;1.84e-01&lt;/span&gt;  dj_dw: -&lt;span class=&#34;hljs-number&#34;&gt;8.625e-02&lt;/span&gt;, dj_db:  &lt;span class=&#34;hljs-number&#34;&gt;1.396e-01&lt;/span&gt;   w:  &lt;span class=&#34;hljs-number&#34;&gt;1.988e+02&lt;/span&gt;, b: &lt;span class=&#34;hljs-number&#34;&gt;1.01912e+02&lt;/span&gt;&lt;br&gt;Iteration &lt;span class=&#34;hljs-number&#34;&gt;4000&lt;/span&gt;: Cost &lt;span class=&#34;hljs-number&#34;&gt;4.28e-02&lt;/span&gt;  dj_dw: -&lt;span class=&#34;hljs-number&#34;&gt;4.158e-02&lt;/span&gt;, dj_db:  &lt;span class=&#34;hljs-number&#34;&gt;6.727e-02&lt;/span&gt;   w:  &lt;span class=&#34;hljs-number&#34;&gt;1.994e+02&lt;/span&gt;, b: &lt;span class=&#34;hljs-number&#34;&gt;1.00922e+02&lt;/span&gt;&lt;br&gt;Iteration &lt;span class=&#34;hljs-number&#34;&gt;5000&lt;/span&gt;: Cost &lt;span class=&#34;hljs-number&#34;&gt;9.95e-03&lt;/span&gt;  dj_dw: -&lt;span class=&#34;hljs-number&#34;&gt;2.004e-02&lt;/span&gt;, dj_db:  &lt;span class=&#34;hljs-number&#34;&gt;3.243e-02&lt;/span&gt;   w:  &lt;span class=&#34;hljs-number&#34;&gt;1.997e+02&lt;/span&gt;, b: &lt;span class=&#34;hljs-number&#34;&gt;1.00444e+02&lt;/span&gt;&lt;br&gt;Iteration &lt;span class=&#34;hljs-number&#34;&gt;6000&lt;/span&gt;: Cost &lt;span class=&#34;hljs-number&#34;&gt;2.31e-03&lt;/span&gt;  dj_dw: -&lt;span class=&#34;hljs-number&#34;&gt;9.660e-03&lt;/span&gt;, dj_db:  &lt;span class=&#34;hljs-number&#34;&gt;1.563e-02&lt;/span&gt;   w:  &lt;span class=&#34;hljs-number&#34;&gt;1.999e+02&lt;/span&gt;, b: &lt;span class=&#34;hljs-number&#34;&gt;1.00214e+02&lt;/span&gt;&lt;br&gt;Iteration &lt;span class=&#34;hljs-number&#34;&gt;7000&lt;/span&gt;: Cost &lt;span class=&#34;hljs-number&#34;&gt;5.37e-04&lt;/span&gt;  dj_dw: -&lt;span class=&#34;hljs-number&#34;&gt;4.657e-03&lt;/span&gt;, dj_db:  &lt;span class=&#34;hljs-number&#34;&gt;7.535e-03&lt;/span&gt;   w:  &lt;span class=&#34;hljs-number&#34;&gt;1.999e+02&lt;/span&gt;, b: &lt;span class=&#34;hljs-number&#34;&gt;1.00103e+02&lt;/span&gt;&lt;br&gt;Iteration &lt;span class=&#34;hljs-number&#34;&gt;8000&lt;/span&gt;: Cost &lt;span class=&#34;hljs-number&#34;&gt;1.25e-04&lt;/span&gt;  dj_dw: -&lt;span class=&#34;hljs-number&#34;&gt;2.245e-03&lt;/span&gt;, dj_db:  &lt;span class=&#34;hljs-number&#34;&gt;3.632e-03&lt;/span&gt;   w:  &lt;span class=&#34;hljs-number&#34;&gt;2.000e+02&lt;/span&gt;, b: &lt;span class=&#34;hljs-number&#34;&gt;1.00050e+02&lt;/span&gt;&lt;br&gt;Iteration &lt;span class=&#34;hljs-number&#34;&gt;9000&lt;/span&gt;: Cost &lt;span class=&#34;hljs-number&#34;&gt;2.90e-05&lt;/span&gt;  dj_dw: -&lt;span class=&#34;hljs-number&#34;&gt;1.082e-03&lt;/span&gt;, dj_db:  &lt;span class=&#34;hljs-number&#34;&gt;1.751e-03&lt;/span&gt;   w:  &lt;span class=&#34;hljs-number&#34;&gt;2.000e+02&lt;/span&gt;, b: &lt;span class=&#34;hljs-number&#34;&gt;1.00024e+02&lt;/span&gt;&lt;br&gt;(w,b) found by gradient descent: (&lt;span class=&#34;hljs-number&#34;&gt;199.9929&lt;/span&gt;,&lt;span class=&#34;hljs-number&#34;&gt;100.0116&lt;/span&gt;)&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;花点时间，注意上面打印的梯度下降过程的一些特征。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;正如课堂上的幻灯片所描述的，成本开始很大，然后迅速下降。&lt;/li&gt;
&lt;li&gt;偏导数dj_dw和dj_db也变小了，起初很快，然后变慢。正如课堂上的图表所示，随着过程接近“碗底”，由于在这一点上的导数值较小，进程会变慢。&lt;/li&gt;
&lt;li&gt;尽管学习率alpha保持不变，但进程会减慢&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;/2023/03/13/ML003/image-20230313155614815.png&#34; alt=&#34;image-20230313155614815&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;Cost-versus-iterations-of-gradient-descent&#34;&gt;&lt;a href=&#34;#Cost-versus-iterations-of-gradient-descent&#34; class=&#34;headerlink&#34; title=&#34;Cost versus iterations of gradient descent&#34;&gt;&lt;/a&gt;Cost versus iterations of gradient descent&lt;/h2&gt;&lt;p&gt;成本与迭代的关系图是衡量梯度下降技术进展的有用方法。在成功的运行中，成本总是会降低。最初成本的变化如此之快，用不同于最终下降的尺度来描绘最初的上升是有用的。&lt;/p&gt;
&lt;p&gt;在下面的图表中，请注意轴上的成本规模和迭代步骤。&lt;/p&gt;
&lt;figure class=&#34;highlight python&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs python&#34;&gt;&lt;span class=&#34;hljs-comment&#34;&gt;# plot cost versus iteration  &lt;/span&gt;&lt;br&gt;fig, (ax1, ax2) = plt.subplots(&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;, constrained_layout=&lt;span class=&#34;hljs-literal&#34;&gt;True&lt;/span&gt;, figsize=(&lt;span class=&#34;hljs-number&#34;&gt;12&lt;/span&gt;,&lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt;))&lt;br&gt;ax1.plot(J_hist[:&lt;span class=&#34;hljs-number&#34;&gt;100&lt;/span&gt;])&lt;br&gt;ax2.plot(&lt;span class=&#34;hljs-number&#34;&gt;1000&lt;/span&gt; + np.arange(&lt;span class=&#34;hljs-built_in&#34;&gt;len&lt;/span&gt;(J_hist[&lt;span class=&#34;hljs-number&#34;&gt;1000&lt;/span&gt;:])), J_hist[&lt;span class=&#34;hljs-number&#34;&gt;1000&lt;/span&gt;:])&lt;br&gt;ax1.set_title(&lt;span class=&#34;hljs-string&#34;&gt;&amp;quot;Cost vs. iteration(start)&amp;quot;&lt;/span&gt;);  ax2.set_title(&lt;span class=&#34;hljs-string&#34;&gt;&amp;quot;Cost vs. iteration (end)&amp;quot;&lt;/span&gt;)&lt;br&gt;ax1.set_ylabel(&lt;span class=&#34;hljs-string&#34;&gt;&amp;#x27;Cost&amp;#x27;&lt;/span&gt;)            ;  ax2.set_ylabel(&lt;span class=&#34;hljs-string&#34;&gt;&amp;#x27;Cost&amp;#x27;&lt;/span&gt;) &lt;br&gt;ax1.set_xlabel(&lt;span class=&#34;hljs-string&#34;&gt;&amp;#x27;iteration step&amp;#x27;&lt;/span&gt;)  ;  ax2.set_xlabel(&lt;span class=&#34;hljs-string&#34;&gt;&amp;#x27;iteration step&amp;#x27;&lt;/span&gt;) &lt;br&gt;plt.show()&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;img src=&#34;/2023/03/13/ML003/image-20230313160112122.png&#34; alt=&#34;image-20230313160112122&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;Predictions&#34;&gt;&lt;a href=&#34;#Predictions&#34; class=&#34;headerlink&#34; title=&#34;Predictions&#34;&gt;&lt;/a&gt;Predictions&lt;/h2&gt;&lt;p&gt;现在您已经发现了参数𝑤的最佳值和𝑏，您现在可以使用该模型根据我们学习的参数来预测房屋价值。正如预期的那样，在相同的住房条件下，预测值与训练值几乎相同。进一步，不在预测中的值与期望值一致。&lt;/p&gt;
&lt;figure class=&#34;highlight python&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs python&#34;&gt;&lt;span class=&#34;hljs-built_in&#34;&gt;print&lt;/span&gt;(&lt;span class=&#34;hljs-string&#34;&gt;f&amp;quot;1000 sqft house prediction &lt;span class=&#34;hljs-subst&#34;&gt;&amp;#123;w_final*&lt;span class=&#34;hljs-number&#34;&gt;1.0&lt;/span&gt; + b_final:&lt;span class=&#34;hljs-number&#34;&gt;0.1&lt;/span&gt;f&amp;#125;&lt;/span&gt; Thousand dollars&amp;quot;&lt;/span&gt;)&lt;br&gt;&lt;span class=&#34;hljs-built_in&#34;&gt;print&lt;/span&gt;(&lt;span class=&#34;hljs-string&#34;&gt;f&amp;quot;1200 sqft house prediction &lt;span class=&#34;hljs-subst&#34;&gt;&amp;#123;w_final*&lt;span class=&#34;hljs-number&#34;&gt;1.2&lt;/span&gt; + b_final:&lt;span class=&#34;hljs-number&#34;&gt;0.1&lt;/span&gt;f&amp;#125;&lt;/span&gt; Thousand dollars&amp;quot;&lt;/span&gt;)&lt;br&gt;&lt;span class=&#34;hljs-built_in&#34;&gt;print&lt;/span&gt;(&lt;span class=&#34;hljs-string&#34;&gt;f&amp;quot;2000 sqft house prediction &lt;span class=&#34;hljs-subst&#34;&gt;&amp;#123;w_final*&lt;span class=&#34;hljs-number&#34;&gt;2.0&lt;/span&gt; + b_final:&lt;span class=&#34;hljs-number&#34;&gt;0.1&lt;/span&gt;f&amp;#125;&lt;/span&gt; Thousand dollars&amp;quot;&lt;/span&gt;)&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;figure class=&#34;highlight python&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs python&#34;&gt;&lt;span class=&#34;hljs-number&#34;&gt;1000&lt;/span&gt; sqft house prediction &lt;span class=&#34;hljs-number&#34;&gt;300.0&lt;/span&gt; Thousand dollars&lt;br&gt;&lt;span class=&#34;hljs-number&#34;&gt;1200&lt;/span&gt; sqft house prediction &lt;span class=&#34;hljs-number&#34;&gt;340.0&lt;/span&gt; Thousand dollars&lt;br&gt;&lt;span class=&#34;hljs-number&#34;&gt;2000&lt;/span&gt; sqft house prediction &lt;span class=&#34;hljs-number&#34;&gt;500.0&lt;/span&gt; Thousand dollars&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;Plotting&#34;&gt;&lt;a href=&#34;#Plotting&#34; class=&#34;headerlink&#34; title=&#34;Plotting&#34;&gt;&lt;/a&gt;Plotting&lt;/h2&gt;&lt;p&gt;您可以通过在代价(w,b)的等高线图上绘制迭代的代价来显示梯度下降在执行过程中的进度。&lt;/p&gt;
&lt;figure class=&#34;highlight python&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs python&#34;&gt;fig, ax = plt.subplots(&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;,&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, figsize=(&lt;span class=&#34;hljs-number&#34;&gt;12&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;6&lt;/span&gt;))&lt;br&gt;plt_contour_wgrad(x_train, y_train, p_hist, ax)&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;img src=&#34;/2023/03/13/ML003/image-20230313160446994.png&#34; alt=&#34;image-20230313160446994&#34;&gt;&lt;/p&gt;
&lt;p&gt;上面的等高线图显示了𝑤和𝑏范围内的𝑐𝑜𝑠𝑡(𝑤，𝑏)。成本水平由圆环表示。用红色箭头覆盖的是梯度下降的路径。这里有一些需要注意的事情:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这条路径朝着它的目标稳步(单调)前进。&lt;/li&gt;
&lt;li&gt;最初的步骤比接近目标的步骤要大得多。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;放大，我们可以看到梯度下降的最后步骤。注意，阶梯之间的距离随着梯度趋近于零而缩小。&lt;/p&gt;
&lt;figure class=&#34;highlight python&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs python&#34;&gt;fig, ax = plt.subplots(&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;,&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;, figsize=(&lt;span class=&#34;hljs-number&#34;&gt;12&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;4&lt;/span&gt;))&lt;br&gt;plt_contour_wgrad(x_train, y_train, p_hist, ax, w_range=[&lt;span class=&#34;hljs-number&#34;&gt;180&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;220&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0.5&lt;/span&gt;], b_range=[&lt;span class=&#34;hljs-number&#34;&gt;80&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;120&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;0.5&lt;/span&gt;],&lt;br&gt;            contours=[&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;,&lt;span class=&#34;hljs-number&#34;&gt;5&lt;/span&gt;,&lt;span class=&#34;hljs-number&#34;&gt;10&lt;/span&gt;,&lt;span class=&#34;hljs-number&#34;&gt;20&lt;/span&gt;],resolution=&lt;span class=&#34;hljs-number&#34;&gt;0.5&lt;/span&gt;)&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;img src=&#34;/2023/03/13/ML003/image-20230313160944244.png&#34; alt=&#34;image-20230313160944244&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;Increased-Learning-Rate&#34;&gt;&lt;a href=&#34;#Increased-Learning-Rate&#34; class=&#34;headerlink&#34; title=&#34;Increased Learning Rate&#34;&gt;&lt;/a&gt;Increased Learning Rate&lt;/h2&gt;&lt;p&gt;在这节课中，在式(3)中有一个关于学习率的合适值𝛼的讨论。𝛼越大，梯度下降收敛到解的速度就越快。但是，如果它太大，梯度下降就会发散。上面有一个很好收敛的解的例子。让我们试着增加𝛼的值看看会发生什么:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/2023/03/13/ML003/image-20230313161516209.png&#34; alt=&#34;image-20230313161516209&#34;&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight python&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs python&#34;&gt;&lt;span class=&#34;hljs-comment&#34;&gt;# initialize parameters&lt;/span&gt;&lt;br&gt;w_init = &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;&lt;br&gt;b_init = &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;# set alpha to a large value&lt;/span&gt;&lt;br&gt;iterations = &lt;span class=&#34;hljs-number&#34;&gt;10&lt;/span&gt;&lt;br&gt;tmp_alpha = &lt;span class=&#34;hljs-number&#34;&gt;8.0e-1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-comment&#34;&gt;# run gradient descent&lt;/span&gt;&lt;br&gt;w_final, b_final, J_hist, p_hist = gradient_descent(x_train ,y_train, w_init, b_init, tmp_alpha, &lt;br&gt;                                                    iterations, compute_cost, compute_gradient)&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs pyhton&#34;&gt;Iteration    0: Cost 2.58e+05  dj_dw: -6.500e+02, dj_db: -4.000e+02   w:  5.200e+02, b: 3.20000e+02&lt;br&gt;Iteration    1: Cost 7.82e+05  dj_dw:  1.130e+03, dj_db:  7.000e+02   w: -3.840e+02, b:-2.40000e+02&lt;br&gt;Iteration    2: Cost 2.37e+06  dj_dw: -1.970e+03, dj_db: -1.216e+03   w:  1.192e+03, b: 7.32800e+02&lt;br&gt;Iteration    3: Cost 7.19e+06  dj_dw:  3.429e+03, dj_db:  2.121e+03   w: -1.551e+03, b:-9.63840e+02&lt;br&gt;Iteration    4: Cost 2.18e+07  dj_dw: -5.974e+03, dj_db: -3.691e+03   w:  3.228e+03, b: 1.98886e+03&lt;br&gt;Iteration    5: Cost 6.62e+07  dj_dw:  1.040e+04, dj_db:  6.431e+03   w: -5.095e+03, b:-3.15579e+03&lt;br&gt;Iteration    6: Cost 2.01e+08  dj_dw: -1.812e+04, dj_db: -1.120e+04   w:  9.402e+03, b: 5.80237e+03&lt;br&gt;Iteration    7: Cost 6.09e+08  dj_dw:  3.156e+04, dj_db:  1.950e+04   w: -1.584e+04, b:-9.80139e+03&lt;br&gt;Iteration    8: Cost 1.85e+09  dj_dw: -5.496e+04, dj_db: -3.397e+04   w:  2.813e+04, b: 1.73730e+04&lt;br&gt;Iteration    9: Cost 5.60e+09  dj_dw:  9.572e+04, dj_db:  5.916e+04   w: -4.845e+04, b:-2.99567e+04&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;img src=&#34;/2023/03/13/ML003/image-20230313161636772.png&#34; alt=&#34;image-20230313161636772&#34;&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight python&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs python&#34;&gt;plt_divergence(p_hist, J_hist,x_train, y_train)&lt;br&gt;plt.show()&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;img src=&#34;/2023/03/13/ML003/image-20230313161959222.png&#34; alt=&#34;image-20230313161959222&#34;&gt;&lt;/p&gt;
&lt;p&gt;上图中，左图显示了𝑤在梯度下降的前几个步骤中的进展。𝑤从正振荡到负，成本迅速增长。梯度下降同时在𝑤和𝑏上运行，所以需要右边的3d图才能看到完整的图片。&lt;/p&gt;
&lt;h2 id=&#34;Congratulations&#34;&gt;&lt;a href=&#34;#Congratulations&#34; class=&#34;headerlink&#34; title=&#34;Congratulations!&#34;&gt;&lt;/a&gt;Congratulations!&lt;/h2&gt;&lt;p&gt;在这个实验室里，你:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;深入研究单个变量的梯度下降的细节。&lt;/li&gt;
&lt;li&gt;开发了一个计算梯度的程序&lt;/li&gt;
&lt;li&gt;看看梯度是什么&lt;/li&gt;
&lt;li&gt;完成一个梯度下降程序&lt;/li&gt;
&lt;li&gt;利用梯度下降法寻找参数&lt;/li&gt;
&lt;li&gt;检查了学习率大小的影响&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;&lt;a href=&#34;#参考资料&#34; class=&#34;headerlink&#34; title=&#34;参考资料&#34;&gt;&lt;/a&gt;参考资料&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://www.bilibili.com/video/BV1Pa411X76s?p=5&amp;amp;vd_source=3ae32e36058f58c5b85935fca9b77797&#34;&gt;https://www.bilibili.com/video/BV1Pa411X76s?p=5&amp;amp;vd_source=3ae32e36058f58c5b85935fca9b77797&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/kaieye/2022-Machine-Learning-Specialization&#34;&gt;kaieye&amp;#x2F;2022-Machine-Learning-Specialization (github.com)&lt;/a&gt;&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://xingyuanjie.top/2023/03/12/ML002/</guid>
            <title>代价函数</title>
            <link>https://xingyuanjie.top/2023/03/12/ML002/</link>
            <category>Tensorflow</category>
            <category>Machine Learning</category>
            <pubDate>Sun, 12 Mar 2023 16:33:17 +0800</pubDate>
            <description><![CDATA[ &lt;h2 id=&#34;代价函数&#34;&gt;&lt;a href=&#34;#代价函数&#34; class=&#34;headerlink&#34; title=&#34;代价函数&#34;&gt;&lt;/a&gt;代价函数&lt;/h2&gt;&lt;p&gt;&lt;img src=&#34;/2023/03/12/ML002/image-20230312164306128.png&#34; alt=&#34;image-20230312164306128&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;目标&#34;&gt;&lt;a href=&#34;#目标&#34; class=&#34;headerlink&#34; title=&#34;目标&#34;&gt;&lt;/a&gt;目标&lt;/h2&gt;&lt;p&gt;在本实验中，你将:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;你将实现和探索成本函数的线性回归伴随一个变量。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;工具&#34;&gt;&lt;a href=&#34;#工具&#34; class=&#34;headerlink&#34; title=&#34;工具&#34;&gt;&lt;/a&gt;工具&lt;/h2&gt;&lt;p&gt;在本实验室中，我们将使用:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NumPy，一个用于科学计算的流行库&lt;/li&gt;
&lt;li&gt;Matplotlib，用于绘制数据的流行库&lt;/li&gt;
&lt;li&gt;本地目录的lab_utils_uni.py文件中的本地绘图例程&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight python&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs python&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;import&lt;/span&gt; nunpy &lt;span class=&#34;hljs-keyword&#34;&gt;as&lt;/span&gt; np&lt;br&gt;%matplotlib widget&lt;br&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;import&lt;/span&gt; matplotlib.pyplot &lt;span class=&#34;hljs-keyword&#34;&gt;as&lt;/span&gt; plt&lt;br&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;from&lt;/span&gt; lab_utils_uni &lt;span class=&#34;hljs-keyword&#34;&gt;import&lt;/span&gt; plt_intuition, plt_stationary, plt_updata_onclick, soup_bowl&lt;br&gt;plt.style.use(&lt;span class=&#34;hljs-string&#34;&gt;&amp;#x27;./deeplearning.mplstyle&amp;#x27;&lt;/span&gt;)&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;问题意境&#34;&gt;&lt;a href=&#34;#问题意境&#34; class=&#34;headerlink&#34; title=&#34;问题意境&#34;&gt;&lt;/a&gt;问题意境&lt;/h2&gt;&lt;p&gt;你想要一个模型，它可以根据房子的大小预测房价。让我们使用与上一个实验室之前相同的两个数据点——一个1000平方英尺的房子卖了30万美元，一个2000平方英尺的房子卖了50万美元。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Size(1000 sqft)&lt;/th&gt;
&lt;th&gt;Price(1000s of dollars)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;figure class=&#34;highlight python&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs python&#34;&gt;x_train = np.array([&lt;span class=&#34;hljs-number&#34;&gt;1.0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;2.0&lt;/span&gt;])   &lt;span class=&#34;hljs-comment&#34;&gt;#(size in 1000 square feet)&lt;/span&gt;&lt;br&gt;y_train = np.zrray([&lt;span class=&#34;hljs-number&#34;&gt;300.0&lt;/span&gt;, &lt;span class=&#34;hljs-number&#34;&gt;500.0&lt;/span&gt;])	&lt;span class=&#34;hljs-comment&#34;&gt;#(price in 1000s of dollars)&lt;/span&gt;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;计算代价&#34;&gt;&lt;a href=&#34;#计算代价&#34; class=&#34;headerlink&#34; title=&#34;计算代价&#34;&gt;&lt;/a&gt;计算代价&lt;/h2&gt;&lt;p&gt;这个作业中的术语“成本”可能会让人有点困惑，因为数据是住房成本。在这里，成本是衡量我们的模型预测房子目标价格的好坏。“价格”一词指的是住房数据。&lt;/p&gt;
&lt;p&gt;含一个变量的成本方程为:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/2023/03/12/ML002/image-20230312165434160.png&#34; alt=&#34;image-20230312165434160&#34;&gt;&lt;/p&gt;
&lt;p&gt;在这里&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/2023/03/12/ML002/image-20230312165503613.png&#34; alt=&#34;image-20230312165503613&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;f_w,b(x^i)是我们使用参数w,b来预测例子i。&lt;/li&gt;
&lt;li&gt;（f_w,b(x^i) - y^i）^2  是目标值与预测值之间的差的平方&lt;/li&gt;
&lt;li&gt;这些差异被加在所有m例子上，再除以2m，得到代价函数 &lt;strong&gt;J（w,b）&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意，在讲座中，总和的范围通常是从1到m，而代码将从0到m-1。&lt;/p&gt;
&lt;p&gt;下面的代码通过遍历每个示例来计算成本。在每个循环中:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;f_wb，计算一个预测&lt;/li&gt;
&lt;li&gt;目标和预测之间的差值被计算和平方。&lt;/li&gt;
&lt;li&gt;这被加到总成本中。&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight python&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;23&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs python&#34;&gt;&lt;span class=&#34;hljs-function&#34;&gt;&lt;span class=&#34;hljs-keyword&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;hljs-title&#34;&gt;compute_cost&lt;/span&gt;(&lt;span class=&#34;hljs-params&#34;&gt;x, y, w, b&lt;/span&gt;):&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-string&#34;&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;    Computes the cost function for linear regression&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;    Args:&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;    	x (ndarray (m,)):Data, m examples&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;    	y (ndarray (m,)):target values&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;    	w,b (scalar)	:model parameters&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;    Returns&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;    	total_cost (float):The cost of using w,b as the parameters for linear regression to fit the data points in x and y&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;hljs-string&#34;&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-comment&#34;&gt;#number of training examples&lt;/span&gt;&lt;br&gt;    m = x.shape[&lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;]&lt;br&gt;    &lt;br&gt;    cost_sum = &lt;span class=&#34;hljs-number&#34;&gt;0&lt;/span&gt;&lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;for&lt;/span&gt; i &lt;span class=&#34;hljs-keyword&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;hljs-built_in&#34;&gt;range&lt;/span&gt;(m):&lt;br&gt;        f_wb = w * x[i] + b&lt;br&gt;        cost = (f_wb - y[i])**&lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;&lt;br&gt;        cost_sum = cost_sum + cost&lt;br&gt;    total_cost = (&lt;span class=&#34;hljs-number&#34;&gt;1&lt;/span&gt;/(&lt;span class=&#34;hljs-number&#34;&gt;2&lt;/span&gt;*m)) * cost_sum&lt;br&gt;    &lt;br&gt;    &lt;span class=&#34;hljs-keyword&#34;&gt;return&lt;/span&gt; total_cost&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;Cost-Function-Intuition&#34;&gt;&lt;a href=&#34;#Cost-Function-Intuition&#34; class=&#34;headerlink&#34; title=&#34;Cost Function Intuition&#34;&gt;&lt;/a&gt;Cost Function Intuition&lt;/h2&gt;&lt;p&gt;&lt;img src=&#34;/2023/03/12/ML002/image-20230312172325465.png&#34; alt=&#34;image-20230312172325465&#34;&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight python&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs python&#34;&gt;plt_intuition(x_train, y_train)&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;img src=&#34;/2023/03/12/ML002/image-20230313144221393.png&#34; alt=&#34;image-20230313144221393&#34;&gt;&lt;/p&gt;
&lt;p&gt;情节中有几点值得一提。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;当𝑤&amp;#x3D;200时，成本最小化，这与之前实验室的结果相吻合。&lt;/li&gt;
&lt;li&gt;因为在成本方程中，目标和预测之间的差异是平方，当𝑤时，成本迅速增加不是太大就是太小。&lt;/li&gt;
&lt;li&gt;使用通过最小化成本选择的w和b，可以得到与数据完美匹配的直线。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;Cost-Function-Visualiztion-3D&#34;&gt;&lt;a href=&#34;#Cost-Function-Visualiztion-3D&#34; class=&#34;headerlink&#34; title=&#34;Cost Function Visualiztion-3D&#34;&gt;&lt;/a&gt;Cost Function Visualiztion-3D&lt;/h2&gt;&lt;p&gt;你可以通过三维绘图或等高线图看到成本是如何随w和b变化的。&lt;/p&gt;
&lt;p&gt;值得注意的是，这门课的一些情节会变得相当复杂。本文提供了绘图例程，虽然通读代码以熟悉这些方法是有指导意义的，但要成功完成课程并不需要这样做。例程在本地目录lab_utils_uni.py中。&lt;/p&gt;
&lt;h2 id=&#34;Larger-Data-Set&#34;&gt;&lt;a href=&#34;#Larger-Data-Set&#34; class=&#34;headerlink&#34; title=&#34;Larger Data Set&#34;&gt;&lt;/a&gt;Larger Data Set&lt;/h2&gt;&lt;p&gt;较大的数据集用更多的数据点来观察一个场景是很有指导意义的。该数据集包括不在同一线上的数据点。这对成本方程意味着什么?我们能找到𝑤、𝑏那样使得代价是0?&lt;/p&gt;
&lt;figure class=&#34;highlight python&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs python&#34;&gt;x_train = np.array([&lt;span class=&#34;hljs-number&#34;&gt;1.0&lt;/span&gt;,&lt;span class=&#34;hljs-number&#34;&gt;1.7&lt;/span&gt;,&lt;span class=&#34;hljs-number&#34;&gt;2.0&lt;/span&gt;,&lt;span class=&#34;hljs-number&#34;&gt;2.5&lt;/span&gt;,&lt;span class=&#34;hljs-number&#34;&gt;3.0&lt;/span&gt;,&lt;span class=&#34;hljs-number&#34;&gt;3.2&lt;/span&gt;])&lt;br&gt;y_train = np.array([&lt;span class=&#34;hljs-number&#34;&gt;250&lt;/span&gt;,&lt;span class=&#34;hljs-number&#34;&gt;300&lt;/span&gt;,&lt;span class=&#34;hljs-number&#34;&gt;480&lt;/span&gt;,&lt;span class=&#34;hljs-number&#34;&gt;430&lt;/span&gt;,&lt;span class=&#34;hljs-number&#34;&gt;630&lt;/span&gt;,&lt;span class=&#34;hljs-number&#34;&gt;730&lt;/span&gt;])&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;在等高线图中，点击一个点，选择w和b，以达到最低的成本。使用轮廓来指导你的选择。注意，更新图形可能需要几秒钟的时间。&lt;/p&gt;
&lt;figure class=&#34;highlight python&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs python&#34;&gt;plt.close(&lt;span class=&#34;hljs-string&#34;&gt;&amp;#x27;all&amp;#x27;&lt;/span&gt;)&lt;br&gt;fig, ax ,dyn_items = plt_stationary(x_train, y_train)&lt;br&gt;updater = plt_update_onclick(fig, ax, x_train,y_train,dyn_items)&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;上面，注意左边图中的虚线。这些代表了你的训练集中每个例子所贡献的代价的部分。在本例中，值约为𝑤&amp;#x3D;209和𝑏&amp;#x3D; 2.4提供低代价。请注意，因为我们的训练示例不在一条线上，所以最小代价不为零。&lt;/p&gt;
&lt;h2 id=&#34;Convex-Cost-surface&#34;&gt;&lt;a href=&#34;#Convex-Cost-surface&#34; class=&#34;headerlink&#34; title=&#34;Convex Cost surface&#34;&gt;&lt;/a&gt;Convex Cost surface&lt;/h2&gt;&lt;p&gt;成本函数平方损失的事实确保了“误差曲面”像汤碗一样凸出。它总是有一个最小值，可以通过在所有维度上跟随梯度来达到。在前面的图中，因为𝑤和𝑏尺寸比例不同，这是不容易识别的。下图，其中𝑤和𝑏都是对称的，在讲座中展示过:&lt;/p&gt;
&lt;figure class=&#34;highlight python&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;gutter hljs&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#34;code&#34;&gt;&lt;div class=&#34;hljs code-wrapper&#34;&gt;&lt;pre&gt;&lt;code class=&#34;hljs python&#34;&gt;soup_bowl()&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;Congratulations&#34;&gt;&lt;a href=&#34;#Congratulations&#34; class=&#34;headerlink&#34; title=&#34;Congratulations!&#34;&gt;&lt;/a&gt;Congratulations!&lt;/h2&gt;&lt;p&gt;您已经学习了以下内容:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;成本方程提供了一种衡量预测与训练数据匹配程度的方法。&lt;/li&gt;
&lt;li&gt;最小化成本可以提供𝑤和b的最优值。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;&lt;a href=&#34;#参考资料&#34; class=&#34;headerlink&#34; title=&#34;参考资料&#34;&gt;&lt;/a&gt;参考资料&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://www.bilibili.com/video/BV1Pa411X76s?p=5&amp;amp;vd_source=3ae32e36058f58c5b85935fca9b77797&#34;&gt;https://www.bilibili.com/video/BV1Pa411X76s?p=5&amp;amp;vd_source=3ae32e36058f58c5b85935fca9b77797&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/kaieye/2022-Machine-Learning-Specialization&#34;&gt;kaieye&amp;#x2F;2022-Machine-Learning-Specialization (github.com)&lt;/a&gt;&lt;/p&gt;
 ]]></description>
        </item>
    </channel>
</rss>
