在核心之间共享数据的最有效方法

时间:2012-04-08 19:28:09

标签: c linux multithreading multiprocessing x86-64

在多个核心之间共享数据的效率最高。当然你可以使用共享内存,但也需要付出代价。假设一个核心不断写入变量,而另一个核心必须不断地从中读取。使用MESI高速缓存一致性协议,写入内核将使读取内核不时地使其高速缓存无效。因此,在这种情况下,共享数据的最有效方式是什么。

3 个答案:

答案 0 :(得分:3)

在典型的共享内存计算机上,您描述的方案可能已经是最有效的方法:

  • 核心A写入内存位置。使Core B的副本无效。
  • Core B从内存或Core A的缓存中获取数据。

无论哪种方式,数据必须从Core A发送到Core B.现代处理器中的Cache一致性有时会支持直接缓存到缓存的传输而不会一直到内存。


您希望避免(尽可能)过度锁定共享资源。这将增加两个方向的缓存一致性流量(和延迟)。

答案 1 :(得分:0)

一种常见且通用的方法是尽可能使用每核数据结构。

例如,在生产者 - 消费者场景中,每个消费者处理器都可以拥有队列的一部分并对其进行操作。只有当他们用完工作项时,他们才能联系生产者处理器。

当然,这并不总是可行,但如果工作项可以通过这种方式构建,则可以减少核心之间的相互依赖性,并使应用程序可以扩展到核心数量。

此技术已在Solaris OS中广泛使用。有关详细信息,请参阅Multicore Application Programming: for Windows, Linux, and Oracle Solaris

答案 2 :(得分:0)

这取决于你能忍受的陈旧程度(请告诉我们)。

如果您需要更新以尽快传播,这已经是最有效的解决方案。如果您可以容忍毫秒或秒的过期数据,则可以为每个核心使用不同的内存位置,并使用计时器进行同步。