Cache命中率分析工具的使用(附源代码)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目:安装一种Cache命中率分析工具,并现场安装、演示。
一、什么是CPU-Cache
CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器,它的容
量比内存小的多但是交换速度却比内存要快得多。高速缓存的出现主要是为了解
决CPU运算速度与内存读写速度不匹配的矛盾,因为CPU运算速度要比内存读
写速度快很多,这样会使CPU花费很长时间等待数据到来或把数据写入内存。
在缓存中的数据是内存中的一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可先缓存中调用,从而加快读取速度。CPU包
含多个核心,每个核心又有独自的一级缓存(细分成代码缓存和数据缓存)和二
级缓存,各个核心之间共享三级缓存,并统一通过总线与内存进行交互。
二、关于Cache Line
整个Cache被分成多个Line,每个Line通常是32byte或64byte,Cache Line
是Cache和内存交换数据的最小单位,每个Cache Line包含三个部分
Valid:当前缓存是否有效
Tag:对应的内存地址
Block:缓存数据
三、Cache命中率分析工具选择
1、Linux平台:Valgrind分析工具;
2、Windows平台如下:
java的Jprofiler;
C++的VisualStudio2010及以后的版本中自带profile工具;
Application Verifier;
intel vtune等。
四、选用Valgrind分析工具在Linux-Ubuntu14.04环境下实验
1.Valgrind分析工具的常用命令功能:
memcheck:检查程序中的内存问题,如泄漏、越界、非法指针等。
callgrind:检测程序代码的运行时间和调用过程,以及分析程序性能。
cachegrind:分析CPU的cache命中率、丢失率,用于进行代码优化。
helgrind:用于检查多线程程序的竞态条件。
massif:堆栈分析器,指示程序中使用了多少堆内存等信息。
2.Valgrind分析工具的安装:
使用Ubuntu统一安装命令:sudo apt-get install valgrind
之后等待安装完成即可。
安装界面如图(由于我已经安装了此工具,而且没有更新的版本,图上结果为无可用升级)。
五、使用Valgrind分析工具测试程序的Cache命中率
1.首先,编写两个C语言程序,主要使用对数组数据两种读写方式来测试Cache命中率的不同,同时根据程序做同一件事的运行时间来判断程序质量的好坏。
代码如下:
cache1.c :
#include
#include
#include
#define MAXROW 8000
#define MAXCOL 8000
int main () {
struct timeval startTime,endTime;
float Timeuse;
int i,j;
static int x[MAXROW][MAXCOL];
printf ("Running!\n");
gettimeofday(&startTime,NULL);
for (i=0;i for (j=0;j x[i][j] = i*j; printf("Completed!\n"); gettimeofday(&endTime,NULL); Timeuse = 1000000*(_sec - _sec) + (_usec - _usec); Timeuse /= 1000000; printf("Timeuse = %f\n",Timeuse); return 0; } cache2.c : #include #include #include #define MAXROW 8000 #define MAXCOL 8000 int main () { struct timeval startTime,endTime; float Timeuse; int i,j; static int x[MAXROW][MAXCOL]; printf ("Running!\n"); gettimeofday(&startTime,NULL); for (j=0;j for (i=0;i x[i][j] = i*j; printf("Completed!\n"); gettimeofday(&endTime,NULL); Timeuse = 1000000*(_sec - _sec) + (_usec - _usec); Timeuse /= 1000000; printf("Timeuse = %f\n",Timeuse); return 0; } 2.对以上两个程序进行Cache命中率测试: ①编译两程序: gcc -o cache1 cache1.c gcc -o cache2 cache2.c ②使用命令valgrind --tool=cachegrind ./cache1 测试cache1程序的Cache命中率: