从 x86 CPU 生成 64 字节读取 PCIe TLP

2023-12-05

将数据写入 PCIe 设备时,可以使用写入组合映射来提示 CPU 应生成针对该设备的 64 字节 TLP。

是否可以对读取做类似的事情?以某种方式提示 CPU 读取整个缓存行或更大的缓冲区,而不是一次读取一个字?


英特尔有关于从视频 RAM 复制到主内存的白皮书;这应该类似,但要简单得多(因为数据适合 2 或 4 个向量寄存器)。

它表示 NT 加载会将整个缓存行数据从 WC 内存拉入 LFB:

普通加载指令以与指令请求大小相同的单位从 USWC 内存中提取数据。相比之下,诸如 MOVNTDQA 之类的流式加载指令通常会将完整的高速缓存行数据拉到 CPU 中的特殊“填充缓冲区”。随后的流加载将从该填充缓冲区中读取,从而产生更少的延迟。

使用AVX2_mm256_stream_load_si256()或 SSE4.1/AVX1 128 位版本。

填充缓冲区是有限的资源,因此您肯定希望编译器生成 asm,它可以连续执行 64 字节缓存行的两个对齐加载,then存储到常规内存中。

如果您一次处理多个 64 字节块,请参阅 Intel 的白皮书,了解有关使用在 L1d 中保持热状态的小型反弹缓冲区的建议,以避免将存储与 NT 负载混合到 DRAM。 (L1d 驱逐到 DRAM,就像 NT 存储一样,也需要行填充缓冲区,LFB)。


