我已将部分算法从 C 转换为 ARM 汇编程序(使用 NEON 指令),但现在它比原始 C 代码慢 2 倍。我怎样才能提高性能?
目标是 ARM Cortex-A9。
该算法从数组中读取 64 位值。从这个值中提取一个字节,然后将其用作另一个表的查找值。这部分完成了大约 10 次,每个结果表值与其他值进行异或运算,并将最终结果写入另一个数组。
像这样的东西:
result[i] = T0[ GetByte0( a[i1] ) ] ^ T1[ GetByte1( a[i2] ) ] ^ ... ^ T10[ (...) ];
在我的方法中,我在 Neon Registers 中加载整个数组“a”,然后在 arm 寄存器中移动右字节,计算偏移量,然后从表中加载值:
vldm.64 r0, {d0-d7} //Load 8x64Bit from the input array
vmov.u8 r12, d0[0] //Mov the first Byte from d0 into r12
add r12, r2, r12, asl #3 // r12 = base_adress + r12 << 3
vldr.64 d8, [r12] // d8 = mem[r12]
.
.
.
veor d8, d8, d9 // d8 = d8 ^ d9
veor d8, d8, d10 // d8 = d8 ^d10 ...ect.
其中 r2 保存查找表的基址。
adress = Table_adress + (8* value_fromByte);
这一步(除了开始时的加载)大约做了 100 次。为什么这么慢?
还有"vld"、"vldr"和"vldm"之间的区别是什么- 哪个是最快的。如何仅在 Neon 寄存器中执行偏移计算?谢谢你。