cache测试及其矩阵优化

利用c/c++测试电脑的cache参数,知识点主要有以下几个:

1. SSE 指令预取

Intel公司的单指令多数据流式扩展(SSE,Streaming SIMD Extensions)技术能够有效增强CPU浮点运算的能力。具体情况请移步维基。

C++中包含SSE指令的头文件:
#include <xmmintrin.h>

预取指令:_mm_prefetch

void _mm_prefetch(char *p, int i)
从地址P处预取尺寸为cache line大小的数据缓存,参数i指示预取方式(_MM_HINT_T0, _MM_HINT_T1, _MM_HINT_T2, _MM_HINT_NTA,分别表示不同的预取方式)
T0 预取数据到所有级别的缓存,包括L0。
T1 预取数据到除L0外所有级别的缓存。
T2 预取数据到除L0和L1外所有级别的缓存。
NTA  预取数据到非临时缓冲结构中,可以最小化对缓存的污染。
如果在CPU操作数据之前,我们就已经将数据主动加载到缓存中,那么就减少了由于缓存不命中,需要从内存取数的情况,这样就可以加速操作,获得性能上提升。使用主动缓存技术来优化内存拷贝。

注意,CPU对数据操作拥有绝对自由!使用预取指令只是按我们自己的想法对CPU的数据操作进行补充,有可能CPU当前并不需要我们加载到缓存的数据,这样,我们的预取指令可能会带来相反的结果,比如对于多任务系统,有可能我们冲掉了有用的缓存。不过,在多任务系统上,由于线程或进程的切换所花费的时间相对于预取操作来说太长了, 所以可以忽略线程或进程切换对缓存预取的影响。

参考:MSDN
http://hi.baidu.com/sige_online/blog/item/a80522ceec812433b700c829.html
http://www.codeguru.com/forum/archive/index.php/t-337156.html
http://blog.csdn.net/igame/archive/2007/08/21/1752430.aspx


2. 编译带有SSE指令的程序
需要使用以下选项:
g++ -Wall -march=pentium4 -mmmx -o run.out test.cpp

否则就会出现如下类似错误:
/usr/lib/gcc/i386-redhat-linux/4.1.2/include/xmmintrin.h:34:3: error: #error "SSE instruction set not enabled"

如果是多线程程序,还要加上-lpthread选项


3. 计时函数

3.1 clock()

#include<time.h>

获得该程序从启动到函数此处调用占用CPU的时间
常量CLOCKS_PER_SEC,它用来表示一秒钟会有多少个时钟计时单元
可以使用公式clock()/CLOCKS_PER_SEC来计算一个进程自身的运行时间,单位为秒

3.2 gettimeofday()

#include<sys/time.h>
int gettimeofday(struct timeval*tv, struct timezone *tz)
gettimeofday()会把目前的时间用tv结构体返回,当地时区的信息则放到tz所指的结构中

struct  timeval{
    long  tv_sec;/*秒*/
    long  tv_usec;/*微妙*/
};

struct  timezone{
    int tz_minuteswest;/*和greenwich 时间差了多少分钟*/
    int tz_dsttime;/*type of DST correction*/
};

在gettimeofday()函数中tv或者tz都可以为空。如果为空则就不返回其对应的结构体。
函数执行成功后返回0,失败后返回-1,错误代码存于errno中。
在使用gettimeofday()函数时,第二个参数一般都为空,因为我们一般都只是为了获得当前时间,而不用获得timezone的数值

4. 矩阵优化

大矩阵的计算时间主要消费在IO访问上,可以利用cache的空间局部性原理,对矩阵的IO进行优

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值