内存访问与内存复制

memory access vs. memory copy

本文关键字:内存 复制 访问      更新时间:2023-10-16

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

谢谢

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

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

英特尔为其缓存方法明确列出的优势之一是"为在共享缓存的不同内核上运行的线程提供更多数据共享机会"。 也就是说,他们鼓励一种实践,您不必对线程进行编程来显式缓存数据,CPU 会为您完成。

由于您特别提到了许多线程,因此我假设您至少有一个多插槽系统。通常,内存插槽与处理器插槽相关联。也就是说,一个处理器"最接近"自己的内存库,需要与其他处理器通信记忆控制器才能访问其他内存库上的数据。(这里的处理器是指插槽中的物理东西)

分配数据时,通常使用首次写入策略来确定将在哪些内存上分配数据,这意味着它可以比其他处理器更快地访问数据。

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

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

在任何情况下,都要根据实际测量结果进行基准测试和决定。