我已經將一部分算法從C轉換爲ARM彙編(使用NEON指令), ,但現在它比原始C代碼慢2倍。 如何提高性能?ARM彙編NEON - 提高性能
目標是ARM Cortex-A9。
算法從數組中讀取64位值。從這個值中提取一個字節,然後將其用作另一個表的查找值。 這部分完成了大約10次,並且每個結果表值與其他值進行異或,並將最終結果寫入另一個數組。
像這樣:
result[i] = T0[ GetByte0(a[i1]) ]^T1[ GetByte1(a[i2]) ]^...^T10[ (...) ];
在我的方法我加載「一」在NEON寄存器,然後移動在一個臂寄存器中的右字節整個陣列,計算偏移量,然後加載從該值表:
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是異或同一個字的多個字節,但quesiton說每個字節用於索引下一個字節。如果無法清晰顯示,我們無法優化代碼。 – phkahler 2012-02-23 14:51:32
是的你是對的。我編輯它。它總是另一個詞。 – HectorLector 2012-02-23 14:55:43