参考链接     https://stackoverflow.com/questions/16699247/what-is-a-cache-friendly-code

只是堆积:缓存不友好与缓存友好代码的典型例子是矩阵乘法的“缓存阻塞”。

朴素矩阵乘法看起来像

for(i=;i<N;i++) {
for(j=;j<N;j++) {
dest[i][j] = ;
for( k==;k<N;i++) {
dest[i][j] += src1[i][k] * src2[k][j];
}
}
}

如果N很大,例如,如果N * sizeof(elemType)大于高速缓存大小,那么每次访问都src2[k][j]将是高速缓存未命中。

有许多不同的方法可以为缓存优化它。这是一个非常简单的示例:不是在内部循环中每个缓存行读取一个项目,而是使用所有项目:

int itemsPerCacheLine = CacheLineSize / sizeof(elemType);

for(i=;i<N;i++) {
for(j=;j<N;j += itemsPerCacheLine ) {
for(jj=;jj<itemsPerCacheLine; jj+) {
dest[i][j+jj] = ;
}
for( k==;k<N;i++) {
for(jj=;jj<itemsPerCacheLine; jj+) {
dest[i][j+jj] += src1[i][k] * src2[k][j+jj];
}
}
}
}

如果高速缓存行大小为64字节,并且我们在32位(4字节)浮点数上运行,则每个高速缓存行有16个项目。通过这种简单的转换,缓存未命中的数量减少了大约16倍。

Fancier转换在2D图块上运行,针对多个缓存(L1,L2,TLB)进行优化,等等。

谷歌搜索“缓存阻塞”的一些结果:

http://stumptown.cc.gt.atl.ga.us/cse6230-hpcta-fa11/slides/11a-matmul-goto.pdf

http://software.intel.com/en-us/articles/cache-blocking-techniques

一个优化的缓存阻塞算法的精彩视频动画。

http://www.youtube.com/watch?v=IFWgwGMMrh0

循环平铺非常密切相关:

http://en.wikipedia.org/wiki/Loop_tiling

【C++】如何提高Cache的命中率,示例的更多相关文章

  1. L1 Cache, L2 Cache读取命中率与时钟周期计算

    CPU在Cache中找到有用的数据被称为命中,当Cache中没有CPU所需的数据时(这时称为未命中),CPU才访问内存.从理论上讲,在一颗拥有2级Cache的CPU中,读取L1 Cache的命中率为8 ...

  2. 通过缓存Cache记录命中率

    import org.apache.juli.logging.Log; /** * 通过此Cache记录命中率 * @author Administrator * */ public class Lo ...

  3. cache line 伪共享

    https://blog.csdn.net/qq_27680317/article/details/78486220认识CPU Cache CPU Cache概述 随着CPU的频率不断提升,而内存的访 ...

  4. Cache的原理、设计及实现

    Cache的原理.设计及实现 前言 虽然CPU主频的提升会带动系统性能的改善,但系统性能的提高不仅仅取决于CPU,还与系统架构.指令结构.信息在各个部件之间的传送速度及存储部件的存取速度等因素有关,特 ...

  5. [z]计算机架构中Cache的原理、设计及实现

    前言 虽然CPU主频的提升会带动系统性能的改善,但系统性能的提高不仅仅取决于CPU,还与系统架构.指令结构.信息在各个部件之间的传送速度及存储部件的存取速度等因素有关,特别是与CPU/内存之间的存取速 ...

  6. GC与显式内存管理

    C++复兴的话题至今已被鼓吹两年有余,Herb Sutter和Bjarne Stroustrup等大牛们也为C++带来了大步伐的革新.然而,从这两年的效果而言,C++的复兴并没有发生.一方面随着世界经 ...

  7. Linux系统针对网卡中断的优化处理

    摘要: 中断: 当网卡接收到数据包后,会触发硬中断,通知CPU来收包.硬中断是一个CPU和网卡交互的过程.这其实会消耗CPU资源.特别是在使用速度极快的万兆网卡 之后,大量的网络交互使得CPU很大一部 ...

  8. h.264并行熵解码

    在前面讨论并行解码的章节中,我们专注于讨论解码的宏块重建部分,甚至把宏块重建描述成宏块解码,这是因为在解码工作中,宏块重建确实占了相当大的比重,不过解码还包含其它的部分,按照解码流程可粗略分为: 读取 ...

  9. Spark内存管理之钨丝计划

    Spark内存管理之钨丝计划 1. 钨丝计划的产生的原因 2. 钨丝计划内幕详解  一:“钨丝计划”产生的本质原因 1, Spark作为一个一体化多元化的(大)数据处理通用平台,性能一直是其根本性的追 ...

随机推荐

  1. python-30个骚操作

    1.冒泡排序     2.计算x的n次方的方法     3.计算a*a + b*b + c*c + ……     4.计算阶乘 n!             5.列出当前目录下的所有文件和目录名   ...

  2. scikit-learn机器学习(四)使用决策树做分类

    我们使用决策树来创建一个能屏蔽网页横幅广告的软件. 已知图片的数据判断它属于广告还是文章内容. 数据来自 http://archive.ics.uci.edu/ml/datasets/Internet ...

  3. Spring Aop(十三)——ProxyFactoryBean创建代理对象

    转发地址:https://www.iteye.com/blog/elim-2398673 ProxyFactoryBean创建代理对象 ProxyFactoryBean实现了Spring的Factor ...

  4. iOS面试-关于性能优化

    目录 我要给出的建议将分为三个不同的等级: 入门级. 中级和进阶级: 入门级(这是些你一定会经常用在你app开发中的建议) 1. 用ARC管理内存2. 在正确的地方使用reuseIdentifier3 ...

  5. Flutter 路由 页面间跳转和传参 返回

    Navigator Navigator用来管理堆栈功能(即push和pop),在Flutter的情况下,当我们导航到另一个屏幕时,我们使用Navigator.push方法将新屏幕添加到堆栈的顶部.当然 ...

  6. java中length和length()的区别?

    在java中String类可以定义字符串变量和字符串数组,length()用于求String字符串对象的长度,而length用  于求String字符串数组的长度.  length()是求String ...

  7. DNS域名解析系统_1

    DNS服务概述: DNS的模式为C/S模式 DNS(Domain Name System)域名系统,在TCP/IP网络中有非常重要的地位,能够提供域名与ip地址的解析服务. DNS是一个分布式数据库, ...

  8. Windows 10 下如何彻底关闭 Hyper-V 服务

    以管理员身份运行命令提示符 执行命令 bcdedit /set hypervisorlaunchtype off 重启,运行vm即可. 如果想要恢复hyper启动 bcdedit / set hype ...

  9. 【ARM-Linux开发】"libxml/parser.h: 没有那个文件或目录"解决方案

    这是因为在ubuntu上没有安装libxml2-dev,这个包应该是开发用的,而已安装的libxml2应该只是像jre一样的部件. 解决方案:sudo apt-get install libxml2- ...

  10. 删除Vue中无权限的【node_modules】文件

    npm install rimraf -g rimraf node_modules