我正在用C++编写一个应用程序,它需要从同一内存中多次从多个线程中进行只读。我的问题是,从性能的角度来看,是为每个线程复制内存更好,还是为所有线程提供相同的指针并让所有线程访问相同的内存。
谢谢
发布于 2012-05-24 16:50:27
从你给出的关于你的目标系统等等的一些信息中没有明确的答案,但在一台普通的PC上,最快的可能是不复制。
复制可能很慢的一个原因是,如果数据区域很大,它可能会导致高速缓存未命中。普通的PC会在线程之间非常有效地缓存对同一数据区域的只读访问,即使这些线程恰好运行在不同的内核上。
英特尔为其缓存方法明确列出的优势之一是"Allows more data-sharing opportunities for threads running on separate cores that are sharing cache"。也就是说,它们鼓励您不必编写线程来显式缓存数据的实践,CPU将为您做这件事。
发布于 2012-05-24 17:04:37
由于您特别提到了许多线程,因此我假设您至少有一个多套接字系统。通常,内存条与处理器插槽相关联。也就是说,一个处理器离它自己的内存库“最近”,需要与其他处理器内存控制器通信,以访问其他内存库上的数据。(这里的处理器指的是插座中的物理设备)
在分配数据时,通常会使用第一次写入策略来确定将在哪些内存块上分配数据,这意味着它可以比其他处理器更快地访问数据。
因此,至少对于多处理器(而不仅仅是多核)来说,至少应该为每个处理器分配一个副本,从而提高性能。请确保使用每个处理器/线程分配/复制数据,而不是从主线程分配/复制数据(以利用第一次写入策略)。此外,您还需要确保线程不会在处理器之间迁移,因为这样可能会丢失与内存的紧密连接。
我不确定,为单个处理器上的每个线程复制数据会如何影响性能,但我猜不复制可以提高共享更高级别缓存内容的能力,这些内容在内核之间共享。
在任何情况下,都要根据实际测量结果进行基准测试和决策。
https://stackoverflow.com/questions/10734080
复制相似问题