X86 什么是;“序列化操作”;在sfence文档中是什么意思?

X86 什么是;“序列化操作”;在sfence文档中是什么意思?,x86,memory-fences,memory-barriers,X86,Memory Fences,Memory Barriers,forsfence的命令说: 对所有存储到内存指令执行序列化操作 在SFENCE指令之前发布的 “序列化操作”是什么意思 这是否意味着确保在sfence指令之前发出的所有存储到内存指令都已完成,然后在sfence之后继续执行这些指令?sfence确保在任何后续存储之前,程序顺序中的所有先前存储都是全局可见的在程序中,顺序变得全局可见。与你所写的相比,有两个不同之处。首先,sfence不会序列化先前发布的存储;它序列化所有以前的存储,无论它们是否已发布。第二,它只针对所有后续存储进行序列化;并不是

for
sfence
的命令说:

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

“序列化操作”是什么意思


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

sfence
确保在任何后续存储之前,程序顺序中的所有先前存储都是全局可见的在程序中,顺序变得全局可见。与你所写的相比,有两个不同之处。首先,
sfence
不会序列化先前发布的存储;它序列化所有以前的存储,无论它们是否已发布。第二,它只针对所有后续存储进行序列化;并不是所有后来的指示。这就是
sfence
上下文中“序列化操作”的含义

您只引用了文档中的第一句话,但每句话都很重要。

英文单词:

  • 以一系列而不是同时发生的
  • 计算机。
    a) 属于或关于数据处理操作的表面或实际性能,一次一个(区别于 平行)

    b) 属于或关于信息的传输或处理 序列中整体的一部分,如一个字节的每一位或一个字节的每一个字节 计算机字(与平行字不同)

  • (也可能意味着将对象表示转换为可存储到磁盘或通过程序外部网络发送的位流或字节流。但这不是
    sfence
    上下文中适用的含义)

    数据库是一个更密切相关的概念


    SFENCE订购早期门店相对于SFENCE本身的全局可见性,以及后期门店的全局可见性序列化=对事物施加顺序,防止它们重叠或并行发生。


    请注意,在英特尔术语中,“串行化指令”有一个特殊的含义:在执行任何后续指令之前刷新存储缓冲区和无序指令管道的指令。(它们可以解码,甚至可以发送到无序内核中,但不能执行)

    sfence
    在这个意义上不是“序列化指令”;它只订购NT商店和普通商店。(常规存储已经相互排序,因此如果没有NT存储在运行中,
    sfence
    将无效。正确的发布语义只需将常规存储按正确的顺序排列,例如使用编译器屏障停止编译时重新排序。)

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


    的当前措辞:

    英特尔将开头的一段改写为“订单”,而不是“序列化”,除了简短的描述:序列化存储操作

    主要说明如下:

    在SFENCE指令之前,相对于所有内存存储命令处理器执行。处理器确保SFENCE之前的每个存储在SFENCE之后的任何存储变为全局可见之前都是全局可见的。SFENCE指令是根据内存存储、其他SFENCE指令、MFENCE指令和任何串行化指令(如CPUID指令)排序的。它不是根据内存加载或LFENCE指令排序的


    不过,第一句话还是有点假。执行没有顺序,只提交到L1d缓存。

    一个
    sfence
    阻止围栏前的存储相对于围栏后的存储重新排序。就这样。不要关注“序列化”部分:英特尔已经删除了您从当前版本的手册中引用的文本(您链接了一个过时的源代码)

    第1条(我的重点):

    命令处理器执行相对于存储之前的所有内存存储 SFENCE指令处理器确保每个存储在 SFENCE在SFENCE之后的任何存储之前都是全局可见的 全局可见。SFENCE指令的顺序与 内存存储、其他SFENCE指令、MFENCE指令和任何 序列化指令(如CPUID指令)。事实并非如此 根据内存加载或LFENCE指令排序

    弱有序内存类型可用于实现更高的处理器性能 通过无序问题等技术实现性能, 写入合并和写入折叠。消费者的消费程度 数据类型识别或知道数据是弱有序的 在应用程序中,此数据的生产者可能不知道。 SFENCE指令提供了一种性能高效的 确保在产生弱有序的例程之间进行存储排序 使用此数据的结果和例程

    第二条(强调的)线是关键:这家伙在那里订购商店

    它(不一定)能让存储更快地变得可见——这在像x86这样的连贯体系结构上是很自然的。它不一定要序列化围栏周围的指令,包括存储:它只是确保存储没有明显地跨屏障重新排序

    但这里有一个秘密:这条指令在x86代码中基本上是无用的。x86内存模型已经保证了正常的存储已经相互精确地排序:来自给定CPU的存储将以程序顺序显示给所有其他CPU,因此
    sfence
    不会添加任何内容。唯一的例外