加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

What every programmer should know about memory 阅读笔记(6.2.1)

(2011-05-05 15:35:46)
标签:

it

分类: 技术
http://lwn.net/Articles/255364/
6.2.1 Optimizing Level 1 Data Cache Access
大块读写时尽量将非顺序读写转化成顺序读写
而每次内存操作可以集中于一cache line,从而提高速度
取得当前系统cache line长度的命令为 getconf LEVEL1_DCACHE_LINESIZE
这样在编译当前系统执行的程序的时候 可以用 gcc -DCLS=$(getconf LEVEL1_DCACHE_LINESIZE)
将cache line长度传递到程序中
当然大块数据读写还是SIMD指令速度最快
上面提速的原理是提高cache 被污染前的再次使用机率

pahole program (see[dwarves])能显示一个struct 在cache 中的分布 文中建议可根据需要压缩struct
尽量让数据在同一cache line 同时按照访问顺序设置元素顺序 适当时可将一个struct 分成多个
需要时候可用posix_memalign分配cache line 对齐的内存
struct strtype {
...members...
} __attribute((aligned(64)));
标记内存对齐到多少

当使用variable length arrays (VLAs) 或者 alloca
的时候,为了保证frame的对齐,会增加很多相关代码,影响程序速度。这个我自己写了些代码看了下,确实增加了很多代码,如果是调用次数很多的函数,建议还是去掉vlas和alloca。

gcc支持一个frame对齐参数:
-mpreferred-stack-boundary=2
使用这个参数的时候,frame将以2的n次方对齐。所以上面让gcc生成的代码从默认的16字节切换为4字节。
作者认为在编译x86程序的时候设置这个参数为2,可以减少stack的使用并提高代码执行速度。(我没有测试过)
其他ARCH都不能设置为2,即使是x86_64。 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有