- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在分析一些 x86 二进制代码的一些“时序 channel ”。我发布了一个问题来理解 bsf/bsr
操作码。
所以从高层次上讲,这两个操作码可以被建模为一个“循环”,它计算给定操作数的前导零和尾随零。 x86
手册对这些操作码有很好的形式化,如下所示:
IF SRC = 0
THEN
ZF ← 1;
DEST is undefined;
ELSE
ZF ← 0;
temp ← OperandSize – 1;
WHILE Bit(SRC, temp) = 0
DO
temp ← temp - 1;
OD;
DEST ← temp;
FI;
bsf/bsr
说明书好像有
固定 CPU 周期 .根据我在这里找到的一些文件:
https://gmplib.org/~tege/x86-timing.pdf ,似乎它们总是需要 8 个 CPU 周期才能完成。
最佳答案
BSF/BSR 性能不是依赖于任何现代 CPU 的数据。 请参阅 https://agner.org/optimize/ 、 https://uops.info/ (仅限英特尔)或 http://instlatx64.atw.hu/ 以了解实验时序结果,以及您找到的 https://gmplib.org/~tege/x86-timing.pdf。
在现代英特尔上,它们以 3 个周期延迟和 1/时钟吞吐量解码为 1 uop,仅在端口 1 上运行。 Ryzen 也以 3c 延迟 BSF 和 4c 延迟 BSR 运行它们,但有多个 uop。早期的 AMD 有时甚至更慢。
根据您链接的 Granlund 表,您的“8 个周期”(延迟和吞吐量)成本似乎是针对 AMD K8 上的 32 位 BSF。 Agner Fog 的表同意,(并显示它解码为 21 uop,而不是具有专用的位扫描执行单元。但微编码实现大概仍然是无分支的,不依赖于数据)。不知道你为什么选择那个数字; K8 没有 SMT/超线程,因此 ALU 时序侧 channel 的机会大大减少。
请注意,它们对目标寄存器具有输出依赖性,如果输入为零,它们将保持不变。 AMD 记录了这种行为,英特尔在硬件中实现了它,但是 documents it as an "undefined" result ,所以不幸的是编译器不会利用它,人类程序员可能应该谨慎。 IDK 如果某些古老的 32 位 CPU 有不同的行为,或者英特尔计划改变(可疑!),但我希望英特尔至少记录 64 位模式(不包括任何旧 CPU)的行为。
Intel CPU(但不是 AMD)上的 lzcnt
/tzcnt
和 popcnt
在 Skylake 和 Cannon Lake 之前(分别)具有相同的输出依赖性,即使在架构上,结果对于所有输入都是明确定义的。它们都使用相同的执行单元。 ( How is POPCNT implemented in hardware? )。 AMD Bulldozer/Ryzen 构建了他们的位扫描执行单元而没有输出依赖,所以 BSF/BSR 比 LZCNT/TZCNT 慢(多个 uops 来处理 input=0 的情况,并且可能还根据输入设置 ZF,而不是结果)。
(利用内在函数是不可能的;即使使用 MSVC 的 _BitScanReverse64
也不行,它使用您可以首先设置的按引用输出 arg。MSVC 不尊重先前的值并假设它是仅输出的。 VS: unexpected optimization behavior with _BitScanReverse64 intrinsic )
手册中的伪代码不是实现
(即不一定是硬件或微码的工作方式)。
它在所有情况下都给出完全相同的结果,因此您可以使用它来准确了解文本让您想知道的任何极端情况下会发生什么。就这些。
重点是要简单易懂,这意味着根据连续发生的简单 2 输入操作对事物进行建模。 C/Fortran/典型的伪代码没有用于多输入 AND、OR 或 XOR 的运算符,但您可以在硬件中构建它( limited by fan-in ,与扇出相反)。
整数加法可以 建模为 作为位串行纹波进位,但这不是它的实现方式!相反,我们使用 carry lookahead adders 之类的技巧获得了远少于 64 个门延迟的 64 位加法的单周期延迟。
US Patent US8214414 B2 中描述了英特尔的位扫描/popcnt 执行单元中使用的实际实现技术。
Abstract
A merged datapath for PopCount and BitScan is described. A hardware circuit includes a compressor tree utilized for a PopCount function, which is reused by a BitScan function (e.g., bit scan forward (BSF) or bit scan reverse (BSR)).
Selector logic enables the compressor tree to operate on an input word for the PopCount or BitScan operation, based on a microprocessor instruction. The input word is encoded if a BitScan operation is selected.
The compressor tree receives the input word, operates on the bits as though all bits have same level of significance (e.g., for an N-bit input word, the input word is treated as N one-bit inputs). The result of the compressor tree circuit is a binary value representing a number related to the operation performed (the number of set bits for PopCount, or the bit position of the first set bit encountered by scanning the input word).
[disp + base + idx*scale]
)需要 3 个周期,而不是像以前的 CPU 那样只需要 2 个周期来添加 2 个。 Sandybridge 系列上没有 2 周期延迟 uops。 (有一些 2 周期延迟指令,因为它们解码为 2 个 uops,每个延迟为 1c,但调度程序调度 uops,而不是指令)。
关于performance - x86 bsr/bsf 如何具有固定延迟,而不依赖于数据?它不是像伪代码显示的那样循环遍历位吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54509623/
我正在尝试实现 3 列固定-流体-固定布局。此外,布局的高度必须占据整个屏幕,使其看起来像从上到下的 3 个实心列。 总结: Left-column: fixed-width Center-col
我在网上搜索过,似乎找不到一个干净、简单、所有浏览器都友好的 3 列布局。 我希望有 3 列布局,左列固定为 200px,右列固定为 200px,中间列为剩余宽度,但最小宽度为 600px。所以整体最
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this q
我正在使用一些音频指纹技术来标记长录音中的歌曲。例如,在广播节目中的记录。指纹机制工作正常,但我在归一化(或下采样)方面遇到问题。 在这里您可以看到两首相同的歌曲,但波形不同。我知道我应该进行一些直流
为什么使用cout调用setprecision和fixed以及其他iomanip函数不像例如name.find('')plz这样的字符串函数 最佳答案 它们允许您以以下方式链接操作: cout <<
我正在尝试创建一个侧边栏,当用户向下滚动页面时,该侧边栏会跟随用户,并且我设法使用以下代码实现了效果: 标记 Javas
我正在尝试设置一些性能分析以及影响缓冲策略的运行时决策。我的应用程序收到一个指向由库(CUDA 或 OpenCL)分配的缓冲区的指针。 如何测试内存区域是否被页面锁定? 据我所知,POSIX 给了我们
我正在用 C# 编写一个 B+ 树实现,我为我的应用程序选择的树实现有一个非常特定的结构,它是缓存敏感的。为了实现这些属性,它对树节点有严格的布局策略。 我想要的只是使用 C# 的 fixed 来表达
我试图通过将 fragment 注入(inject)容器来在每个屏幕的底部放置一个广告 View 。通过使用 LinearLayout,我可以将 adview 置于操作栏下方的顶部。我已经尝试了 Re
我正在尝试创建一个导航稍微复杂的网站。我已经让导航看起来像我想要的初始加载,但现在我试图让它粘性导航到滚动顶部。我已经能够在导航栏到达顶部时创建一个类,但无法使其粘滞。每次我添加一个位置时,它都会跳回
首先,我正在寻找一个纯 CSS 解决方案。我可以使用 JavaScript 非常轻松地做到这一点,所以不要费心给我提示如何在 JS 中做到这一点。 我有一个包含 3 个容器的网页。其中 2 个是固定的
我猜这里有一种 super 特例。 我正在处理许多包含。现在我正在一个包含的内容文件中编码。我需要一个灯箱,它有一个 20% 的黑色背景覆盖整个页面,包括本身固定的标题,并在先前的 PHP 文件中设置
我正在尝试制作一个包含两个“固定”侧边栏图像和一个“固定”标题图像的页面。由于标题是固定的(距顶部 0 到 10%)。我不希望页眉图像与页面上的任何文本重叠。我尝试将段落标记定位为“相对”,并将其设置
我遇到了一个(水平)居中固定位置元素的解决方案,如下所示: element { width: 200px; position: fixed; left: 0; righ
我试图让我的网站主体具有固定的高度(我想!)。 无论如何,站点正文只是白色,边框大小为 1。基本上,正文的大小取决于其中的内容,例如,随着添加更多内容,它会自动调整大小。 我想要的是垂直滚动条,这样主
是否可以在 css 中创建 master-detail-states 布局? 我需要 3 个占位符: +---------------+-------+ | A | B
我的问题是,我是否必须在每个 Get/Post 请求之前单独请求检查 SSL Pinning OkHttpClient client = new OkHttpClient.Builder().cert
假设我有一个具有 N 个节点的常量(一旦构建就不会改变)平衡树,每个内部节点都有 p 个子节点。显然,访问节点的最坏情况是 logp(N)。但是访问 r 个节点的摊销成本呢?如果我们按升序访问它们(有
我知道会话固定是用php破解网站的方法。 会话固定是一种允许攻击者劫持有效用户会话的攻击 session fixation 但我不知道这可以防止我的项目中出现此问题。 是描述解决方案的方式或样本。 最
我在 jquery 砖石布局内有一个导航元素,我想将其修复到特定位置,比如右上角。是否可以这样做,以便所有其他元素都位于它周围? 诸如前置导航之类的东西.. 这是我的代码:http://jsfiddl
我是一名优秀的程序员,十分优秀!