的等效方法我決定繼續快速邊角優化,並在 _mm_movemask_epi8
處指出SSE指令。我如何用uint8x16_t
輸入重寫ARM霓虹燈?SSE _mm_movemask_epi8 ARM NEON
5
A
回答
0
一些測試中,它看起來像下面的代碼後,工作正確的:
int32_t _mm_movemask_epi8_neon(uint8x16_t input)
{
const int8_t __attribute__ ((aligned (16))) xr[8] = {-7,-6,-5,-4,-3,-2,-1,0};
uint8x8_t mask_and = vdup_n_u8(0x80);
int8x8_t mask_shift = vld1_s8(xr);
uint8x8_t lo = vget_low_u8(input);
uint8x8_t hi = vget_high_u8(input);
lo = vand_u8(lo, mask_and);
lo = vshl_u8(lo, mask_shift);
hi = vand_u8(hi, mask_and);
hi = vshl_u8(hi, mask_shift);
lo = vpadd_u8(lo,lo);
lo = vpadd_u8(lo,lo);
lo = vpadd_u8(lo,lo);
hi = vpadd_u8(hi,hi);
hi = vpadd_u8(hi,hi);
hi = vpadd_u8(hi,hi);
return ((hi[0] << 8) | (lo[0] & 0xFF));
}
0
請注意,我沒有測試過任何這一點,但這樣的事情可能工作:
X := the vector that you want to create the mask from
A := 0x808080808080...
B := 0x00FFFEFDFCFB... (i.e. 0,-1,-2,-3,...)
X = vand_u8(X, A); // Keep d7 of each byte in X
X = vshl_u8(X, B); // X[7]>>=0; X[6]>>=1; X[5]>>=2; ...
// Each byte of X now contains its msb shifted 7-N bits to the right, where N
// is the byte index.
// Do 3 pairwise adds in order to pack all these into X[0]
X = vpadd_u8(X, X);
X = vpadd_u8(X, X);
X = vpadd_u8(X, X);
// X[0] should now contain the mask. Clear the remaining bytes if necessary
這將需要重複一次處理一個128位向量,因爲vpadd
僅適用於64位矢量。
5
我知道這個職位是非常過時的,但我發現它有用給我的(有效)的解決方案。它假定輸入參數的每個通道中的所有零/全零。
const uint8_t __attribute__ ((aligned (16))) _Powers[16]=
{ 1, 2, 4, 8, 16, 32, 64, 128, 1, 2, 4, 8, 16, 32, 64, 128 };
// Set the powers of 2 (do it once for all, if applicable)
uint8x16_t Powers= vld1q_u8(_Powers);
// Compute the mask from the input
uint64x2_t Mask= vpaddlq_u32(vpaddlq_u16(vpaddlq_u8(vandq_u8(Input, Powers))));
// Get the resulting bytes
uint16_t Output;
vst1q_lane_u8((uint8_t*)&Output + 0, (uint8x16_t)Mask, 0);
vst1q_lane_u8((uint8_t*)&Output + 1, (uint8x16_t)Mask, 8);
(心靈http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47553,反正。)
同樣邁克爾,關鍵是要形成非空項指標的權力,並總結他們兩兩三次。這必須通過增加數據大小來完成,以便每增加一倍都要加倍。您可以從2 x 8 8位條目減少到2 x 4 16位,然後再減少2 x 2 32位和2 x 1 64位。這兩個數字的低字節給出瞭解決方案。我不認爲有一種簡單的方法可以將它們組合在一起形成一個使用NEON的短期價值。
如果輸入是合適的形式並且可以預先加載功率,則需要6條NEON指令。
相關問題
- 1. arm neon vst1.32 segfault
- 2. 將SSE2移植到ARM NEON intrinsincs
- 3. SSE和NEON之間的轉換Intrinsics-Shuffling
- 4. ARM NEON 8x8 SAD操作
- 5. ARM NEON SIMD版本2
- 6. Qemu中的ARM NEON支持
- 7. 沒有用於ARM的xor gne intrinsics NEON
- 8. ARM Neon Assembler - 奇怪的管線問題
- 9. ARM中的指令調度NEON
- 10. ARM NEON彙編 - 使用和理解
- 11. ARM Neon Assembler - 處理溢出寄存器
- 12. 面向Android的ARM NEON調試NDK
- 13. Visual Studio中的ARM NEON Intrisics支持
- 14. ARM彙編NEON - 提高性能
- 15. ARM Neon:用於減法的VPADAL
- 16. NEON vs Intel SSE - 某些操作的等效
- 17. ARM NEON簡單的低通濾波器矢量
- 18. atan2近似11位尾數在x86(與SSE2)和ARM(與vfpv4 NEON)
- 19. 如何使用ARM Neon intrinsics重新排序矢量數據?
- 20. 我可以在x86 C程序中模擬ARM NEON嗎?
- 21. 使用ARM NEON內在函數添加α和置換
- 22. ARM Neon內在函數有沒有很好的參考?
- 23. 與ARM NEON數據類型編譯器崩潰
- 24. ARM NEON我該如何更改索引值
- 25. 如何初始化const float32x4x4_t(ARM NEON內部,GCC)?
- 26. 針對ARM/NEON的64位/ 32位除法算法更快?
- 27. ARM Cortex-A8:VFP和NEON有什麼區別
- 28. 如何碼 「A [1] = B [C [1]]」 上ARM NEON SIMD內在功能
- 29. Qualcomm Scorpion雙核ARM NEON代碼存在問題?
- 30. 用於視頻格式轉換的ARM-NEON
嗨@Michael thanx爲例。請你解釋一下,我怎樣才能用所需的字節填充向量B?對於我可以使用vdup_n_u8(0x80),但我應該如何做A?你也寫了vshl_u8,但是在評論中有右移? – inspirit 2012-08-08 20:27:14
要初始化向量B:從常量數組(?)的'vld1'。關於右移:ARM文檔聲明_「如果移位值爲正值,則操作爲左移,否則爲右移。」我並不完全確定,如果您的數據是'u8',或者您需要使用's8',那麼情況就是這樣。 – Michael 2012-08-08 20:34:40
是的,我明白我需要從數組中加載B我只是想知道在該向量中提供的值。你能更具體一點嗎?應該只是[0,-1,-2,-3,-4,-5,-6,-7]?是的,我現在需要它爲u8數據向量 – inspirit 2012-08-08 20:42:14