2017-06-04 68 views
0

我試圖平移該C/C++代碼,以SIMD內在功能。如何碼 「A [1] = B [C [1]]」 上ARM NEON SIMD內在功能

for(int i=0 ; i < length ; i++) 
    A[i] = B[C[i]]; 

我能翻譯下面的代碼(C/C++)

for(int i=0 ; i < length ; i++) 
    A[i] = B[i]; 

到SIMD代碼(使用本徵函數)

for(int i=0 ; i < length-16 ; i+=16) { 
    uint8x16_t v0 = vld1q_u8(A+i); 
    vst1q_u8(A+i, v0); 
} 

我知道關鍵字被交織,以解決這個問題。但我找不到解決方案。

謝謝。

編輯
For more information

unsigned char A [32] = {0,}; // Output Array 
unsigned char B [20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}; // An array with values to pass to A Array 
unsigned int C [32] = {19,15,11,10,5,3,6,4,5,19,10,14,16,14,8,9,10,20,11,1, 0, 3, 5, 19, 20, 11, 13, 9, 30, 31, 7}; // An array with the index information of the B array. 

是否有任何內在的功能,可以使下面的代碼形式?

int length = 32; 
For (int i = 0; i < length-8; i+=8) 
{ 
    Uint8x8_t v_idx = vld1_u8 (C + i); 
    Uint8x8_t v = func (A, v_idx); // func (uint8_t, uint32x4_t) 
    vst1_u8(C+i, v); 
} 

威爾輸出20, 16, 12, 11, 6, 4, 7, 5, 6, 6, 20, 11, 15, 17, 15, 9, 10, 11, 21, 12, 2, 1, 4, 6, 20, 21, 12, 14, 10, 31, 32, 8

[注]
A和B是uint8_t *類型,因爲它們是具有0和255之間的值的圖像,以及C是uint32_t的*類型,因爲它們被索引由B指數。

+1

那不是交織,除非'C'具有特定結構。總的來說,這是一次聚會,我希望事實並非如此。什麼是「C」? – harold

+0

@harold我知道了錯誤的信息,謝謝。 'C'是一個索引值爲「B」的數組。 –

+1

所以這是一個普遍的聚會,據我所知NEON沒有那個 – harold

回答

0

這是一個有點很難確定,因爲你沒有提供大量的信息,但vqtbl1_u8可能是你在找什麼。這是AArch64只,雖然vtbl1_u8可用於ARMv7。

一個簡單的例子:

int main (void) { 
    uint8_t bp[] = { 1, 1, 2, 3, 5, 8, 13, 21 }; 
    uint8_t cp[] = { 0, 2, 4, 6, 1, 3, 5, 7 }; 

    uint8x8_t b = vld1_u8(bp); 
    uint8x8_t c = vld1_u8(cp); 

    uint8x8_t a = vtbl1_u8(b, c); 
    uint8_t ap[8]; 
    vst1_u8(ap, a); 

    for (int x = 0 ; x < 8 ; x++) 
    printf("%3u ", ap[x]); 
    printf("\n"); 

    return 0; 
} 

將輸出1 2 5 13 1 3 8 21

+0

它幫助了很多。謝謝。然而,「B」和「C」陣列的長度超過1000萬。正如你所猜測的,'C' Array是一個索引信息爲'B'數組的數組。我添加了一個問題以獲取更多信息。 –

相關問題