2016-07-13 10 views
1
void write_solution(uchar our_index[16], global uchar *solution) { 
    uchar8 solution_data = 0; 
    solution_data.s0 = (our_index[0] & 0xF) + ((our_index[1] & 0xF) << 4); 
    solution_data.s1 = (our_index[2] & 0xF) + ((our_index[3] & 0xF) << 4); 
    solution_data.s2 = (our_index[4] & 0xF) + ((our_index[5] & 0xF) << 4); 
    solution_data.s3 = (our_index[6] & 0xF) + ((our_index[7] & 0xF) << 4); 
    solution_data.s4 = (our_index[8] & 0xF) + ((our_index[9] & 0xF) << 4); 
    solution_data.s5 = (our_index[10] & 0xF) + ((our_index[11] & 0xF) << 4); 
    solution_data.s6 = (our_index[12] & 0xF) + ((our_index[13] & 0xF) << 4); 
    solution_data.s7 = (our_index[14] & 0xF) + ((our_index[15] & 0xF) << 4); 
    vstore8(solution_data, 0, solution); 
} 

コードに見ることができるように、私はだけではなく、このようにそれを書くことができれば、それは本当に美しいのようになります。このOpenCLカーネルコードを簡略化するにはどうすればよいですか?

void write_solution(uchar our_index[16], global uchar *solution) { 
    uchar8 solution_data = 0; 
    for(int i = 0; i < 8; i++) { 
     solution_data[i] = (our_index[i * 2] & 0xF) + ((our_index[i * 2 + 1] & 0xF) << 4); 
    } 
    vstore8(solution_data, 0, solution); 
} 

をしかし、もちろん、OpenCLのはで説明インデックス付きの表記を許可していません上記のベクトル型で使用するコード。

この問題を解決するための方法はありますか?

+0

'our_index'は配列の代わりに' uchar16'として渡すことができますか?もしそうなら、これは '.even'と' .odd'接尾辞を使って非常に簡潔に書くことができます。 – jprice

+0

@jprice私はそれを調べています。私はそれが可能だと思いますが、それはささいな変化ではありません。 – Xirema

+0

ベクトルの代わりに 'solution_data'の' uchar [8] '配列を使って、それを' solution'に書き込むためにループを使い、コンパイラがループをアンロールして、それは 'vstore8'で可能性があります。 – jprice

答えて

4

ベクトル演算はコンポーネント単位であり、.evenおよび.oddベクトルアドレッシングモードを利用できます。これはあなたのために働きますか?

void write_solution(uchar16 our_index, global uchar *solution) { 
    uchar8 solution_data = 0; 
    solution_data = (our_index.even & 0xF) + ((our_index.odd & 0xF) << 4); 
    vstore8(solution_data, 0, solution); 
} 
+0

これを動作させるために 'our_index'を' uchar16'に変換する必要はありませんか? – Xirema

+0

ああ良い点。私は逃しました。おそらく、変換を試みるか、またはuchar16を渡すことをお勧めします。ベクタ操作は、最新のハードウェアに搭載されているSIMDユニットを利用します。 (実際、SIMDはデバイスがopenclに準拠するための要件であると私は信じています) – mfa

関連する問題