星期一, 四月 18, 2011

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

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 Comments:

发表评论

<< Home