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

C 在核心之间共享数据的最有效方式,c,linux,multithreading,multiprocessing,x86-64,C,Linux,Multithreading,Multiprocessing,X86 64,在多个核之间共享数据最有效的方法是什么。当然,您可以使用共享内存,但这也是有代价的。假设一个核不断地向变量写入数据,而另一个核必须不断地从中读取数据。使用MESI缓存一致性协议,写入内核将导致读取内核不时使其缓存失效。在这个场景中,共享数据的最有效方式是什么。在典型的共享内存机器上,您描述的场景可能已经是最有效的方法了: 核心A写入内存位置。使核心B的副本无效 核心B从内存或核心A的缓存中获取数据 无论哪种方式,数据都必须从核心A发送到核心B。现代处理器中的缓存一致性有时会支持直接缓存到缓存

在多个核之间共享数据最有效的方法是什么。当然,您可以使用共享内存,但这也是有代价的。假设一个核不断地向变量写入数据,而另一个核必须不断地从中读取数据。使用MESI缓存一致性协议,写入内核将导致读取内核不时使其缓存失效。在这个场景中,共享数据的最有效方式是什么。

在典型的共享内存机器上,您描述的场景可能已经是最有效的方法了:

  • 核心A写入内存位置。使核心B的副本无效
  • 核心B从内存或核心A的缓存中获取数据
无论哪种方式,数据都必须从核心A发送到核心B。现代处理器中的缓存一致性有时会支持直接缓存到缓存的传输,而不会一直传输到内存



您想要避免的(只要可能)是对共享资源的过度锁定。这将在两个方向上增加缓存一致性通信量(和延迟)。

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

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

当然,这并不总是可能的,但是如果工作项可以以这种方式进行架构,它将减少核心之间的相互依赖性,并允许应用程序扩展到核心的数量


此技术已在Solaris操作系统中广泛使用。有关更多信息,请参阅。

这取决于您能容忍的陈腐程度(请告诉我们)


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

我读到的是,MESI协议不进行缓存到缓存的传输,而MESI是Intel处理器使用的protcol。AMD通过使用MOESI协议实现了这一点,但缺点是,当缓存处于干净共享状态时,内存会出现读取。据我所知,现代处理器实现的协议比这更复杂。它们都是基于MESI及其变体,但通常更为复杂。例如,Power7有一个13状态一致性协议。我不确定英特尔到底使用了什么(因为它可能是专有的),但根据我所读到的,它有一种窥探机制……基本上,我想说的是,依赖硬件缓存一致性可能是在共享内存机器上共享数据的最快(也是唯一)方式。在分布式计算机上,您没有此选项,因此需要处理消息传递。那么,这就是您所能做的最好的了。