问题标签 [micro-architecture]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - 微汇编语言 Mic-1 | IDIV司
我无法理解除法 IDIV 在微装配符号中的工作方式。我已经知道如何开始但不知道如何完成:
这就是我到目前为止所拥有的,我认为问题是,如何在不使用直接除法的情况下实际除以 2 个数字。
assembly - ST64B 和 MOVDIR64B 的临时性
x86_64 有一条指令movdir64b
,据我了解,它是 64 字节(缓存行)的非临时副本(嗯,至少存储是)。AArch64 似乎有一个类似的指令st64b
,它执行相同大小的原子存储。但是,官方 ARMv9 文档并不清楚 是否st64b
也是非临时存储。
英特尔的指令集参考文档movdir64b
要详细得多,但我的研究还远远不够,无法完全理解每种内存类型协议代表什么。
从到目前为止我可以推断出的, x86_64 指令movntdq
大致相当于stnp
,并且是写组合。从那看来,似乎movdir64b
就像一个原子商店中的四个,因此我猜测st64b
.
这几乎可以肯定是对实际情况的过度简化(当然,可能是错误的/不准确的),但这是迄今为止可以推断的。
以这种方式可以st64b
将其用作四个stnp
指令的原子序列作为缓存行的非临时写入吗?
performance - 如果在加载前未完成预取,它是否无用?
假设我们有这个伪代码,其中ptr
不在任何 CPU 缓存中:
由于ptr
在主存中,预取操作的延迟(从预取指令解码到ptr
在 L1 缓存中可用)远大于 20 个周期。进行中的预取会完全减少负载的延迟吗?或者预取是没有用的,除非它在加载之前完成?
天真地(对内存系统的工作原理没有太多了解)我可以看到它以两种方式工作:
- 当 CPU 执行加载时,它以某种方式识别同一地址正在进行预取,并在从 L1 加载之前等待预取完成。
- CPU 看到该地址当前不在缓存中并进入主存储器,忽略并行执行的预取操作。
其中之一是正确的吗?有没有我没有想到的第三种选择?我对 Skylake 尤其感兴趣,但也只是试图建立一些一般的直觉。
debian - 处理 Debian 软件包名称中的 x86-64 微架构级别
我计划为 x86-64 架构构建不同版本的密集数值程序。方便的是,在 2020 年,定义了 4 个级别的 x86-64 微架构,可以通过“-march”标志传递给编译器。因此,对于 GCC 11(对于 Clang 12 也是如此),我应该能够通过指定使用 AVX、AVX2 和 LZCNT 指令
并将其扩展为 AVX512
如果我用它创建一个 Debian 包,它可能被称为
但是,实际上有两个版本。在机器上运行该x86-64-v4
版本x86-64-v3
会导致 SIGILL(非法指令)。有人向我建议:
其中 x3 代表 x86-64-v3,x4 代表 x86-64-v4。但我认为这违反了 Debian 'arch' 说明符规则。将其添加到包名称的版本部分会导致:
但这可以被包管理器解释为 x4 是更高版本。我正在考虑给名字加后缀。因此:
ARM aarch64 世界中可能会发生类似的微架构问题。根据我的阅读,ARMv8-A 支持“高级 SIMD (Neon)”;ARMv8.2-A 支持“可扩展向量扩展 (SVE)”。这可能会产生,
有没有更好的方法来处理微架构级别的差异?