アルゴリズムの一部をCからARMアセンブラ(NEON命令を使用)、 に変換しましたが、元のCコードよりも2倍遅くなりました。 パフォーマンスを向上させるにはどうすればよいですか?ARMアセンブラNEON - パフォーマンスの向上
対象はARM Cortex-A9です。
アルゴリズムは、配列から64ビット値を読み取ります。この値から1バイトが抽出され、次にそれが別のテーブルのルックアップ値として使用されます。 この部分は約10回実行され、結果の各テーブル値は他のものとXORされ、最終結果が別の配列に書き込まれます。このような
何か:
result[i] = T0[ GetByte0(a[i1]) ]^T1[ GetByte1(a[i2]) ]^...^T10[ (...) ];
私のアプローチでは、私は、全体の配列「」ネオンレジスタで、その後、腕レジスタの右バイトを動かし、オフセットを計算し、その後から値を読み込むを読み込みますテーブル:
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"との違いは何ですか。 ネオンレジスタ内でのみオフセット計算を実行するにはどうすればよいですか? ありがとうございます。
私はあなたのCコードが記述と一致するとは思わない。 Cは同じ単語の複数のバイトを排他的論理和演算していますが、各バイトは次のバイトを索引付けするために使用されます。明確に表示できない場合は、コードを最適化することはできません。 – phkahler
はい、あなたは正しいです。私はそれを編集した。それはいつも別の言葉です。 – HectorLector