共享内存多线程和数据访问?

use*_*128 2 c++ performance multithreading caching

关于性能,假设我们获得了每个线程可以频繁访问的数据块,并且这些数据是只读的,这意味着线程除了读取数据之外不会做任何事情.

那么为每个线程创建这些数据的一个副本(假设数据是只读的)是否有益?

如果所有线程共享频繁访问的数据(而不是每个线程一个副本),这是否会增加这些数据被正确缓存的可能性?

Ale*_*nov 8

每个线程只读一份数据副本对缓存没有帮助; 恰恰相反,当线程在相同的多核(并且可能是超线程)CPU上执行并因此共享其缓存时,它可能会受到伤害,因为在这种情况下,数据的每线程副本可能竞争有限的缓存空间.

但是,在多CPU系统的情况下,现在几乎所有这些都是NUMA,通常每个CPU内存库的"本地"和"远程"内存之间的访问成本有所不同,有一个是有益的. -CPU只读数据的副本,放在其本地存储库中.

内存映射由操作系统控制,因此如果你走这条路,研究操作系统的NUMA相关行为是有意义的.例如,Linux使用第一触摸内存分配策略,这意味着内存映射不会发生,malloc但是当程序第一次访问内存页时,OS会尝试从本地银行分配物理内存.

通常的表现格言适用:衡量,不要猜测.