【C++】如何提高Cache的命中率,示例
参考链接 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的命中率,示例的更多相关文章
- L1 Cache, L2 Cache读取命中率与时钟周期计算
CPU在Cache中找到有用的数据被称为命中,当Cache中没有CPU所需的数据时(这时称为未命中),CPU才访问内存.从理论上讲,在一颗拥有2级Cache的CPU中,读取L1 Cache的命中率为8 ...
- 通过缓存Cache记录命中率
import org.apache.juli.logging.Log; /** * 通过此Cache记录命中率 * @author Administrator * */ public class Lo ...
- cache line 伪共享
https://blog.csdn.net/qq_27680317/article/details/78486220认识CPU Cache CPU Cache概述 随着CPU的频率不断提升,而内存的访 ...
- Cache的原理、设计及实现
Cache的原理.设计及实现 前言 虽然CPU主频的提升会带动系统性能的改善,但系统性能的提高不仅仅取决于CPU,还与系统架构.指令结构.信息在各个部件之间的传送速度及存储部件的存取速度等因素有关,特 ...
- [z]计算机架构中Cache的原理、设计及实现
前言 虽然CPU主频的提升会带动系统性能的改善,但系统性能的提高不仅仅取决于CPU,还与系统架构.指令结构.信息在各个部件之间的传送速度及存储部件的存取速度等因素有关,特别是与CPU/内存之间的存取速 ...
- GC与显式内存管理
C++复兴的话题至今已被鼓吹两年有余,Herb Sutter和Bjarne Stroustrup等大牛们也为C++带来了大步伐的革新.然而,从这两年的效果而言,C++的复兴并没有发生.一方面随着世界经 ...
- Linux系统针对网卡中断的优化处理
摘要: 中断: 当网卡接收到数据包后,会触发硬中断,通知CPU来收包.硬中断是一个CPU和网卡交互的过程.这其实会消耗CPU资源.特别是在使用速度极快的万兆网卡 之后,大量的网络交互使得CPU很大一部 ...
- h.264并行熵解码
在前面讨论并行解码的章节中,我们专注于讨论解码的宏块重建部分,甚至把宏块重建描述成宏块解码,这是因为在解码工作中,宏块重建确实占了相当大的比重,不过解码还包含其它的部分,按照解码流程可粗略分为: 读取 ...
- Spark内存管理之钨丝计划
Spark内存管理之钨丝计划 1. 钨丝计划的产生的原因 2. 钨丝计划内幕详解 一:“钨丝计划”产生的本质原因 1, Spark作为一个一体化多元化的(大)数据处理通用平台,性能一直是其根本性的追 ...
随机推荐
- python-30个骚操作
1.冒泡排序 2.计算x的n次方的方法 3.计算a*a + b*b + c*c + …… 4.计算阶乘 n! 5.列出当前目录下的所有文件和目录名 ...
- scikit-learn机器学习(四)使用决策树做分类
我们使用决策树来创建一个能屏蔽网页横幅广告的软件. 已知图片的数据判断它属于广告还是文章内容. 数据来自 http://archive.ics.uci.edu/ml/datasets/Internet ...
- Spring Aop(十三)——ProxyFactoryBean创建代理对象
转发地址:https://www.iteye.com/blog/elim-2398673 ProxyFactoryBean创建代理对象 ProxyFactoryBean实现了Spring的Factor ...
- iOS面试-关于性能优化
目录 我要给出的建议将分为三个不同的等级: 入门级. 中级和进阶级: 入门级(这是些你一定会经常用在你app开发中的建议) 1. 用ARC管理内存2. 在正确的地方使用reuseIdentifier3 ...
- Flutter 路由 页面间跳转和传参 返回
Navigator Navigator用来管理堆栈功能(即push和pop),在Flutter的情况下,当我们导航到另一个屏幕时,我们使用Navigator.push方法将新屏幕添加到堆栈的顶部.当然 ...
- java中length和length()的区别?
在java中String类可以定义字符串变量和字符串数组,length()用于求String字符串对象的长度,而length用 于求String字符串数组的长度. length()是求String ...
- DNS域名解析系统_1
DNS服务概述: DNS的模式为C/S模式 DNS(Domain Name System)域名系统,在TCP/IP网络中有非常重要的地位,能够提供域名与ip地址的解析服务. DNS是一个分布式数据库, ...
- Windows 10 下如何彻底关闭 Hyper-V 服务
以管理员身份运行命令提示符 执行命令 bcdedit /set hypervisorlaunchtype off 重启,运行vm即可. 如果想要恢复hyper启动 bcdedit / set hype ...
- 【ARM-Linux开发】"libxml/parser.h: 没有那个文件或目录"解决方案
这是因为在ubuntu上没有安装libxml2-dev,这个包应该是开发用的,而已安装的libxml2应该只是像jre一样的部件. 解决方案:sudo apt-get install libxml2- ...
- 删除Vue中无权限的【node_modules】文件
npm install rimraf -g rimraf node_modules