- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑 x86 中的以下循环:
; on entry, rdi has the number of iterations
.top:
; some magic happens here to calculate a result in rax
mov [array + rdi * 8], rax ; store result in output array
dec rdi
jnz .top
rax
中计算结果(未显示)然后我们将结果存储到一个数组中,与我们索引
rdi
的顺序相反。 .
rdi
有限,我可以使用
ymm
提供的充足空间(512 字节) regs 来保存值,但实际上这样做似乎很尴尬,因为您不能“索引”任意寄存器。
ymm
的整个“数组”进行洗牌。注册一个元素,然后将该元素插入到新释放的位置。
vpermq ymm3, ymm3, 10_01_00_11b ; left rotate ymm by qword
vpermq ymm2, ymm2, 10_01_00_11b ; left rotate ymm by qword
vpermq ymm1, ymm1, 10_01_00_11b ; left rotate ymm by qword
vpermq ymm0, ymm0, 10_01_00_11b ; left rotate ymm by qword
vblenddd ymm3, ymm3, ymm2, 3 ; promote one qword of ymm2 to ymm3
vblenddd ymm2, ymm2, ymm1, 3 ; promote one qword of ymm1 to ymm2
vblenddd ymm1, ymm1, ymm0, 3 ; promote one qword of ymm0 to ymm1
pinsrq xmm0, rax, 0 ; playing with mixed-VEX mode fire (see Peter's answer)
最佳答案
你不能 vpinsrq
进入 YMM 寄存器。只有 xmm 目标可用,因此它不可避免地将完整 YMM 寄存器的上 channel 置零。它是在 AVX1 中作为 128 位指令的 VEX 版本引入的。 AVX2 和 AVX512 没有将其升级到 YMM/ZMM 目的地。我猜他们不想提供插入高车道的功能,而且提供仍然只查看 imm8 最低位的 YMM 版本会很奇怪。
您将需要一个临时寄存器,然后使用 vpblendd
混合到 YMM 中。 . 或者(在 Skylake 或 AMD 上)使用 legacy-SSE 版本保持高位字节不变! 在 Skylake 上,使用 legacy-SSE 指令编写 XMM reg 对完整寄存器具有错误的依赖性。你想要这个错误的依赖。 (我还没有测试过这个;它可能会触发某种合并 uop)。但是你不希望在 Haswell 上这样做,它保存了所有 YMM regs 的上半部分,进入“状态 C”。
显而易见的解决方案是给自己留一个临时注册用于 vmovq
+ vpblendd
(而不是 vpinsrq y,r,0
)。这仍然是 2 uop,但是 vpblendd
Intel CPU 上不需要端口 5,以防万一。 ( movq uses port 5). If you're really hard up for space, the
mm0..7` MMX 寄存器可用。
降低成本
使用嵌套循环,我们可以拆分工作 .通过少量的内循环展开,我们基本上可以消除那部分成本。
例如,如果我们有一个内部循环产生 4 个结果,我们可以在内部循环中的 2 或 4 个寄存器上使用您的蛮力堆栈方法,在没有实际展开的情况下提供适度的开销(“魔术”有效负载仅出现一次)。 3 或 4 个 uops,可选择不带循环承载的 dep 链。
; on entry, rdi has the number of iterations
.outer:
mov r15d, 3
.inner:
; some magic happens here to calculate a result in rax
%if AVOID_SHUFFLES
vmovdqa xmm3, xmm2
vmovdqa xmm2, xmm1
vmovdqa xmm1, xmm0
vmovq xmm0, rax
%else
vpunpcklqdq xmm2, xmm1, xmm2 ; { high=xmm2[0], low=xmm1[0] }
vmovdqa xmm1, xmm0
vmovq xmm0, rax
%endif
dec r15d
jnz .inner
;; Big block only runs once per 4 iters of the inner loop, and is only ~12 insns.
vmovdqa ymm15, ymm14
vmovdqa ymm13, ymm12
...
;; shuffle the new 4 elements into the lowest reg we read here (ymm3 or ymm4)
%if AVOID_SHUFFLES ; inputs are in low element of xmm0..3
vpunpcklqdq xmm1, xmm1, xmm0 ; don't write xmm0..2: longer false dep chain next iter. Or break it.
vpunpcklqdq xmm4, xmm3, xmm2
vinserti128 ymm4, ymm1, xmm4, 1 ; older values go in the top half
vpxor xmm1, xmm1, xmm1 ; shorten false-dep chains
%else ; inputs are in xmm2[1,0], xmm1[0], and xmm0[0]
vpunpcklqdq xmm3, xmm0, xmm1 ; [ 2nd-newest, newest ]
vinserti128 ymm3, ymm2, xmm3, 1
vpxor xmm2, xmm2,xmm2 ; break loop-carried dep chain for the next iter
vpxor xmm1, xmm1,xmm1 ; and this, which feeds into the loop-carried chain
%endif
sub rdi, 4
ja .outer
.top:
vmovdqa ymm15, ymm14
...
vmovdqa ymm3, ymm2 ; 12x movdqa
vinserti128 ymm2, ymm0, xmm1, 1
magic
vmovq xmm0, rax
magic
vpinsrq xmm0, rax, 1
magic
vmovq xmm1, rax
magic
vpinsrq xmm1, rax, 1
sub rdi, 4
ja .top
jmp
进入循环而不做
vmovdqa
第一个迭代器上的东西是一个选项。
magic
,这花费了我们 6 uop 端口 5 (movq + pinsrq), 12
vmovdqa
(无执行单元)和 1x vinserti128(再次端口 5)。所以这是每 4 个 19 uop
magic
,或 4.75 uop。
vmovdqa
+
vinsert
与第一
magic
,或者只是在第一个
magic
之前/之后分割它.你不能在
vinserti128
之后破坏 xmm0 , 但如果你有一个空闲的整数 reg 你可以延迟
vmovq
.
vmovdqa
的数量指示。不过,将数据混入 YMM regs 的成本最低。
Loading an xmm from GP regs .
vshufpd
执行的操作的示例:在一个寄存器中从低到高,并从另一个寄存器中合并高作为新的低。
vshufpd xmm2, xmm1,xmm2, 01b ; xmm2[1]=xmm2[0], xmm2[0]=xmm1[1]. i.e. [ low(xmm2), high(xmm1) ]
vshufpd xmm1, xmm0,xmm1, 01b
vmovq xmm0, rax
vpbroadcastq zmm0{k1}, rax
并重复其他
zmm
注册不同的
k1
面具。带有合并掩码的广播(其中掩码有一个位集)为我们提供了一个索引存储到向量寄存器中,但我们需要为每个可能的目标寄存器一条指令。
xor edx, edx
bts rdx, rcx # rdx = 1<<(rcx&63)
kmovq k1, rdx
kshiftrq k2, k1, 8
kshiftrq k3, k1, 16
...
vpcompressq zmm0{k1}{z}, zmm1 ; zero-masking: zeros whole reg if no bits set
vpcompressq zmm0{k2}, zmm2 ; merge-masking
... repeat as many times as you have possible source regs
vmovq rax, zmm0
vpcompressq
的文档:使用零掩码将其写入的元素上方的所有元素归零)
vpor xmm0, xmm0, xmm1
在末尾。 (其中一个向量将全部为零,另一个向量将具有所选元素。)
关于assembly - 使用 ymm 寄存器作为 "memory-like"存储位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50915381/
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!