cpu-architecture相关内容

正在运行时中断汇编指令

当中断到达 CPU 时,如果它被确认,则通过在跳转到处理程序之前保存当前地址位置来处理它.否则将被忽略. 我想知道汇编指令调用是否被中断. 例如 mvi a, 03h ;将 3 值放入 acc.在 8080 组装 单行指令可以中断吗?或者如果不是,它是原子的?? 是否总能保证“一行汇编指令"总是原子的?? 如果没有“lock"关键字,即在 8080 程序集中,那么原子性 ..
发布时间:2021-11-30 14:55:31 其他开发

REP 做什么设置?

引用英特尔® 64 和 IA-32 架构优化参考手册,第 2.4.6 节“REP 字符串增强": 使用 REP 字符串的性能特征可归因于两个组成部分:启动开销和数据传输吞吐量. [...] 对于较大粒度数据传输的REP字符串,作为ECX值增加,REP String 的启动开销呈阶梯式增加: 短字符串(ECX 20 个周期, 快速字符串(ECX >= 76:不包括 RE ..
发布时间:2021-11-30 11:17:38 其他开发

lock xchg 是否与 mfence 具有相同的行为?

我想知道的是,从一个线程访问正在发生变异的内存位置的角度来看,lock xchg 是否会具有与 mfence 类似的行为(让我们说随机)由其他线程.它能保证我获得最新的价值吗?之后的内存读/写指令? 我困惑的原因是: 8.2.2“不能使用 I/O 指令、锁定指令或序列化指令重新排序读取或写入." -英特尔 64 位开发人员手册卷.3 这是否适用于跨线程? mfence ..
发布时间:2021-11-30 11:17:28 其他开发

为什么不允许从内存到内存的 movl?

我想知道在汇编中是否允许这样做, movl (%edx) (%eax) 我猜它会访问第一个操作数中的内存并放入第二个操作数的内存,比如 *a = *b 但我没有看到任何处理这样的例子,所以我猜这是不允许的.另外,我被告知这是不允许的 leal %esi (%edi) 这是为什么?最后,是否还有其他类似的功能我应该知道是不允许的. 解决方案 movl (mem), (mem)mo ..
发布时间:2021-11-30 11:16:32 其他开发

为什么要打破“输出依赖"?LZCNT 的问题?

在对某些东西进行基准测试时,我测得的吞吐量比我计算的要低得多,我将其范围缩小到 LZCNT 指令(TZCNT 也会发生这种情况),如下面的基准测试所示: xor ecx, ecx_benchloop:lzcnt eax, edx添加 ecx, 1jnz _benchloop 还有: xor ecx, ecx_benchloop:异或 eax, eax ;这不应该有帮助,但确实有帮助lzc ..
发布时间:2021-11-30 11:14:57 其他开发

某些 CPU 上紧密循环中的 ADC/SBB 和 INC/DEC 问题

我正在用 Delphi 编写一个简单的 BigInteger 类型.它主要由 TLimb 的动态数组组成,其中 TLimb 是一个 32 位无符号整数,以及一个 32 位大小的字段,该字段还保存 BigInteger 的符号位. 要添加两个 BigInteger,我创建了一个适当大小的新 BigInteger,然后在进行一些簿记之后,调用以下过程,将三个指针传递给左操作数和右操作数以及结果的 ..
发布时间:2021-11-30 11:14:48 其他开发

如何达到每个周期 4 FLOP 的理论最大值?

