并行程序设计的常见问题

来源:互联网 发布:新手护肤步骤知乎 编辑:程序博客网 时间:2024/05/01 19:53

与线程相关的开销

1)  线程的创建于销毁产生的开销

2)  保存和恢复寄存器的开销

3)  保存和回复线程cache的开销

4)  废除虚存的开销

 

与存储相关的性能问题

静态的

1)  用恰好够用的比特精度存储需要的数据

2)  对于struct数据,根据类型大小的降序,对内部元素进行声明

 

动态的cache

1)  减少CPU和存储器之间的数据移动

a)        将大数据分段,对每一小段集中处理,这样可以避免由于数据量过大造成cache的频繁更新

2)  减少CPU之间的数据移动

a)        为各个线程设置私有的数据,最后将私有数据合并获得完整的数据

 

存储一致性问题

1)  硬件的松弛一致性:发生在CPUA上的读写操作的顺序,在CPU B上看来可能会不同,但CPU A总能保证自身顺序的一致性。

2)  编译器指令重定序:必要时用volatile提示编译器

 

伪共享问题

Cache行是硬件线程交换信息的最小单位

 

高性能的数据组织

1)  线程私有数据 会被保留在cache中

2)  线程共享只读 每个线程保留一个副本

3)  不同类型的数据在特定的cache行中进行存放,避免伪共享问题(如可以将共享只读的数据和可写的数据分离开)


整理自《多核程序设计技术——通过软件多线程提升性能》