相关疑难解决方法(0)

为什么循环指令慢?英特尔无法有效实施吗?

LOOP(英特尔参考手动输入)递减ecx/rcx,然后如果非零则跳转.这很慢,但是英特尔不能廉价地把它变得很快吗? dec/jnz已经将宏观融合成 Sandybridge家族的一个 uop; 唯一的区别是设置标志.

loop关于各种微体系结构,来自Agner Fog的说明表:

  • K8/K10:7 m-ops
  • Bulldozer-family/Ryzen:1 m-op(与宏观融合测试和分支相同,或者jecxz)

  • P4:4次(相同jecxz)

  • P6(PII/PIII):8次
  • Pentium M,Core2:11 uops
  • Nehalem:6个uops.(11为loope/ loopne).吞吐量= 4c(loop)或7c(loope/ne).
  • SnB家族:7个uops.(11为loope/ loopne). 吞吐量=每5个循环一个,这是将循环计数器保留在内存中的瓶颈!jecxz只有2 uops,吞吐量与普通吞吐量相同jcc
  • Silvermont:7次
  • AMD Jaguar(低功耗):8 uops,5c吞吐量
  • 通过Nano3000:2 uops

难道解码器不能像lea rcx, [rcx-1]/ 那样解码jrcxz吗?这将是3 uops.至少那是没有地址大小前缀的情况,否则它必须使用ecx和截断RIP,EIP如果跳转; 也许奇怪的地址大小选择控制减量的宽度解释了许多uops?

或者更好,只需将其解码为不设置标志的融合分支和分支? dec ecx …

performance x86 assembly intel cpu-architecture

53
推荐指数
3
解决办法
6096
查看次数

如何轻松计算C中无符号长long的平方根?

我正在寻找另一个问题(这里),有人正在寻找一种方法来获得x86汇编中64位整数的平方根.

事实证明这很简单.解决方案是转换为浮点数,计算sqrt然后转换回来.

我需要在C中做一些非常相似的事情,但是当我看到等价物时,我会陷入困境.我只能找到一个接收双打的sqrt函数.双精度不具有存储大64位整数的精度而不会引入明显的舍入误差.

是否有一个我可以使用的具有long doublesqrt功能的通用数学库?

c long-double unsigned-long-long-int

5
推荐指数
2
解决办法
1万
查看次数

我在哪里可以找到 GCC 源代码中的数学例程?数学函数如何工作?

晚安。我是一名数学学士,我正在学习 log() 和系列。而且我确实想看看 GCC 如何计算所有这些东西,它对我有很大帮助,math.h 里面什么都没有,我已经读过了。我疯狂地试图找到 GCC 如何使用有史以来最快的方法计算对数和平方根。我下载了源代码,但找不到数学例程在哪里。

https://github.com/gcc-mirror/gcc

我只是想看看,我根本不是一个好的程序员,我的东西是数学。

c math gcc discrete-mathematics

5
推荐指数
2
解决办法
301
查看次数