首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存访问与内存复制

内存访问与内存复制
EN

Stack Overflow用户
提问于 2012-05-24 16:48:06
回答 2查看 303关注 0票数 6

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

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-24 16:50:27

从你给出的关于你的目标系统等等的一些信息中没有明确的答案,但在一台普通的PC上,最快的可能是不复制。

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

英特尔为其缓存方法明确列出的优势之一是"Allows more data-sharing opportunities for threads running on separate cores that are sharing cache"。也就是说,它们鼓励您不必编写线程来显式缓存数据的实践,CPU将为您做这件事。

票数 6
EN

Stack Overflow用户

发布于 2012-05-24 17:04:37

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

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

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10734080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档