x86 上存储到加载转发失败的成本是多少?

2023-11-28

在最新的 x86 架构上,存储到加载转发失败的成本是多少?

特别是,存储到加载转发会失败,因为加载部分与较早的存储重叠,或者因为较早的加载或存储跨越某些导致转发失败的对齐边界。

当然存在延迟成本:它有多大?是否还存在吞吐量成本,例如,失败的存储到负载转发是否使用其他负载和存储甚至其他非内存操作无法使用的额外资源?

当存储的所有部分都来自存储缓冲区时,与混合存储缓冲区和 L1 的情况相比,是否有区别?


这并不是一个完整的答案,但仍然证明惩罚是可见的。

MSVC 2022 基准测试,编译器/std:c++latest.

#include <chrono>
#include <iostream>

struct alignas(16) S
{
    char* a;
    int* b;
};

extern "C" void init_fused_copy_unfused(int n, S & s2, S & s1);
extern "C" void init_fused_copy_fused(int n, S & s2, S & s1);
extern "C" void init_unfused_copy_unfused(int n, S & s2, S & s1);
extern "C" void init_unfused_copy_fused(int n, S & s2, S & s1);

int main()
{
    using namespace std::chrono;

    S s1, s2;
    constexpr int N = 1'000'000'000;
    auto t1 = system_clock::now();
    init_fused_copy_fused(N, s2, s1);
    auto t2 = system_clock::now();
    init_fused_copy_unfused(N, s2, s1);
    auto t3 = system_clock::now();
    init_unfused_copy_fused(N, s2, s1);
    auto t4 = system_clock::now();
    init_unfused_copy_unfused(N, s2, s1);
    auto t5 = system_clock::now();

    std::cout
     << "init fused copy fused     " << duration_cast<duration<double>>(t2 - t1) << "\n"
     << "init fused copy unfused   " << duration_cast<duration<double>>(t3 - t2) << "\n"
     << "init unfused copy fused   " << duration_cast<duration<double>>(t4 - t3) << "\n"
     << "init unfused copy unfused " << duration_cast<duration<double>>(t5 - t4) << "\n";
}
.code

c     db 0
i     dd 0

s     dq byte ptr [c], dword ptr [i]

ALIGN 16
init_fused_copy_fused PROC
    movups      xmm0,xmmword ptr [s]
    movups      xmmword ptr [r8],xmm0

    movups      xmm1,xmmword ptr [r8]
    movups      xmmword ptr [rdx], xmm1

    dec ecx
    jnz init_fused_copy_fused
    ret
init_fused_copy_fused ENDP


ALIGN 16
init_unfused_copy_fused PROC

    lea         rax, byte ptr [c]
    mov         qword ptr[r8], rax
    lea         rax, dword ptr [i]
    mov         qword ptr[r8 + 8], rax

    movups      xmm1,xmmword ptr [r8]
    movups      xmmword ptr [rdx], xmm1

    dec ecx
    jnz init_unfused_copy_fused
    ret
init_unfused_copy_fused ENDP

ALIGN 16
init_fused_copy_unfused PROC
    movups      xmm0,xmmword ptr [s]
    movups      xmmword ptr [r8],xmm0

    mov         rax, qword ptr[r8]
    mov         qword ptr[rdx], rax
    mov         rax, qword ptr[r8 + 8]
    mov         qword ptr[rdx +8], rax

    dec ecx
    jnz init_fused_copy_unfused
    ret
init_fused_copy_unfused ENDP


ALIGN 16
init_unfused_copy_unfused PROC

    lea         rax, byte ptr [c]
    mov         qword ptr[r8], rax
    lea         rax, dword ptr [i]
    mov         qword ptr[r8 + 8], rax

    mov         rax, qword ptr[r8]
    mov         qword ptr[rdx], rax
    mov         rax, qword ptr[r8 + 8]
    mov         qword ptr[rdx +8], rax

    dec ecx
    jnz init_unfused_copy_unfused
    ret
init_unfused_copy_unfused ENDP

END
init fused copy fused     0.664739s
init fused copy unfused   0.935631s
init unfused copy fused   4.34326s
init unfused copy unfused 1.02741s

