ARM / NEON的64bit / 32bit分割算法更快?

我正在研究一个代码,其中在两个地方有64位乘32位定点除法,结果取32位。 这两个地方在一起占用了我总时间的20%以上。 所以我觉得如果我可以删除64位分区,我可以很好地优化代码。 在NEON中,我们可以有一些64位指令。 任何人都可以建议一些例行程序,通过使用一些更快的实现来解决瓶颈问题。

或者如果我可以在C中使用32位/ 32位除法来实现64位/ 32位除法,那也很好吗?

如果有人有一些想法,你能帮我解决吗?


过去我做了很多定点算术,并且自己做了很多研究寻找快速64/32比特的分割。 如果你是谷歌'ARM部门',你会发现很多伟大的链接和讨论这个问题。

对于ARM体系结构的最佳解决方案,即使32位分区可能无法在硬件中使用的情况如下:

http://www.peter-teichmann.de/adiv2e.html

这个汇编代码非常陈旧,您的汇编程序可能不了解它的语法。 不过值得将代码移植到您的工具链中。 这是迄今为止我见过的特殊情况下最快的分割代码,并且相信我:我已经对它们进行了基准测试:-)

上次我做到了这一点(大约5年前,对于CortexA8),这个代码比编译器生成的速度快大约10倍。

此代码不使用NEON。 一个NEON端口会很有趣。 不知道它会不会提高性能。

编辑:

我发现汇编程序的代码移植到了GAS(GNU Toolchain)。 此代码正在运行和测试:

Divide.S

.section ".text"

.global udiv64

udiv64:
    adds      r0,r0,r0
    adc       r1,r1,r1

    .rept 31
        cmp     r1,r2   
        subcs   r1,r1,r2  
        adcs    r0,r0,r0
        adc     r1,r1,r1
    .endr

    cmp     r1,r2
    subcs   r1,r1,r2
    adcs    r0,r0,r0

    bx      lr

C代码:

extern "C" uint32_t udiv64 (uint32_t a, uint32_t b, uint32_t c);

int32_t fixdiv24 (int32_t a, int32_t b)
/* calculate (a<<24)/b with 64 bit immediate result */
{
  int q;
  int sign = (a^b) < 0; /* different signs */
  uint32_t l,h;
  a = a<0 ? -a:a;
  b = b<0 ? -b:b;
  l = (a << 24);
  h = (a >> 8);
  q = udiv64 (l,h,b);
  if (sign) q = -q;
  return q;
}
链接地址: http://www.djcxy.com/p/69767.html

上一篇: 64bit/32bit division faster algorithm for ARM / NEON?

下一篇: Dalvik is looking for .so file with '.0' extension