什么"序列化操作"在sfence文档中意味着什么?

时间:2018-05-23 05:34:30

标签: x86 memory-fences memory-barriers

sfence的{​​{3}}说:

  

对所有存储到存储器指令执行序列化操作   在SFENCE指令之前发布的。

"序列化操作"意思?

是否确保在sfence 之后继续执行指令之前确保sfence指令之前发出的所有存储到内存指令都已完成?

2 个答案:

答案 0 :(得分:3)

英文单词Serial - adjective form

  
      
  1. 发生在一系列而不是同时发生
  2.         

         
        
    1. 计算机。
        a)一次一个地显示或实际执行数据处理操作(或与之相关)   平行)。

           

      b)每种传输或处理的或与之相关的   整个序列的一部分,作为一个字节的每个位或一个字节的每个字节   计算机词(区别于并行)。

    2.   

Serialization也可以意味着将对象表示转换为比特流或字节流,可以存储到磁盘或通过程序外的网络发送。但是不是sfence)的背景下适用的含义。

数据库https://en.wikipedia.org/wiki/Serializability是一个更密切相关的概念。

SFENCE根据SFENCE本身以及后来的商店订购早期商店的全球可见性。 序列化=对事物强加订单,阻止它们重叠或并行发生。

请注意,在英特尔术语中,“序列化指令”具有特殊含义:在任何后续指令执行之前刷新存储缓冲区无序指令流水线的指令。 (它们可以解码,甚至可以发布到无序核心,但不执行)。 How many memory barriers instructions does an x86 CPU have?

在这个意义上,

sfence 是一个“序列化指令”;它只相对于彼此和常规商店订购NT商店。 (常规商店已经相互订购,所以sfence如果没有正在运行的NT商店则没有效果。正确发布语义所需要的只是按正确的顺序放置常规商店,例如编译器阻止停止编译时重新排序。)

英特尔对sfence的定义中的“序列化”只是该术语的简单英语含义,而不是“序列化指令”x86的特殊含义。

Intel's ISA ref manual entry for sfence 的当前措辞:

英特尔重写了开头段落,说“订单”而不是“序列化”,除了简短描述:序列化商店运营。

主要描述是:

  

在SFENCE指令之前对相对于所有存储器的处理器执行进行排序。在SFENCE全局可见之后,处理器确保SFENCE之前的每个商店在任何商店之前全局可见。 SFENCE指令按照存储器存储,其他SFENCE指令,MFENCE指令和任何序列化指令(例如CPUID指令)进行排序。它不是针对内存加载或LFENCE指令进行排序的。

但是,第一句话仍然是一种伪造。 执行未订购,仅提交到L1d缓存。

答案 1 :(得分:2)

sfence阻止围栏之前的商店在围栏之后对商店进行重新订购。而已。不要专注于“序列化”部分:英特尔已删除了您从当前版本的手册中引用的文本(您链接了过时的来源)。

new text says 1 (强调我的):

  

将处理器执行命令相对于之前的所有内存存储   SFENCE指令。 处理器确保每个商店之前   在SFENCE成为之后,SFENCE在任何商店之前全局可见   全局可见。 SFENCE指令是针对的   内存存储,其他SFENCE指令,MFENCE指令等等   序列化指令(例如CPUID指令)。它不是   按内存加载或LFENCE指令排序。

     

弱排序的内存类型可用于实现更高的处理器   通过诸如无序问题之类的技术表现,   写入组合和写入崩溃。消费者的程度   数据识别或知道数据的弱有序变化   应用程序之间,这些数据的生产者可能不知道。   SFENCE指令提供了一种性能有效的方法   确保产生弱排序的例程之间的商店排序   使用此数据的结果和例程。

第二条(强调)线是关键:这些人可以订购商店。

它不一定(必然)使商店更快 - 这在x86这样的连贯架构中自然会发生。它不一定序列化围栏周围的指令,包括商店:它只是确保商店没有明显重新排序穿过障碍。

这是一个秘密:这条指令在x86代码中几乎没用。 x86内存模型已经保证正常存储已经相互精确排序:来自给定CPU的存储按程序顺序显示给所有其他CPU,因此sfence不会添加任何东西sfence可能有用的唯一例外是non-temporal stores之类的相对模糊的东西,或WC内存类型等非常模糊的东西。如果您不使用它,则不需要此指令。

1 我还链接了一个非官方的消息来源,因为我没有知道正式的HTML源代码 - 但我检查它是sfence的最新版本截至2018年5月。