如何在现代 x86-64 Intel CPU 上实现每周期 4 次浮点运算(双精度)的理论峰值性能? 据我所知,SSE add 需要三个周期code> 和 mul 在大多数现代 Intel CPU 上完成的五个周期(参见例如 Agner Fog 的“指令表").由于流水线,如果算法具有至少三个独立的求和,则每个周期可以获得一个 add 的吞吐量.由于这对于打包的 addpd 以及标量 add ..
发布时间:2021-11-30 11:12:50 C/C++开发

执行 uop 计数不是处理器宽度倍数的循环时,性能是否会降低?

我想知道不同大小的循环如何在最近的 x86 处理器上执行,作为 uops 数量的函数. 这是 Peter Cordes 的引述,他在另一个问题中提出了非 4 个计数的问题: 我还发现循环缓冲区外的 uop 带宽不是如果循环不是 4 uop 的倍数,则每个循环常数 4.(IE.这是 abc,abc,...;不是abca,bcab,...).Agner Fog 的 microarch 文档 ..
发布时间:2021-11-30 11:12:02 其他开发

添加冗余分配可在未经优化的情况下编译时加快代码速度

我发现了一个有趣的现象: #include#includeint main() {整数 p, q;时钟_t s,e;s=时钟();for(int i = 1; i 我在 i5-5257U Mac OS 上使用 GCC 7.3.0 编译代码没有任何优化.这是超过 10 次的平均运行时间:也有其他人在其他 Intel 平台上测试此案例并得到相同结果. 我将 GCC 生成的程序集发布在 此处.两 ..
发布时间:2021-11-30 11:10:35 其他开发

每条汇编指令需要多少个 CPU 周期?

我听说网上有一本 Intel 的书,它描述了特定汇编指令所需的 CPU 周期,但我找不到(经过努力).谁能告诉我如何找到 CPU 周期? 举个例子,在下面的代码中,mov/lock是1个CPU周期,xchg是3个CPU周期. //这部分是平台相关的!#ifdef WIN32内联 int CPP_SpinLock::TestAndSet(int* pTargetAddress,int nVa ..
发布时间:2021-11-30 11:08:45 其他开发

用于 memcpy 的增强型 REP MOVSB

我想使用增强型 REP MOVSB (ERMSB) 为自定义 memcpy 获得高带宽. ERMSB 是随 Ivy Bridge 微架构一起引入的.请参阅 该指南中的其他重要声明是,在 Haswell 上,rep movsb 已增强为在内部使用 256 位操作. 技术注意事项 这只是从实现的角度对rep指令的潜在优点和缺点的快速总结. rep movs 的优势 当 ..
发布时间:2021-11-30 11:07:09 其他开发

x86 的 MOV 真的可以“免费"吗?为什么我完全不能重现这个?

我一直看到人们声称 MOV 指令在 x86 中是免费的,因为寄存器重命名. 在我的一生中,我无法在单个测试用例中验证这一点.我尝试的每个测试用例都会揭穿它. 例如,这是我用 Visual C++ 编译的代码: #include #include #include int main(void){无符号整数 k, l, j;clock_t tstart = 时钟();对于 (k = 0, ..
发布时间:2021-11-30 11:06:30 其他开发

Haswell/Skylake 上的部分寄存器究竟如何执行?写AL好像对RAX有假依赖,AH不一致

这个循环在 Intel Conroe/Merom 上每 3 个周期运行一次迭代,正如预期的那样在 imul 吞吐量上出现瓶颈.但是在 Haswell/Skylake 上,它每 11 个周期运行一次迭代,显然是因为 setnz al 依赖于最后一个 imul. ;用于测试部分寄存器重命名的合成微基准mov ecx, 1000000000.环形: ;做{imul ea ..
发布时间:2021-11-30 11:06:19 其他开发

为什么 GCC 不使用部分寄存器?

在 Linux 上反汇编 write(1,"hi",3),使用 gcc -s -nostdlib -nostartfiles -O3 构建,结果: ba03000000 mov edx, 3 ;感谢小丑的纠正!bf01000000 mov edi, 131c0 xor eax, eaxe9d8ffffff jmp loc.imp.write 我不参与编译器开发,但由于移入这些寄存器的每个值都是 ..
发布时间:2021-11-30 11:05:37 其他开发

为什么循环指令很慢?英特尔不能有效地实施它吗?

LOOP(英特尔参考手册输入)递减 ecx/rcx,然后如果非零则跳转.它很慢,但英特尔不能便宜地让它快起来吗?dec/jnz 已经宏保险丝进入 Sandybridge 家族的一个 uop;唯一的区别是设置标志. loop 在各种微架构上,来自 Agner Fog 的指令表:> K8/K10:7 次操作 Bulldozer-family/Ryzen:1 m-op(与宏融合测试分支 ..
发布时间:2021-11-30 11:03:56 其他开发

CPU和数据对齐

如果你觉得这个问题已经回答了很多次,请原谅我,但我需要回答以下问题! 为什么数据必须对齐(在 2 字节/4 字节/8 字节边界上)?我的疑问是,当 CPU 具有地址线 Ax Ax-1 Ax-2 ... A2 A1 A0 时,很有可能按顺序对内存位置进行寻址.那么为什么需要在特定边界对齐数据? 如何在编译代码和生成可执行文件时找到对齐要求? 如果例如数据对齐是 4 字节边界,这是否 ..
发布时间:2021-11-27 08:07:30 其他开发

x64 和 IA-64 有什么区别?

我在 Microsoft 的网站上注意到两种不同的安装程序,一种用于 x64,一种用于 IA-64.参考:安装 .NET Framework 4.5、4.5.1 我的理解是 IA-64 是 x64 的子类,所以我很好奇为什么它会有一个单独的安装程序. 解决方案 x64 被用作“经典"x86 架构的 64 位扩展的简称;过去几年生产的几乎所有“普通"PC 都有基于这种架构的处理器. ..
发布时间:2021-11-26 15:05:15 其他开发

32位机器可以访问多少内存?

32 位或 64 位机器是什么意思? 这是处理器架构……32位机器可以和64位机器一样同时读写32位数据…… 32 位机器可以访问的最大内存是多少? 它是2^32=4Gb(4Gigabit = 0.5 GigaByte) 这意味着 4Gb 内存? 如果我为 64 位机器考虑相同的方式,那么我可以拥有 16ExbiBytes 的内存..这可能吗? 我的概念正确吗? ..
发布时间:2021-11-26 14:38:00 其他开发

QWORD 在 64 位机器上的大小是多少?

我目前正在寻找上述问题的答案.到目前为止,我发现有人说,字长是指处理器寄存器的大小,这表明在 64 位机器上,字长是 64 位,因此 QWORD(4 * 字)的大小是 256 位. 但另一方面,我发现了诸如 这 表示大小为 128 位(32 位为 64 位,64 位为两倍),而即使如此,其他人建议大小为 64 位.但最后一个与 Microsoft 有某种关系,它通过将单词的大小定义为 16 ..
发布时间:2021-11-26 14:37:02 其他开发

x86 和 x64 共享指令集?

我不知道 32 位应用程序如何在 64 位操作系统上运行. 我的理解是 32bit/64bit 是指寄存器大小.指令集应该不同,因为它们有不同大小的寄存器. 但我知道有 x86-64 指令集,它是 x86 指令集的 64 位版本. 我们可以在 64 位操作系统上运行 32 位应用程序的原因是因为 x86-64 吗? 如果是这样,为什么 32 位应用程序有时在 64 位窗口中 ..
发布时间:2021-11-26 14:28:01 其他开发