注意_mm256_stream_load_si256()没用at allWC 以外的内存类型。 NT 提示在当前硬件上被忽略,但与常规负载相比,它无论如何都会花费额外的 ALU uop。有prefetchnta,但那是完全不同的野兽。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 x86 CPU 生成 64 字节读取 PCIe TLP 的相关文章

  • 如何将 IA32 'cmp' 指令转换为 Y86?

    IA32 to Y86 ATT组装 我有以下 IA32 汇编代码 Bubble LFB0 pushl esi pushl ebx movl 16 esp esi movl 12 esp edx subl 1 esi andl esi esi
  • 逆向工程的汇编语言[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何使用 Java 确定 Windows 是 32 位还是 64 位体系结构?

    如何使用 Java 确定 Windows 是 32 位还是 64 位体系结构 我不太相信读取 os arch 系统变量 如果用户在 64 位系统上运行 64 位 JVM 则它可以工作 如果用户在 64 位系统上运行 32 位 JVM 则它不
  • 调用always_inline‘_mm_mullo_epi32’时内联失败:目标特定选项不匹配

    我正在尝试使用 cmake 编译 C 程序 该程序使用 SIMD 内在函数 当我尝试编译它时 出现两个错误 usr lib gcc x86 64 linux gnu 5 include smmintrin h 326 1 错误 调用alwa
  • x86 分页如何工作?

    这个问题旨在填补有关该主题的优质免费信息的真空 我相信一个好的答案将适合一个大的 SO 答案 或者至少适合几个答案 主要目标是为初学者提供足够的信息 以便他们可以自己阅读本手册 并能够理解与分页相关的基本操作系统概念 建议指南 answer
  • 如何正确确定Intel处理器的-march和-mtune?

    我目前正在从源代码构建一个对我来说性能至关重要的软件 因此 我想对其进行优化 以便在我的特定 Intel CPU 上运行 构建过程要求我设置 march 和 mtune 标志 如果在我的处理器节点上我使用 gcc march native
  • 编写 AMD64 SysV 程序集时使用哪些寄存器作为临时寄存器?

    我正在使用实现一个功能cpuid根据 AMD64 SysV ABI 进行组装 我需要在函数本身中使用 2 个临时寄存器 第一个用于累积返回值 第二个用作计数器 我的功能目前如下所示 zero argument function some c
  • 如何让c代码执行hex机器代码?

    我想要一个简单的 C 方法能够在 Linux 64 位机器上运行十六进制字节码 这是我的 C 程序 char code x48 x31 xc0 include
  • 在 x86 Intel VT-X 非根模式下,是否可以在每个指令边界传递中断?

    除了不将中断传送到虚拟处理器的某些正常指定条件 cli if 0 等 之外 客户机中的所有指令实际上都是可中断的吗 也就是说 当传入的硬件中断先传递给 LAPIC 然后传递给处理器时 据说会发生一些内部魔法 将其转换为虚拟中断给来宾 使用虚
  • NASM 轮班操作员

    您将如何在寄存器上进行 NASM 中的位移位 我读了手册 它似乎只提到了这些操作员 gt gt lt lt 当我尝试使用它们时 NASM 抱怨移位运算符处理标量值 您能解释什么是标量值并举例说明如何使用 gt gt and lt lt 另外
  • Visual Studio 2017 上的简单装配程序

    386 model flat c stack 100h printf PROTO arg1 Ptr Byte data msg1 byte Hello World 0Ah 0 code main proc INVOKE printf ADD
  • 奇怪的 MSC 8.0 错误:“ESP 的值未在函数调用中正确保存...”

    我们最近尝试将一些 Visual Studio 项目分解为库 并且在测试项目中一切似乎都编译和构建得很好 其中一个库项目作为依赖项 然而 尝试运行该应用程序给我们带来了以下令人讨厌的运行时错误消息 运行时检查失败 0 ESP 的值未在函数调
  • 近调用/跳转表并不总是在引导加载程序中工作

    一般问题 我一直在开发一个简单的引导加载程序 并在某些环境中偶然发现了一个问题 在这些环境中 此类指令不起作用 mov si call tbl SI Call table pointer call call tbl Call print c
  • 从汇编程序获取命令行参数

    通读 专业汇编语言书籍 似乎它提供了用于读取命令行参数的错误代码 我纠正了一点 现在它从段错误变成了读取参数计数 然后是段错误 这是完整的代码 data output1 asciz There are d params n output2
  • “rep stos”x86 汇编指令序列有什么作用?

    我最近偶然发现了以下汇编指令序列 rep stos dword ptr edi For ecx重复 存储内容eax到哪里edi指向 递增或递减edi 取决于方向标志 每次 4 个字节 通常 这用于memset型操作 通常 该指令简单地写成r
  • AVX-512 指令编码 - {er} 含义

    在 Intel x86 指令集参考中 有许多 AVX 512 指令在指令中具有可选的 er 例如 VADDPD 的一种形式定义为 EVEX NDS 512 66 0F W1 58 r VADDPD zmm1 k1 z zmm2 zmm3 m
  • linux x86 汇编语言 sys_read 调用的第一个参数应为 0 (stdin)

    我正在编写一个简单的汇编程序来从标准输入读取 如 scanf 这是我的代码 section bss num resb 5 section txt global start start mov eax 3 sys read mov ebx 0
  • X86 预取优化:“计算 goto”线程代码

    我有一个相当重要的问题 我的计算图有循环和多个 计算路径 我没有制作一个调度程序循环 其中每个顶点将被一一调用 而是将所有预先分配的 框架对象 放置在堆中 代码 数据 这有点类似于线程代码 甚至更好 CPS 只是在堆中跳转 执行代码 每个代
  • 为什么 FMA _mm256_fmadd_pd() 内在函数有 3 个 asm 助记符:“vfmadd132pd”、“231”和“213”?

    有人可以向我解释一下为什么融合乘法累加指令有 3 种变体 vfmadd132pd vfmadd231pd and vfmadd213pd 而只有一个 C 内在函数 mm256 fmadd pd 为了简单起见 在 AT T 语法中 有什么区别
  • 在 x86 程序集中存储大量布尔值的最佳方法是什么?

    最近我一直在处理充满布尔值的大型数组 目前 我将它们存储在 bss部分有一个 space指令 它允许我创建字节数组 但是 由于我只需要存储布尔值 因此我希望从数组中逐位读取和写入数据 目前 我能想到的最好方法是有一个 space指令所需存储

随机推荐

  • 如何为包装 TableRow 的类指定/定义编码器

    我定义了一个类来包装com google api services bigquery model TableRow类将其定义为内部成员 public class TableRowWrapper implements Serializable
  • 结构填充

    我试图将文件中的数据块直接读取到结构中 但填充导致读取太多数据并且数据未对齐 我是否必须手动将每个部分读入结构中 或者是否有更简单的方法来执行此操作 My code 结构体 typedef unsigned char byte struct
  • 如何在backbone.js中通过全局变量创建集合?

    我在 stackoverflow 上得到了很多顾问的帮助 我的部分问题得到了解决 但还有一些问题仍然存在 我查阅了答案 并尝试解决问题 因为我理解了 javascript 命名空间模式 避免污染全局命名空间的命名空间模式 有关此命名空间模式
  • 闪亮的允许用户选择要显示的列

    我正在涉足闪亮的数据表功能 我有兴趣创建一个井面板或侧面板 列出数据表的所有列 并允许用户选择他们想要在数据表上看到的列 现在下面的代码显示玩具数据集的所有列mtcars library shiny runApp list ui basic
  • Sklearn MLP 特征选择

    带交叉验证的递归特征消除 RFEVC 不适用于多层感知器估计器 以及其他几个分类器 我希望在许多分类器中使用特征选择 执行交叉验证来验证其特征选择 有什么建议么 对于结构化数据 有一个独立于模型选择的特征选择 称为排列重要性 解释得很好he
  • 在 V8 中执行函数的具体执行次数是多少之后变得很热?

    我正在学习 V8 的内部工作原理 发现有 JIT 编译器 它可以通过内联缓存技术动态优化热函数 我只有两个问题 第一 函数只要连续执行几次就算热函数吗 其次 V8 中函数在重复执行多少次之后就会变热 V8 开发者在这里 函数的 热度 不仅仅
  • 静态方法内存消耗

    我有以下具有以下方法的类 public class Foo public string A get set public static Foo New string a Foo newFoo new Foo newFoo A a retur
  • TShellTreeView 在哪里?

    我正在尝试在 Delphi 10 Seattle 中编译一个旧项目并收到以下错误消息 类 TShellTreeView 未找到单击取消忽略 TShellTreeView是一个设计时组件 是ShellCtrls软件包 始终随 Delphi 一
  • Delphi 和 PHP 中的安全密钥对加密解决方案?

    我的应用程序通过互联网发送加密文件 我需要能够执行以下操作 客户端 Delphi 2010 使用加密文件公钥随我的应用程序一起提供并上传到服务器 服务器端 PHP 使用我的解密上传的文件私钥存储在服务器上 处理上传的文件 听起来很简单 但我
  • MATCH 或 VLOOKUP 从范围末尾开始

    我有一张看起来像这样的桌子 A B ID1 data 123 ID2 data 234 ID1 data 456 ID2 data 567 我正在尝试找到最好的检索方法data 567对于 ID2 在 ID2 上使用 MATCH 使用选项
  • 如何显示尽可能多的项目适合一行,如果全部不适合显示剩余项目的数量

    我刚刚开始学习Svelte 我想在一行中显示尽可能多的电子邮件 并使用如下数字显示剩余的电子邮件 https i stack imgur com 9k7np jpg 我想在不修改父组件中的代码的情况下实现这一点 我只是想改变DisplayE
  • Java 获取屏幕上的像素颜色?

    您好 我正在尝试获取 JFrame 上特定像素的颜色 这是我的代码 我的镜框是红色的 我遇到的问题是 当我单击框架时 它应该返回红色的 RGB 颜色 即 255 0 0 但是当我单击不同的点时 有时会得到白色的 RGB 颜色 255 255
  • 获取某个国家/地区的默认时区(通过 CultureInfo)

    是否有程序或表格提供每个国家 地区的默认时区 是的 美国 加拿大和俄罗斯有多个时区 我认为其他每个国家 地区都只有一个 但是 最好从最有可能知道的国家 地区开始 而不是仅提供从 GMT 开始的列表 最好使用 C 但我会将其放入任何内容中并转
  • java中的html截断器

    是否有任何实用程序 或示例源代码 可以在 Java 中截断 HTML 用于预览 我想在服务器上而不是在客户端上进行截断 我正在使用 HTMLUnit 来解析 HTML UPDATE 我希望能够预览 HTML 因此截断器将保持 HTML 结构
  • Pytorch 张量 - 如何通过特定张量获取索引

    我有一个张量 t torch tensor 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 和一个查询张量 q torch tensor 1 0 0 0 有没有办法获取索引q like indexes t index q g
  • 从 Cordova Capture 获取音频数据的 base64

    我正在使用 ngCordova Capture 通过录制音频并将 Base64 发送到某处 通过 REST 来编写此代码 我可以让捕获音频工作 但是一旦它返回audioURI 我就无法从文件系统获取base64 的数据 我的代码如下 cor
  • 无法解析 org.springframework.transaction.annotation.Transactional 的依赖关系

    我是基于注释的编程的新手 不知道要添加到我的 pom xml 中的 Maven 工件org springframework transaction annotation Transactional 我用谷歌搜索 如搜索结果的前 5 页 但无
  • 安装 Graphviz 2.38 后出现“运行时错误:确保 Graphviz 可执行文件位于系统路径上”

    我下载了Graphviz 2 38MSI 版本并安装在文件夹下C Python34 然后我跑pip install Graphviz 一切顺利 在系统路径中我添加了C Python34 bin 当我尝试运行测试脚本时 filename do
  • 从 sns.kdeplot 中提取数据

    是否可以从a中提取数据sns kdeplot 在策划之前 IE 不使用该功能y get lines 0 get data 后绘图 这可以通过从 matplotlib Axes 对象中提取线条数据来完成 import numpy as np
  • 从 x86 CPU 生成 64 字节读取 PCIe TLP

    将数据写入 PCIe 设备时 可以使用写入组合映射来提示 CPU 应生成针对该设备的 64 字节 TLP 是否可以对读取做类似的事情 以某种方式提示 CPU 读取整个缓存行或更大的缓冲区 而不是一次读取一个字 英特尔有关于从视频 RAM 复