x86相关内容

什么是 x86“ret"?指令相当于?

假设我正在用 x86 程序集编写一个例程,例如“添加",它将作为参数传递的两个数字相加. 在大多数情况下,这是一个非常简单的方法: push ebpmov ebp, espmov eax, [ebp+8]添加 eax, [ebp+12]mov esp, ebp流行音乐退 但是,有没有什么办法可以重写这个方法来避免使用“ret"指令,并且仍然产生完全相同的结果? 解决方案 这不需要 ..
发布时间:2022-01-06 13:01:05 其他开发

在 L1 和 L2 预取数据

在 Agner Fog 的手册 Optimizing software in C++ 的第 9.10 节“Cahce 争用大数据结构"他描述了当矩阵宽度等于称为临界步幅的东西时转置矩阵的问题.在他的测试中,当宽度等于临界步幅时,L1 中矩阵的成本要高 40%.如果矩阵更大并且只适合 L2,成本是 600%! 这在他的文本中的表 9.1 中得到了很好的总结.这与在为什么要转置512x512 的矩阵比 ..
发布时间:2022-01-06 13:00:58 其他开发

如何用汇编语言检查EIP值?

我想用汇编语言获取EIP寄存器的当前值.这可能吗? 解决方案 假设是 32 位 x86,使用如下函数: get_eip: mov eax, [esp]退 然后,要在 EAX 中获取 EIP 的值,只需: 调用get_eip ..
发布时间:2022-01-06 13:00:51 其他开发

使用 xor reg, reg 是否优于 mov reg, 0?

有两种众所周知的方法可以在 x86 上将整数寄存器设置为零值. 要么 mov reg, 0 或 xor reg, reg 有人认为第二种变体更好,因为值 0 没有存储在代码中,并且可以节省生成的机器代码的几个字节.这绝对是好的 - 使用更少的指令缓存,这有时可以允许更快的代码执行.许多编译器生成这样的代码. 但是,在 xor 指令和更改同一寄存器的任何较早指令之间,在形式上存在 ..
发布时间:2022-01-06 13:00:44 其他开发

有多少种方法可以将寄存器设置为零?

我很好奇在 x86 程序集中有多少种方法可以将寄存器设置为零.使用一条指令.有人告诉我,他设法找到了至少 10 种方法. 我能想到的有: xor ax,ax移动斧头,0和斧头,0 解决方案 IA32 下如何将 0 in 移动到 ax 有很多可能... lea eax, [0]mov eax, 0FFFF0000h//所有常量形成0..0FFFFh ..
发布时间:2022-01-06 13:00:26 其他开发

多核 Intel CPU 中如何共享高速缓存?

我有几个关于多核 CPU 或多处理器系统中使用的缓存的问题.(虽然与编程没有直接关系,但在为多核处理器/多处理器系统编写软件时会产生很多影响,因此在这里提问!) 在多处理器系统或多核处理器(Intel Quad Core、Core two Duo 等)中,每个 cpu 内核/处理器是否都有自己的缓存(数据和程序缓存)? 莉> 一个处理器/内核是否可以访问彼此的缓存,因为如果允许它们访 ..
发布时间:2022-01-06 13:00:08 其他开发

Intel x86 SSE SIMD 指令入门

我想详细了解如何使用 SSE. 除了显而易见的阅读英特尔® 64 和 IA-32 之外,还有哪些学习方法架构软件开发人员手册? 主要我有兴趣使用 GCC X86 内置函数. 解决方案 首先,我不建议使用内置函数 - 它们不可移植(跨同一架构的编译器). 使用 intrinsics、GCC 做得很好 将 SSE 内在函数优化为更优化的代码.您可以随时查看程序集,了解如何充分 ..
发布时间:2022-01-06 12:59:45 其他开发

陷阱和中断有什么区别?

陷阱和中断有什么区别? 如果不同系统的术语不同,那么它们在 x86 上的含义是什么? 解决方案 A 陷阱 是用户进程中的异常.它是由除以零或无效的内存访问引起的.这也是调用内核例程(系统调用)的常用方法,因为那些以更高优先于用户代码.处理是同步的(因此用户代码被挂起并在之后继续).从某种意义上说,它们是“主动的"——大多数时候,代码期望陷阱发生并依赖于这个事实. 中断 是由硬件 ..
发布时间:2022-01-06 12:59:24 其他开发

使用时间戳计数器测量内存延迟

我编写了以下代码,它首先刷新两个数组元素,然后尝试读取元素以测量命中/未命中延迟. #include #include #include #include int main(){/* 创建数组 */整数数组[100];国际我;for ( i = 0; i 缓存未命中_mm_fence();t2 = __rdtsc();//设置停止时间_mm_fence();差异1 = t2 - t1;//两个栅 ..
发布时间:2022-01-06 12:56:25 其他开发

英特尔的 CLWB 指令使缓存行无效

我正在尝试为 Intel 的 clwb 指令找到不会使缓存行无效的配置或内存访问模式.我正在使用 NVDIMM 对 Intel Xeon Gold 5218 处理器进行测试.Linux 版本是 5.4.0-3-amd64.我尝试使用 Device-DAX 模式并直接将此字符设备映射到地址空间.我还尝试将此非易失性内存添加为新的 NUMA 节点,并使用 numactl --membind 命令将内存 ..
发布时间:2022-01-06 12:56:14 其他开发

英特尔内在函数中的延迟与吞吐量

