Cache
USST_Coder
这个作者很懒,什么都没留下…
展开
-
C++性能优化系列——矩阵转置(一)访问内存顺序带来的性能差异
矩阵转置代码实现说明:实现两种矩阵转置方法,其中测试平台9900k,为了让程序执行时间足够长,重复执行代码1024次。矩阵尺寸1024*1024。将矩阵按照128X128分块转置处理。每个块内部分别按照方式 按行索引读取和按列索引写 与 按列索引读和按行索引写 实现,即方法一 写行连续,方法二 读连续。int main(int argc, char* argv[]){#define NROW 1024#define NCOL 1024#define NSLICE NROW*NCOL#defin原创 2020-07-27 15:45:07 · 2999 阅读 · 2 评论 -
C++性能优化系列——矩阵转置(二)循环分块优化缓存访问
在上一篇博客 CPU性能优化系列——矩阵转置(一)访存方式造成的性能差异 中,为了说明CPU缓存一致性算法对写内存和读内存的差异,只是单纯构造一个内存操作对称的矩阵转置实现方式,其中分块与内存访问的步长并非是最合理的。本篇将基于上一篇博客的实现方式,根据L1 Data Cache的结构,对访问缓存方式做进一步优化。代码实现...原创 2020-07-31 11:15:13 · 4734 阅读 · 2 评论 -
C++性能优化系列——矩阵转置(三)内存填充避免缓存抖动
在上一篇博客 CPU性能优化系列——矩阵转置(二)循环分块优化缓存访问 中通过循环分块方法,分析并优化了缓存的访问,使性能得到提升。同时通过VTune抓包分析了代码执行情况。看起来Cache命中情况很好。可实际缓存真的没有优化空间了吗?也不见得。本篇根据《深入理解计算机系统》中缓存篇介绍的映射规则,在缓存映射方面做进一步优化。以分块优化版本为Base,通过对pSource数据进行内存填充处理,使pSource的访问内存映射不集中在一个缓存组中,避免缓存抖动问题。优化后执行情况:1024 * 1024原创 2020-08-05 15:58:34 · 1397 阅读 · 0 评论 -
C++性能优化系列——矩阵转置(七)Intrinsic 内存预取与OpenMP多线程并行化
上一篇CPU性能优化系列——矩阵转置(六)Intrinsic转置实现与Core Bound优化中通过Intrinsic 实现了矩阵转置功能,同时针对寄存器使用导致的spilling问题,对每次处理的数据块尺寸进行调整。本篇将基于之前的优化版本,在内存访问方面与多线程并行化方面做进一步优化。内存访问优化上一篇中主要针对寄存器使用问题优化代码,未针对内存访问问题 L3 Latency做处理。考虑Advance2版本中对内存访问的模式,写内存操作是连续执行的,读内存操作是交叉执行的。因此加载内存方式导致该问题原创 2020-08-18 17:08:55 · 1175 阅读 · 0 评论 -
主存到Cache直接映射、全相联映射和组相联映射
---- Cache的容量很小,它保存的内容只是主存内容的一个子集,且Cache与主存的数据交换是以块(cache line)为单位的。为了把信息放到Cache中,必须应用某种函数把主存地址定位到Cache中,这称为地址映射。---- 在信息按这种映射关系装入Cache后,CPU执行程序时,会将程序中的主存地址变换成Cache地址,这个...转载 2020-08-12 06:38:28 · 9358 阅读 · 0 评论 -
内存Prefetch
最近在用vtune分析程序性能瓶颈时,发现一些内存访问的地方竟然成了cpu热点。经过仔细分析,发现这些热点主要是对大数组非连续位置的访问的引起的。比较消耗cpu的原因应该是cache不命中。因为像这样局部性很差的内存访问逻辑,对cache是很不友好的。于是想到了prefetch……x86(以及其他很多体系结构)的CPU提供了prefetch系列指令,用于将指定地址的内存预取到cache。如”prefetcht0 (...转载 2020-07-27 23:41:47 · 2655 阅读 · 0 评论