CPU: Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz 2.21 GHz

我对结果的解释如下:

  • 使用 fused init,转发永远不会失败。融合副本和未融合副本之间的差异在基准误差范围内
  • 使用unfused init,融合副本导致转发失败,造成显着的性能差异
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

x86 上存储到加载转发失败的成本是多少? 的相关文章

  • 各种中断的区别:SCI、SMI、NMI、普通中断

    我正在学习英特尔架构 到目前为止我遇到过几种类型的中断 SCI 系统控制中断 硬件使用的系统中断 用于向操作系统通知 ACPI 事件 SCI 是一个有效 低电平 可共享的电平中断 SMI 系统管理中断 由遗留系统上的中断事件生成的操作系统透
  • 从c调用汇编函数

    我试图从 c 调用汇编函数 但我不断收到错误 text globl integrate type integrate function integrate push ebp mov esp ebp mov 0 edi start loop
  • 是否有适用于双打 (__m128d) 的 Move (_mm_move_ss) 和 Set (_mm_set_ss) 内在函数?

    多年来 我有几次看到 in 中的内在函数float参数被转换为 m128使用以下代码 m128 b mm move ss m mm set ss a 例如 void MyFunction float y m128 a mm move ss
  • 汇编语言程序中连续两次相乘

    我正在使用 8086 模拟器以及 DOSBOX 和 MASM 我知道当我们将 8 位与 8 位相乘时 答案将是 16 位 al 8 bit ax 当我们将 16 位与 16 位相乘时 答案将是 32 位 ax 16 bit dx ax 但如
  • 如何在 AVX/AVX2 中递增向量

    我想使用内在函数来增加 SIMD 向量的元素 最简单的方法似乎是为每个元素加 1 如下所示 note vec inc之前已设置为1 vec mm256 add epi16 vec vec inc 但是是否有任何特殊指令来增加向量 类似于in
  • 气体:内存引用太多

    编译时指令如下 movl 4 ebp 8 ebp I got 内存引用过多 它出什么问题了 括号之前的数字是字节偏移量 这会导致发生内存引用 并且不能有两个movl 您需要先将值暂时移至寄存器 movl 4 ebp ecx movl ecx
  • 英特尔 JCC 勘误表 - 用于缓解的前缀有什么影响?

    Intel 推荐 https www intel com content dam support us en documents processors mitigations jump conditional code erratum pd
  • 为什么将 char 传递给函数会改变它在 c 中的值?

    我目前正在关注本作业簿 http www cs bham ac uk exr lectures opsys 10 11 lectures os dev pdf关于构建操作系统 我的目的是写一个64位内核 我已经在文本模式下加载 内核 代码并
  • 电路解码所需的最小输入位数

    我正在学习计算机体系结构 并且正在阅读有关编码器和解码器的内容 在 MIPS 处理器中 操作码有 6 位 我想知道构建解码器来解码操作码需要多少输入位 我知道解码器是一个组合电路 它将二进制信息从 n 个输入线转换为最多 2 n 个唯一的输
  • 如何通过查看程序集来判断程序是否使用动态调度

    我在 Reddit 上读过一篇文章Herb Stutter JIT 永远不会像原生一样快 http www reddit com r programming comments rr2dj herb stutter jit will neve
  • x86 汇编乘法和除法指令操作数,16 位及更高

    我对 x86 汇编中的乘法和除法运算如何工作感到相当困惑 例如 下面的代码看起来并不太困难 因为处理的是 8 位 8 位乘法 User Input num1 20 num2 15 mov ax num1 moves the 8 bits i
  • 如何使用存储在 x64 位置的 x64 内存地址进行跳转?

    据我所知 使用 64 位地址作为操作数的 jmp 是不可能的 但我相信使用 x64 内存位置是 来自here http www tptp cc mirrors siyobik info instruction JMP htmlJMP r m
  • 使用`esp*scale 时寻址内存时出错

    内存寻址一般形式 发现了here https stuff mit edu afs athena project rhel doc OldFiles 3 rhel as en 3 i386 memory html is base index
  • X86 汇编将小写字母转换为大写字母

    实现toUpper函数 将字符串中的小写字母转换 为大写 该函数采用一个参数 char string 字符串是一个 char类型指针 指向字符串的开头 因为C 样式字符串以零结尾 我们不需要取长度 字符串作为另一个参数 我需要帮助开始 我不
  • 添加饱和 32 位有符号整数内在函数?

    有人可以推荐一种使用 Intel 内在函数 AVX SSE4 添加饱和 32 位有符号整数的快速方法吗 我查看了内在指南并发现 mm256 adds epi16但这似乎只添加 16 位整数 我没有看到 32 位有任何类似的东西 其他电话似乎
  • 返回地址预测堆栈缓冲区与堆栈存储的返回地址?

    一直在阅读 Agner Fog 的 Intel AMD 和 VIA CPU 的微架构 他在第 34 页描述了 返回地址预测 http www agner org optimize microarchitecture pdf http www
  • 段寄存器如何参与内存地址转换?

    到目前为止我所学到的有关细分的知识 虚拟地址包含段选择器和偏移量 段选择器与GDTR配合使用 查找段描述符的线性地址 段描述符保存有关所选段的信息 包括其线性地址 所以 我的问题是 根据我所读到的内容 虚拟地址被加载到段寄存器中 然后以某种
  • (nasm x86实模式)如何在引导加载的扇区中写入/读取字符串?

    我正在使用 NASM 为 x86 实模式编写一个最小操作系统 用于教育目的 我想使用 512 字节引导扇区加载包含操作系统其余部分的更大扇区 我已经成功创建了一个加载另一个扇区的引导扇区 但我似乎无法在加载的扇区中写入 读取字符串 这是我的
  • 2022年Android CPU架构分布(armeabi-v7a vs arm64-v8a)

    有没有关于 2022 年 Android 设备上的架构使用情况的官方信息 我有一个支持armeabi v7a 和arm64 v8a 的应用程序 我想要放弃对armeabi v7a的支持并且仅支持 64 位设备 arm64 v8a 但我找不到
  • __stack_chk_fail_local 和 -fno-stack-protector - 如何让它工作?

    Update 我刚刚发现问题出在我的项目 libxml2 中包含的预构建库上 它是在启用堆栈保护的情况下构建的 因此依赖于 stack chk fail local方法 我现在已经重建了该库 fno stack protector也是 一切

随机推荐

  • React,如何从父级访问子级的状态?无需更新父级的状态

    大家好 我对 React 还很陌生 并且很难理解整个状态管理以及通过状态和 props 传递数据 我确实理解标准的反应方式是以单向方式传递数据 从父级到子级 我已经对所有其他组件这样做了 但我有一个名为 Book 的组件 它根据用户选择形式
  • “any”类型的参数不可分配给“never”类型

    我正在从端点获取图像 但无法将每个映射文件推送到本地数组中 我收到错误Argument of type any is not assignable to type never 我尝试将所有参数设置为blob没有成功 尝试设置function
  • HTML 表格中的自动换行

    我一直在使用word wrap break word将文本换行divs and spans 但是 它似乎不适用于表格单元格 我有一张桌子width 100 一行两列 列中的文本 尽管样式与上述相同word wrap 不换行 它会导致文本超出
  • ScrollViewer 使用 DataGrid 时性能缓慢

    我有以下场景
  • iOS 5.0 中的 Core Image 滤镜对于实时视频处理来说足够快吗?

    现在 Apple 已将 Core Image 框架移植到 iOS 5 0 我想知道 Core Image 是否足够快 可以将实时滤镜和效果应用于相机视频 另外 学习 iOS 5 0 的 Core Image 框架的一个好的起点是什么 现在
  • 属性与函数(特别是.NET)

    我读过一些关于这个主题的讨论 但有一些我不明白的地方 最常见的答案似乎是这样的 使用 ReadOnly 属性返回缓存数据 使用 Function 返回非缓存数据 根本不要使用 WriteOnly 属性 因为 它没有意义 这没有性能原因 在伊
  • PHP 为每个页面添加导航栏技术?

    我正在尝试通过包含文件来合并每个页面的代码来清理我的 php 网页中的代码 如下所示 文件 head php 文件 页脚 php
  • 节点js SMTP错误

    我正在通过我的 godaddy 电子邮件帐户发送电子邮件 为此 我使用 Node js 发送电子邮件 但它给出以下错误 Error getaddrinfo ENOTFOUND code ENOTFOUND errno ENOTFOUND s
  • 如何使用节标题调整 UITableViewController 中 UITableView 的大小

    我在 UITableViewController 中有一个分组的 UITableView 我想水平调整它的大小 我尝试了很多不同的方法 但没有一个是完美的 我尝试过的 1 覆盖 UITableView setFrame 但它没有移动各部分的
  • 保持数据库连接打开的成本是否昂贵?

    我正在与一些软件开发人员开会 他们建议我在我的应用程序代码中尽快关闭数据库连接 有人可以告诉我在应用程序中保持连接打开有什么危害吗 我正在从数据库的单个表中读取数据 把它想象成公共汽车上的座位 当您打开连接时 您会填满这些座位 最终 公共汽
  • 如何在 Google App Engine 启动器启动时禁用自动检查更新?

    我一直在研究 GAE 并且喜欢 Windows SDK 提供的 GAE 启动器的易用性 我的问题是 当我启动应用程序时 它需要很长时间才能响应 这是因为程序在启动应用程序之前首先检查更新 这会导致它在等待响应时挂起 我的问题是我的主要开发计
  • Java - SimpleDateFormat 解析 12:19:00 到 00:19:00

    我正在尝试解析迄今为止的字符串 但输出看起来不正确 下面是我的代码 public static void main String args Date startDate new Date DateFormat formatter new S
  • 如何从 base64 数据 URI 在服务器端保存 PNG 图像

    我正在使用 Nihilogic 的 Canvas2Image JavaScript 工具将画布绘图转换为 PNG 图像 我现在需要的是使用 PHP 将此工具生成的这些 base64 字符串转换为服务器上的实际 PNG 文件 简而言之 我目前
  • mysql ...in where 子句不明确

    SELECT cat CategoryID as CategoryID count p ProductID as CountProducts FROM Category as cat LEFT JOIN Products as p on p
  • WordPress如何使用jquery和$符号

    我在 WordPress 插件中有一个简单的 jQuery 脚本 它使用如下 jQuery 包装器 document ready function jQuery code is in here 我从 WordPress 仪表板中调用此脚本
  • 我可以在 Google Cloud Function 中访问 GraphicsMagick for ImageMagick 吗?

    我想制作一个 Google Cloud Function 来正确设置上传文件的内容类型 我知道如何使用 GraphicsMagick 或 ImageMagick 执行此操作 但我不确定 Google Cloud Function 是否具有这
  • 将对象反序列化为现已签名和版本控制的程序集

    我曾经使用 BinaryFormatter c 序列化树视图 执行此操作并包含所有可序列化类的程序集现在具有强名称并已签名 并且还获得了新的版本号 但是 实现没有改变 当我尝试反序列化 byte 数组时 该行 TreeViewData bi
  • 如何使用 Python 和 Numpy 计算 r 平方?

    我正在使用 Python 和 Numpy 来计算任意次数的最佳拟合多项式 我传递 x 值 y 值和我想要拟合的多项式次数 线性 二次等 的列表 这很有效 但我还想计算 r 相关系数 和 r 平方 确定系数 我将我的结果与 Excel 的最佳
  • javascript 检查结束日期是否大于或等于开始日期

    是否可以检查 Javascript 中的结束日期是否大于或等于开始日期 我的日期是格式为 dd mm yyyy 的字符串 try this var startDate 05 01 2011 var endDate 09 01 2011 va
  • x86 上存储到加载转发失败的成本是多少?

    在最新的 x86 架构上 存储到加载转发失败的成本是多少 特别是 存储到加载转发会失败 因为加载部分与较早的存储重叠 或者因为较早的加载或存储跨越某些导致转发失败的对齐边界 当然存在延迟成本 它有多大 是否还存在吞吐量成本 例如 失败的存储