总的来说,我认为我对延迟和吞吐量之间的区别有很好的理解.但是,对于英特尔 Intrinsics,我不清楚延迟对指令吞吐量的影响,尤其是在按顺序(或几乎按顺序)使用多个内部调用时. 例如,让我们考虑: _mm_cmpestrc 这在 Haswell 处理器上的延迟为 11,吞吐量为 7.如果我在循环中运行这条指令,我会在 11 个周期后获得一个连续的每个周期输出吗?由于这需要一次运行 11 ..
发布时间:2022-01-06 12:55:56 其他开发

是否有任何浮点密集型代码在任何基于 x86 的架构中产生位精确的结果?

我想知道使用浮点运算的 C 或 C++ 中的任何代码是否会在任何基于 x86 的体系结构中产生精确的结果,而不管代码的复杂性. 据我所知,自 Intel 8087 以来的任何 x86 架构都使用准备处理 IEEE-754 浮点数的 FPU 单元,而且我看不出任何原因导致结果在不同架构中会有所不同.但是,如果它们不同(即由于不同的编译器或不同的优化级别),是否可以通过配置编译器来产生精确的结果 ..
发布时间:2022-01-06 12:55:49 其他开发

x86 上两个 128 位整数的高效乘法/除法(非 64 位)

编译器:MinGW/GCC 问题:不允许使用 GPL/LGPL 代码(GMP 或任何与此相关的 bignum 库,对于这个问题来说太过分了,因为我已经实现了该类). 我已经构建了自己的 128 位 固定大小的大整数类(旨在用于游戏引擎,但可以推广到任何用例),并且我发现了当前乘法的性能并且除法运算非常糟糕(是的,我已经对它们进行了计时,见下文),并且我想改进(或更改)执行低级数字运算的算法 ..
发布时间:2022-01-06 12:55:33 C/C++开发

我可以使用 AVX FMA 单元进行位精确 52 位整数乘法吗?

AXV2 没有任何大于 32 位源的整数乘法.它确实提供 32 x 32 -> 32 乘法,以及 32 x 32 -> 64 乘以1,但没有 64 位来源. 假设我需要一个输入大于 32 位但小于或等于 52 位的无符号乘法 - 我可以简单地使用浮点数 DP 乘法 或 FMA 指令,当整数输入和结果可以用 52 位或更少位表示时(即在范围内),输出是否为位精确[0, 2^52-1])? ..
发布时间:2022-01-06 12:54:49 其他开发

破坏红色区域的内联程序集

我正在编写一个加密程序,核心(一个宽乘法例程)是用 x86-64 汇编编写的,既是为了速度,也是因为它广泛使用了像 adc 这样不容易的指令可以从 C 访问.我不想内联这个函数,因为它很大并且在内循环中被调用了几次. 理想情况下,我还想为此函数定义自定义调用约定,因为它在内部使用所有寄存器(rsp 除外),不会破坏其参数,并在寄存器中返回.目前,它已适应 C 调用约定,但这当然会使其变慢(大 ..
发布时间:2022-01-06 12:54:36 其他开发

使用 AVX 指令进行水平向量求和的最快方法

我有一个包含四个 64 位浮点值的压缩向量. 我想得到向量元素的总和. 使用 SSE(并使用 32 位浮点数),我可以执行以下操作: v_sum = _mm_hadd_ps(v_sum, v_sum);v_sum = _mm_hadd_ps(v_sum, v_sum); 不幸的是,尽管 AVX 具有 _mm256_hadd_pd 指令,但它的结果与 SSE 版本不同.我相信这是因为大多 ..
发布时间:2022-01-06 12:54:15 其他开发

4 个 32 位整数的 SSE 乘法

如何将 4 个 32 位整数乘以另外 4 个整数?我没有找到任何可以做到这一点的说明. 解决方案 如果您需要 signed 32x32 位整数乘法,则在 software.intel.com 看起来它应该做你想做的: 静态内联 __m128i muly(const __m128i &a, const __m128i &b){__m128i tmp1 = _mm_mul_epu32(a,b ..
发布时间:2022-01-06 12:53:32 其他开发

`movl (%eax), %eax` 中的括号是什么意思?

我已经用谷歌搜索了很多,但无法弄清楚括号 () 的含义.另外,我看到一些语法为 movl 8(%ebp), %eax 有人可以给我推荐一些好的参考资料吗?我无法在 Google 的前 20 个结果中找到任何结果. 解决方案 %eax 是注册 EAX;(%eax) 是地址包含在寄存器EAX中的内存位置;8(%eax) 是地址为 EAX 值加 8 的内存位置. ..
发布时间:2022-01-06 12:53:19 其他开发

进位/溢出和x86 中的减法

我正在努力解决溢出问题 &在 x86 中携带标志. 据我所知,对于有符号 2 的补码相加,标志只能以四种方式之一生成(我的例子是 4 位数字): pos+pos = neg(溢出) 0111 + 0001 = 1000 (7 + 1 = -8) pos+neg = pos(进位) 0011 + 1110 = 0001 (3 + -2 = 1) neg+neg = neg ..
发布时间:2022-01-06 12:52:42 其他开发

浮点加法与浮点乘法的相对速度是多少

一两年前,编写数字代码以避免使用乘法和除法而使用加法和减法是值得的.一个很好的例子是使用前向差异来评估多项式曲线,而不是直接计算多项式. 情况是否仍然如此,或者现代计算机架构已经发展到 *,/不再比 +,- 慢很多倍的地步? 具体来说,我对在具有大量板载浮点硬件的现代典型 x86 芯片上运行的已编译 C/C++ 代码感兴趣,而不是试图在软件中执行 FP 的小型微型计算机.我意识到流水线 ..
发布时间:2022-01-06 12:52:12 其他开发