2

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

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

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

4

1 回答 1

8

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

然而,在多 CPU 系统的情况下,现在几乎所有这些系统都是 NUMA,通常每个 CPU 内存组的访问成本在“本地”和“远程”内存之间略有不同,因此拥有一个- 只读数据的CPU副本,放置在其本地内存库中。

内存映射由操作系统控制,所以如果你走这条路,研究你的操作系统的 NUMA 相关行为是有意义的。例如,Linux 使用 first-touch 内存分配策略,这意味着内存映射不是在程序第一次访问内存页面时发生,malloc而是在程序第一次访问内存页面时发生,操作系统会尝试从本地银行分配物理内存。

并且通常的性能座右铭适用:衡量,不要猜测。

于 2012-11-19T09:31:19.917 回答