2017-06-04 18 views
0

このC/C++コードをSIMD組み込み関数に変換しようとしています。ARM NEON SIMD組み込み関数で "a [i] = b [c [i]]"をコーディングする方法

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

私は(組み込み関数を使用して)SIMDコードにコード(C/C++)

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

の下

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

[注]
それらは0と255の間の値を持つ画像であり、それらが索引付けされるので、Cがのuint32_t *型であるため、A及びBは、uint8_t *タイプでありますBインデックスによって。

+1

、 'C'は、特定の構造を有している場合を除きます。一般的にそれは集まりです、私はそうではないと思います。 'C'とは何ですか? – harold

+0

@harold私は間違った情報を知っていた、ありがとう。 'C'は' B'のインデックス値を持つ配列です。 –

+1

それは一般的な集まりです、私が知っている限り、NEONはそれを持っていません – harold

答えて

0

多くの情報を提供していないため、確信が持てませんが、vqtbl1_u8がお探しのものと異なる場合があります。 armv7ではvtbl1_u8が利用可能ですが、AArch64のみです。

簡単な例:インターリーブいない

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'Arrayのインデックス情報を持つ配列です。私は詳細について質問を追加しました。 –

関連する問題