Cache预取

/*
执行方式:
    g++ cache.c -o cache.out
    ./cache.out
Note:
    Cache预取原理。
Express:
    Cache之所以能够提高系统性能,主要是程序执行存在局部性现
    象, 即时间局部性和空间局部性。
    
    1) 时间局部性: 是指程序即将用到的指令/数据可能就是目前正在
    使用的指令/数据。 因此, 当前用到的指令/数据在使用完毕之后可以暂
    时存放在Cache中, 可以在将来的时候再被处理器用到。 一个简单的例
    子就是一个循环语句的指令, 当循环终止的条件满足之前, 处理器需要
    反复执行循环语句中的指令。

    2) 空间局部性: 是指程序即将用到的指令/数据可能与目前正在使
    用的指令/数据在空间上相邻或者相近。 因此, 在处理器处理当前指令/
    数据时, 可以从内存中把相邻区域的指令/数据读取到Cache中, 这样,
    当处理器需要处理相邻内存区域的指令/数据时, 可以直接从Cache中读
    取, 节省访问内存的时间。 一个简单的例子就是一个需要顺序处理的数
    组。

    所谓的Cache预取, 也就是预测数据并取入到Cache中, 是根据空间
    局部性和时间局部性, 以及当前执行状态、 历史执行过程、 软件提示等信息, 然后以一定的合理方法, 在数据/指令被使用前取入Cache。 这
    样, 当数据/指令需要被使用时, 就能快速从Cache中加载到处理器内部
    进行运算和执行。

    在不同体系架构, 甚至不同处理
    器上, 具体采取的预取方法。都可能是不同的。预取需要满足一定的条件。
*/


#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <xmmintrin.h>

#define Matrix_Len 1024
#define Loop 500

int main()
{
    time_t t;

    int a[Matrix_Len][Matrix_Len];

    t = time(NULL);
    for(long long loop = 0; loop < Loop; ++loop)
    {
        for(int i = 0; i < Matrix_Len; ++i)
        {
            for(int j = 0; j < Matrix_Len; ++j)
            {
                a[i][j] = 1;
            }
        }
    }
    printf("Gap1: %ld\n", time(NULL) - t);

    t = time(NULL);
    for(long long loop = 0; loop < Loop; ++loop)
    {    
        for(int i = 0; i < Matrix_Len; ++i)
        {
            for(int j = 0; j < Matrix_Len; ++j)
            {   //几乎无空间局部性可言,造成程序性能低下。
                a[j][i] = 1;
            }
        }
    }
    printf("Gap2:%ld\n", time(NULL) - t);

    t = time(NULL);
    for(long long loop = 0; loop < Loop; ++loop)
    {    
        for(int i = 0; i < Matrix_Len; ++i)
        {
            for(int j = 0; j < Matrix_Len; ++j)
            {   //通过软预取,可提升一定程度性能。
                _mm_prefetch(&a[j + 1][i], _MM_HINT_T0);
                a[j][i] = 1;
            }
        }
    }
    printf("Gap3:%ld\n", time(NULL) - t);

    return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值