C#易失性和互锁性如何影响cpu缓存

C#易失性和互锁性如何影响cpu缓存,c#,clr,atomic,cpu-architecture,coreclr,C#,Clr,Atomic,Cpu Architecture,Coreclr,我试图了解c#中的易失性读/写和互锁操作是如何影响处理器缓存的 我在一些地方读到,这两种操作都会刷新处理器缓存。我想知道这是不是真的 如果他们刷新缓存,他们是如何做到的。例如,使用了哪些装配说明 如果刷新缓存,执行cpu的整个缓存是否会被刷新?或者只是缓存线 如果他们刷新缓存,会如何影响其他处理器的缓存?它们是否使其他cpu缓存失效,以便在其他处理器中执行的代码通过非易失性读取获得更新的值 我在网上找不到太多关于这方面的信息。我对汇编语言很在行,所以我自己都搞不懂。A请仔细考虑这一点。缓

我试图了解c#中的易失性读/写和互锁操作是如何影响处理器缓存的

  • 我在一些地方读到,这两种操作都会刷新处理器缓存。我想知道这是不是真的

  • 如果他们刷新缓存,他们是如何做到的。例如,使用了哪些装配说明

  • 如果刷新缓存,执行cpu的整个缓存是否会被刷新?或者只是缓存线

  • 如果他们刷新缓存,会如何影响其他处理器的缓存?它们是否使其他cpu缓存失效,以便在其他处理器中执行的代码通过非易失性读取获得更新的值


  • 我在网上找不到太多关于这方面的信息。我对汇编语言很在行,所以我自己都搞不懂。A请仔细考虑这一点。

    缓存是一致的,不需要刷新其他内核就可以看到我们跨多个线程运行的所有CPU内核上的存储(请参阅)。也还可以。所以原子操作没有理由刷新它们操作的缓存线


    1。为false。联锁操作将存储缓冲区刷新到缓存,这是内存排序的完全障碍,但之后不要从缓存中逐出该行。重复的
    锁添加[mem],1
    (x86 Interlockedd)可以在缓存中命中

    volatile
    存储类似,但不是RMW。
    volatile
    加载对缓存的影响不会超过普通加载的影响。我不知道C#
    volatile
    存储是否刷新存储缓冲区,或者它们是否只是
    释放
    (不是
    seq_cst
    )排序。这个答案的其余大部分适用于volatile和interlocated,但我在写它时只考虑了原子RMW。)

    联锁操作完成后,线路将在此核心缓存中处于修改状态。(尽管当原子RMW将线路归该核所有时,如果另一个核的线路请求到达,在RMW完成时,可能会将MESI状态更改为共享或无效,但这可能是由于处理的另一个核的请求,而不是由于联锁操作本身。)这意味着它将在所有其他核心的私有缓存中无效

    (微软的“Interlocked*”函数很简单(在x86上)使用
    前缀对指令进行包装,因此您所读到的关于它们的所有内容都适用,并阻止编译时对操作进行重新排序,即使它是内联的。如果C#联锁操作与同名的Windows C函数不完全相同,这个答案可能需要完全正确,但我希望它们遵循相同的顺序为相同的命名函数设计,因为使用seq_cst排序的原子RMW是一件非常标准的事情。)

    请参阅-x86有一个“强”内存模型,弱顺序机器上的互锁函数是原子RMW+完全屏障,就像x86上一样。(但是需要多个指令来实现这一过程,其中的障碍与原子RMW分开)。C++类似于> >记忆yOrthOrth-SEQJCST < /代码>操作。
    有关存储缓冲区以及CPU为什么需要它们的更多信息,请参阅。自然创建存储缓冲区(x86所允许的唯一类型,也是最昂贵的阻止类型)。

    1。这是错误的。它们将存储缓冲区刷新为缓存。缓存是一致的,不需要刷新其他内核就可以看到您的存储。还行。(Microsoft的“Interlocked*”函数只是(在x86上)带有
    锁前缀的指令的包装器,因此您读到的关于它们的所有内容都适用,并阻止编译时围绕操作重新排序,即使它是内联的。)感谢您的详细解释。是的,这消除了这种困惑。那么,是否只有互锁操作才能将存储缓冲区刷新到缓存中(而不是易失性写入)?@ThanujaDilhan:根据,
    volatile
    保证按顺序查看易失性写入(So)。该文档没有提到任何需要耗尽存储缓冲区的内容(如顺序一致性),甚至说不保证单个总订单。IIRC、MSVC++
    volatile
    基本上只是
    发布
    ,因此这与他们在C中给出的含义一致。(历史上在MSVC++中,<代码> Value只是没有编译时的重新排序,包括其他非易失性访问(ISO C++不需要)。在x86中,由于强大的硬件内存模型,它在MSVC++中获得了获取/释放语义。当然,在其他编译器中,没有这样扩展C++的易失性。但是,如果C的设计选择/命名受到MSVC++的怪异影响,我也不会感到惊讶。