以矩阵乘法为例,了解cpu cache对程序性能的影响

原创 2013年09月16日 23:52:21
/*square1.cpp*/
/*未经优化的矩阵乘法程序*/
#include 
using namespace std;
#define N 1000
int a[N][N] = {0}, b[N][N] = {0}, c[N][N] = {0};
int main() {
    int i, j, k;
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++) {
            a[i][j] = i+j;
            b[i][j] = i+j;
        }
    }
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++) {
            for (k = 0; k < N; k++) {
                c[i][j] += a[i][k] * b[k][j];
            }

        }
    }
}
 
/*square2.cpp*/  
/*优化过的矩阵乘法程序*/  
#include   
using namespace std;  
#define N 1000  
int a[N][N] = {0}, b[N][N] = {0}, c[N][N] = {0};  
int main() {  
    int i, j, k;  
    for (i = 0; i < N; i++) {  
        for (j = 0; j < N; j++) {  
            a[i][j] = i+j;  
            b[i][j] = i+j;  
        }  
    }  
    for (i = 0; i < N; i++) {  
        for (k = 0; k < N; k++) {  
            for (j = 0; j < N; j++) {  
                c[i][j] += a[i][k] * b[k][j];  
            }  
  
        }  
    }  
}
两段程序的唯一差别,就是把 三层循环中的 j 循环 和k 循环的顺序交换了一下。

square1.cpp中因为第三层循环(最内层循环)是对k进行循环,因此b[k][j]是对b逐列进行访问。我们知道内存中二维数组是以行为单位连续存储的,逐列访问将会每次跳1000*4(bytes)。根据cpu cache的替换策略,将会有大量的cache失效。

因此square2.cpp将j循环和k循环交换位置,这样就保证了

c[i][j] += a[i][k] * b[k][j];

这条语句对内存的访问是连续的,增加了cache的命中率,大大提升了程序执行速度。

我们来看一下实测效果:(测试环境:64位双核2.4GHz cpu)

执行时间测试:


时间居然会相差近10倍。 可见利用好cpu cache优化我们的程序,是非常有必要掌握的技能。

平时写程序时,也应当尽量使cpu对内存的访问,是尽可能连续的。

矩阵乘法cache优化

好文要转,太棒了~~~~~~~~~~~~~~~~~~~~~~~~~ 题目地址:http://www.51nod.com/onlineJudge/questionCode.html#!proble...
  • Scythe666
  • Scythe666
  • 2015年05月05日 17:03
  • 2321

cache测试及其矩阵优化

利用c/c++测试电脑的cache参数 1. 指令yu'qu
  • GVFDBDF
  • GVFDBDF
  • 2015年11月13日 14:50
  • 2372

矩阵乘法的并行算法

设两个矩阵A和B,大小分别为M * N 和 N * P, 如果C = A * B, 则C的大小为M * P。 矩阵算法的算法表示,伪代码如下: for (i = 0; i < M; ++i){ ...
  • realxie
  • realxie
  • 2012年02月15日 10:16
  • 10759

矩阵乘法——CUDA 优化记录

CUDA 是 NVIDIA 的 GPGPU 模型,它使用 C 语言为基础,可以直接以大多数人熟悉的 C 语言,写出在显示芯片上执行的程序,而不需要去学习特定的显示芯片的指令或是特殊的结构。” 编...
  • Openking
  • Openking
  • 2015年01月09日 10:01
  • 1815

CSAPP第五次实验(cahce) 局部性对矩阵乘法的影响

因为要考试了,所以就不再写一遍了,而是直接把我的实验报告的pdf分段以图片的形式发上来,因为涉及到的程序代码并不长,所以如果有必要,我会把一部分程序贴出来让大家方便复制。 1. 获取本机cache信息...
  • pjy19960808
  • pjy19960808
  • 2016年06月09日 15:44
  • 771

从矩阵乘法的不同计算方式来看局部性原理

今天碰到的关于矩阵乘法不同情况下运算速度的问题,隐约记得是因为缓存的问题,后来突然想起来CSAPP那本书上讲过这个东西的,就是通过矩阵乘法三重循环的不同顺序来讲的局部性原理的,所以翻过来又看了一下。 ...
  • haolexiao
  • haolexiao
  • 2017年03月28日 20:38
  • 405

矩阵乘法的四种理解方式

先介绍向量的两种运算,一个行向量乘以一个列向量称作向量的内积,又叫作点积,结果是一个数; 一个列向量乘以一个行向量称作向量的外积,外积是一种特殊的克罗内克积,结果是一个矩阵, 假设和b分别...
  • qq_18343569
  • qq_18343569
  • 2015年11月14日 10:38
  • 2026

矩阵乘法的优化

矩阵乘法的优化 分类: 代码优化2013-06-01 08:41 533人阅读 评论(1) 收藏 举报 题目地址:http://www.51nod.com/onlineJudge/...
  • u010304217
  • u010304217
  • 2014年08月06日 09:42
  • 548

矩阵乘法优化算法

本篇文章大部分思路与代码都来自于微信公众号“CPP开发者”中2016年4月11日的文章《矩阵相乘优化算法实现讲解》,基本相当于这篇文章的重点重述。 矩阵是什么以及矩阵乘法是怎么操作的,我想点开这篇文...
  • dannis_bh
  • dannis_bh
  • 2016年04月12日 22:25
  • 2831

矩阵乘法的优化

题目地址:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1113 昨晚为了优化这个题目弄到2点多,今天一早就写博,我真是...
  • gogdizzy
  • gogdizzy
  • 2013年06月01日 08:41
  • 8578
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:以矩阵乘法为例,了解cpu cache对程序性能的影响
举报原因:
原因补充:

(最多只允许输入30个字)