/*
执行方式:
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;
}
Cache预取
最新推荐文章于 2023-11-27 13:20:08 发布