【问题标题】:Android: Why is integer computation much slower than float computation when the amount of computation increases?Android:当计算量增加时,为什么整数计算比浮点计算慢得多?
【发布时间】:2017-08-30 15:34:15
【问题描述】:

我观察到一个相当奇怪的现象:当我将所需的 CPU 计算量从 10+ 百万增加到几亿(大多数是乘法和加法和除法)时,如果我以浮点数计算它们,速度会变要快得多。然而,对于低于一定数量的运算,并不那么极端,整数计算确实更快,正如预期的那样。

发生这种情况有什么特殊原因吗?我怀疑它可能与浮点运算在计算显着增加时自动并行化有关,但与整数计算无关。请注意,我没有明确地为应用程序执行多线程。我不是 Android 专家,所以我想知道是否有任何 android 专业人士或计算机架构专家可以在这方面启发我。

谢谢。

【问题讨论】:

  • 你在做什么操作?你分吗?如果是这样,很清楚,请参阅:stackoverflow.com/questions/3350808/…
  • 是的,也涉及到除法。事实上,该应用程序与神经网络有关,这基本上意味着您发布的线程中的图形计算。是否有现有文献显示整数中的某些操作(例如除法)较慢?
  • 我从未测试过它,但您可以使用简单的 java 代码(使用时间戳)轻松测试它。 *无论如何我发现nicolas.limare.net/pro/notes/2014/12/12_arit_speed,非常有趣的信息:) 另外,使用GPU应该是快速的过程..
  • 除法始终是处理器有史以来最慢的操作。要进行优化,您可以乘以预先计算的逆数。即:10 * .510 / 2快得多,结果相同 (5)。更优化的是移动位(如果您要乘以或除以 2 的幂)。即:10 << 110 * 2MUUUUUCH 并且结果相同 (20)。
  • @ModularSynth 虽然这两个都是正确的,但编译器应该为您完成这两个优化。此外,仅当您乘以常数时,移位的东西才成立,并且常数的位数相对较少。如果数字是变量或者1位太多,硬件乘法器会更快。

标签: android mobile floating-point integer cpu-architecture


【解决方案1】:

如今的处理器内置了并行浮点指令(称为向量指令)。如果您正在执行大量 fp 操作,则可能会针对这些操作进行优化。有关内置 CPU 操作的列表,请参阅 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0802b/a64_simd_vector_alpha.html

【讨论】:

  • 感谢分享!!!我确实在使用 snapdragon 的 ARM 处理器,这是我从未真正想到的。有没有办法检查我的移动设备是否默认使用 SIMD 操作?
  • 如果它的 C/C++ 代码,您可以查看目标文件中的反汇编并检查生成了哪些指令。如果是 Java,除非您想研究设备的 JIT 环境如何将字节码编译为机器码,否则您将非常不走运。
  • 不幸的是,我使用的是 Java,所以它会很困难。我刚刚检查了 5 年前的 snapdragon 处理器似乎在积极使用 SIMD 矢量操作。另外,整数运算不能向量化有什么特殊原因吗?
  • 他们可以。 Intel 有 SSE 和 AVX,它们都是向量化整数的指令集。但矢量化数学最常见的用例是图形,它使用浮点数。此外,大多数整数代码都包含分支作为流控制,因此不能很好地并行化。因此,对于处理器制造商来说,这并不是一个高优先级。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 2013-12-10
  • 2018-03-22
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
  • 2019-12-15
相关资源
最近更新 更多