6

我正在用 C++ 编写一个应用程序,该应用程序需要从多个线程中多次从同一内存中只读。我的问题是从性能的角度来看,为每个线程复制内存或为所有线程提供相同的指针并让它们都访问相同的内存会更好。

谢谢

4

2 回答 2

6

您提供的有关目标系统等的少量信息没有明确的答案,但在普通 PC 上,最快的可能是不复制。

复制速度可能很慢的一个原因是,如果数据区域很大,它可能会导致缓存未命中。普通 PC 会在线程之间非常有效地缓存对同一数据区域的只读访问,即使这些线程碰巧在不同的内核上运行。

英特尔明确列出的缓存方法的好处之一是“允许在共享缓存的单独内核上运行的线程有更多的数据共享机会”。即他们鼓励您不必对线程进行编程以显式缓存数据的做法,CPU 会为您完成。

于 2012-05-24T08:50:26.590 回答
1

由于您特别提到了许多线程,我假设您至少有一个多插槽系统。通常,内存条与处理器插槽相关联。也就是说,一个处理器离它自己的内存库“最近”,并且需要与其他处理器的内存控制器通信以访问其他内存库上的数据。(这里的处理器是指套接字中的物理事物)

当您分配数据时,通常使用先写入策略来确定您的数据将被分配到哪些内存库,这意味着它可以比其他处理器更快地访问它。

因此,至少对于多个​​处理器(不仅仅是多个内核)来说,至少为每个处理器分配一个副本应该会提高性能。确保使用每个处理器/线程而不是从主线程分配/复制数据(利用首次写入策略)。您还需要确保线程不会在处理器之间迁移,因为那样您可能会失去与内存的紧密连接。

我不确定,为单个处理器上的每个线程复制数据会如何影响性能,但我想不复制可以提高共享更高级别缓存内容的能力,这些缓存在内核之间共享。

In any case, benchmark and decide based on actual measurements.

于 2012-05-24T09:04:36.547 回答