我正在用C ++编写一个应用程序,需要从许多线程中多次从同一内存中只读。 我的问题是从性能的角度来看,最好是为每个线程复制内存,或者为所有线程提供相同的指针,让所有线程访问相同的内存。
由于
答案 0 :(得分:6)
您提供的有关目标系统等的小信息没有明确的答案,但在普通PC上,最快的可能是不复制。
复制可能很慢的一个原因是,如果数据区很大,可能会导致缓存未命中。普通的PC会在线程之间非常有效地缓存对同一数据区域的只读访问,即使这些线程碰巧在不同的内核上运行。
英特尔明确列出的缓存方法之一是"Allows more data-sharing opportunities for threads running on separate cores that are sharing cache"。即他们鼓励你不必编写线程来显式缓存数据的做法,CPU会为你做。
答案 1 :(得分:1)
由于您特别提到了许多线程,我假设您至少拥有一个多插槽系统。通常,存储体与处理器插座相关联。也就是说,一个处理器“离它自己的存储体”最近,并且需要与其他处理器的存储控制器通信以访问其他存储体上的数据。 (此处处理器表示套接字中的物理内容)
当您分配数据时,通常使用第一个写入策略来确定您的数据将分配到哪个内存库,这意味着它可以比其他处理器更快地访问它。
因此,至少对于多个处理器(不仅仅是多个内核),至少应为每个处理器分配一个副本,从而提高性能。确保使用每个处理器/线程分配/复制数据,而不是从主线程分配/复制数据(以利用第一次写入策略)。此外,您需要确保线程不会在处理器之间迁移,因为这样您很可能会失去与内存的紧密连接。
我不确定,如何复制单个处理器上每个线程的数据会影响性能,但我想不是复制可以提高共享核心之间共享的更高级别缓存内容的能力。
在任何情况下,基准并根据实际测量结果确定。