この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インデックスによって。
、 'C'は、特定の構造を有している場合を除きます。一般的にそれは集まりです、私はそうではないと思います。 'C'とは何ですか? – harold
@harold私は間違った情報を知っていた、ありがとう。 'C'は' B'のインデックス値を持つ配列です。 –
それは一般的な集まりです、私が知っている限り、NEONはそれを持っていません – harold