与线程相关的开销
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行中进行存放,避免伪共享问题(如可以将共享只读的数据和可写的数据分离开)
整理自《多核程序设计技术——通过软件多线程提升性能》