星期一, 五月 16, 2011

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

http://lwn.net/Articles/256433/

6.4 Multi-Thread Optimizations
三个方面比较重要 一致性 原子性 带宽


6.4.1 Concurrency Optimizations
为了保持cache一致性 不同芯片的多线程写同一地址会效率差 单个芯片多core因为cache共享就会好很多

优化一致性的问题的核心思路是将一致性要求不同的变量放入不同的cache line

优化方法
方法一 读写变量和初始化后只读变量分入不同section(gcc对const变量会自动这么做) 使他们在内存和cache上分开 如果可以
还建议将读多写少变量分入单独section

方法二 将经常被同时访问的变量放入同一structure确保他们在内存结构上在一起

方法三 将经常被不同线程写的变量放入同一structure确保他们在内存结构上在一起

方法二 方法三可配合__attribute__((aligned(l1 cache line size)))确保全部变量在一个cache line

方法四 如果一个变量被多个线程分别使用 并且无一致性需求 可用__thread将变量放入tls


6.4.2 Atomicity Optimizations
主要介绍原子内存操作


6.4.3 Bandwidth Considerations
每个芯片连接内存都有一个最大带宽 而其会被芯片中的core和硬线程共享
多个芯片连接内存的方式可能也是共享的
所以效率也受到带宽的影响

比较新机器的performance measurement counters可以探测这个问题

方法一 买更快的机器 在带宽问题只能在部分机器出现 且换新机器比重写问题程序便宜的时候 这是个可用的方法

方法二 如果几个线程经常访问同样的数据 将同一进程的几个线程放在有cache共享的几个core上

方法三 如果几个线程经常访问不同的数据 不要将他们放入同一个core(我认为cache共享的几个core上) 否则易引起cache冲突

文中介绍了一些控制线程在哪个core上运行的接口

方法二 方法三是有冲突的 所以使用时务必分析好当前面对的问题 并作实验

0 Comments:

发表评论

<< Home