- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我注意到 Clang 为以下代码段做了一个有趣的除法优化技巧
int64_t s2(int64_t a, int64_t b)
{
return a/b;
}
march
,则以下是程序集输出作为桑迪桥或以上
mov rax, rdi
mov rcx, rdi
or rcx, rsi
shr rcx, 32
je .LBB1_1
cqo
idiv rsi
ret
.LBB1_1:
xor edx, edx
div esi
ret
最佳答案
我猜 clang 开发人员测试了它适用于哪些 uarches,并发现它只是 SnB 系列。
这听起来不错,因为 P6 系列上的一个时髦的停顿,以及 AMD 的不同分频器。
使用 P6 系列上的移位 imm8(不是隐式移位 1)的标志结果会导致前端在发出标志读取指令之前停顿,直到移位退出。 (因为 P6 解码器不会检查 imm8=0 的情况以保留未修改的标志,而 SnB 会检查)。 INC instruction vs ADD 1: Does it matter? .这可能就是 clang 不将它用于 P6 系列的原因。
可能有一种不同的方式来检查不会导致此停顿的相关条件(例如 test rcx,rcx
之前的 je
,在 Core2/Nehalem 上值得这样做)。 但是,如果 clang 开发人员没有意识到它在 P6 系列上运行缓慢的原因,他们就不会考虑修复它,并且只是没有为 SnB 之前的目标完成它。 (不幸的是,没有人将我添加到有关此的补丁审查或错误 CC 列表中;这是我第一次看到 clang 进行此优化。虽然我想我可能在其他一些 LLVM 审查或bug。无论如何,尝试添加 test
可能会很有趣,看看这是否对 Nehalem 有意义。)
根据 Agner Fog 的说法,无论操作数大小如何,AMD 的除法器都具有相同的最佳 div 性能,大概仅取决于输入的实际幅度。只有最坏的情况会随着操作数大小而增长。 所以我认为运行idiv r64
是无害的在 AMD 上使用小输入符号扩展到 128/64 位。 (AMD 上的 div/idiv 对于所有操作数大小都是 2 uop(除了 8 位,因为它只需要写入一个输出寄存器:AH 和 AL = AX。与 Intel 的微编码整数除法不同。)
英特尔很不一样:idiv r32
是 9 uops,而 idiv r64
是 59 uop,在 Haswell 上,最佳情况下的吞吐量要差 3 倍。 SnB 家族的其他成员是类似的。
Why don't other compilers like GCC or ICC do it?
perf
,他使用的一个例子是玩弄一个分支来跳过
div
.我猜这个优化是他的主意。看起来很漂亮。 :)
关于assembly - 为什么 Clang 只从 Sandy Bridge 开始做这个优化技巧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54438477/
我有一个关于 JavaScript 语法的问题。实际上,我在自学 MEAN 堆栈教程时想出了编码(https://thinkster.io/mean-stack-tutorial#adding-aut
在我的书中它使用了这样的东西: for($ARGV[0]) { Expression && do { print "..."; last; }; ... } for 循环不完整吗?另外,do 的意义何
我已经编写了读取开关状态的代码,如果按 3 次 # 则退出。 void allkeypadTest(void) { static uint8_t modeKeyCount=0; do
因此,对于上周我必须做的作业,我必须使用 4 个 do-while 循环和 if 语句在 Java 中制作一个猜谜游戏。我无法成功完成它,类(class)已经继续,没有为我提供任何帮助。如果有人可以查
int i=1,j=0,n=10,k; do{ j+=i; i<<1; printf("%d\n",i); // printf("%d\n",12<<1); }while
此代码用于基本杂货计算器的按钮。当我按下按钮时,一个输入对话框会显示您输入商品价格的位置。我遇到的问题是我无法弄清楚如何获得 do ... while 循环以使输入对话框在输入后弹出。 我希望它始终恢
当我在循环中修改字符串或另一个变量时,它的条件是否每次都重新计算?或者在循环开始前一次 std::string a("aa"); do { a = "aaaa"; } while(a.size<10)
我刚刚写了这个,但我找不到问题。我使用代码块并编写了这个问题 error: expected 'while' before '{' token === Build finished: 1 errors
do { printf("Enter number (0-6): ", ""); scanf("%d", &Num); }while(Num >= 0 && Num 表示“超过”,<表
我有一个包含 10 个项目的 vector (为简单起见,所有项目都属于同一类,称其为“a”)。我想要做的是检查“A”不是 a) 隐藏墙壁或 b) 隐藏另一个“A”。我有一个碰撞函数可以做到这一点。
嗨,这是我的第二个问题。我有下表 |-----|-------|------|------| |._id.|..INFO.|.DONE.|.LAST.| |..1..|...A...|...N..|.
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicates: Why are there sometimes meaningless do/while and if/e
来自 wikibook在 F# 上有一小部分它说: What does let! do?# let! runs an async object on its own thread, then it i
我在 Real World Haskell 书中遇到了以下函数: namesMatching pat | not (isPattern pat) = do exists do
我有一个类似于下面的用例,我创建了多个图并使用 gridExtra 将它们排列到一些页面布局中,最后使用 ggsave 将其保存为 PDF : p1 % mutate(label2
当我使用具有 for 循环的嵌套 let 语句时,如果没有 (do (html5 ..)),我将无法运行内部 [:tr]。 (defpartial column-settings-layout [&
执行 vagrant up 时出现此错误: anr@anr-Lenovo-G505s ~ $ vagrant up Bringing machine 'default' up with 'virtua
# ################################################# # Subroutine to add data to the table Blas
我想创建一个检查特定日期格式的读取主机。此外,目标是检查用户输入是否正确,如果不正确,则提示应再次弹出。 当我刚接触编程时,发现了这段代码,这似乎很合适。我仍然在努力“直到” do {
我关注这个tutorial在谷歌云机器学习引擎上进行培训。我一步一步地跟着它,但是在将 ml 作业提交到云时我遇到了错误。我运行了这个命令。 sam@sam-VirtualBox:~/models/r
我是一名优秀的程序员,十分优秀!