提高cache命中率

9 篇文章 0 订阅
6 篇文章 0 订阅
文章讨论了CPU如何通过缓存提高程序运行速度,通过C代码实例展示了不同编译选项对缓存命中率的影响。测试显示,优化缓存使用能显著降低L1缓存miss并提高IPC值。
摘要由CSDN通过智能技术生成

CPU读取数据的时候,不是直接访问内存,而是先访问缓存,缓存没有命中的情况下才会去访问内存,如果缓存命中则直接从缓存中读取数据,由于缓存的速度要远高于内存,因此充分利用CPU的cache来缓存数据,提高cache命中率能够大幅度提高程序的运行速度。

下面是一个实际的测试代码:

#include <stdio.h>
#include <stdlib.h>

#define SIZE 10000
//#define DEBUG
int main(){
	double a[SIZE][SIZE];
	double b[SIZE][SIZE];
	double c[SIZE][SIZE];
#ifdef DEBUG
	for(int j = 0; j < SIZE; j++){
		for(int i = 0; i < SIZE; i++){
#else
	for(int i = 0; i < SIZE; i++){
		for(int j = 0; j < SIZE; j++){
#endif
			a[i][j] = 8.3 * i  + 1.2 * j;
			b[i][j] = 12.3 * i + 3.4 * j;
		}
	}
#ifdef DEBUG
	for(int j = 0; j < SIZE; j++){
		for(int i = 0; i < SIZE; i++){
#else
	for(int i = 0; i < SIZE; i++){
		for(int j = 0; j < SIZE; j++){
#endif
			c[i][j] = a[i][j] + b[i][j];
		}
	}
	return 0;
}

在上述代码中,我们使用宏定义来实现两种不同的数组访问顺序。

我们根据不同的标识来进行编译

编译的第一个二进制是利用cache的t1

gcc -o t1 t.c

编译的第二个二进制是t2

gcc -o t2 t.c -DDEBUG

首先我们测试这两个程序的运行时间,可以看到在相同的环境下,t2运行的时长是t1的四倍

使用perf stat查看两个程序运行时的IPC,可以看到在相同的环境下,t2运行的ipc只有t1的四分之一

使用perf stat命令查看两个进程的L1 cache miss数量,能够看到二者的显著差别

perf stat -e L1-dcache-load-misses ./t1

perf stat -e L1-dcache-load-misses ./t2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aolitianya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值