2016-12-19 19 views
3

基本的に、これに相当するAVX2組み込み関数を作成するにはどうすればよいですか? result_in_float__m256であり、はshort int*またはshort int[8]であると仮定します。avx命令を使用してfloatのベクトルをshort intに変換するにはどうすればよいですか?

for(i = 0; i < 8; i++) 
    result[i] = (short int)result_in_float[i]; 

私は山車が固有__m256i _mm256_cvtps_epi32(__m256 m1)を使用して32ビットの整数に変換することができることを知っているが、16ビット整数にさらにこれらの32ビット整数に変換する方法は考えています。そして、私はそれだけでなく、それらの値を(16ビット整数の形で)メモリに格納することを望んでおり、私はベクトル命令を使ってそのすべてを行いたいと思います。

インターネットで検索すると、_mm256_mask_storeu_epi16という名前の固有名詞が見つかりましたが、使用法の例が見つからないため、そのトリックを行うかどうかはわかりません。

+0

私はCとC++の両方を使用します。これらの組み込み関数は、どちらからでも呼び出すことができます。だから、それが理由です。 – pythonic

+0

適切なバイトセレクトでvpshufbを使用し、上位128ビットレーンから下位に値を下げるシャッフルを使用します。 –

+0

オーバーフローでラップするのではなく飽和状態になってもかまいません(intからshort、つまりfloatではなくint stepへ)。 – harold

答えて

4

_mm256_cvtps_epi32は良い最初のステップです。短絡のパックされたベクトルへの変換は少し迷惑で、クロススライスシャッフルが必要です(ここでは依存関係のチェーンにはないので良いです)。値が(コメントごとのように)、我々は変換を行う代わりに_mm256_shuffle_epi8_mm256_packs_epi32を使用することができます右の範囲にあると仮定することができますので

、いずれかの方法は、それは、ポート5の1サイクル命令ですが、_mm256_packs_epi32ことを回避するを使用してどこかからシャッフルマスクを取得する必要があります。

だから、最後のステップ(キャスト)は無料です

__m256i tmp = _mm256_cvtps_epi32(result_in_float); 
tmp = _mm256_packs_epi32(tmp, _mm256_setzero_si256()); 
tmp = _mm256_permute4x64_epi64(tmp, 0xD8); 
__m128i res = _mm256_castsi256_si128(tmp); 
// _mm_store_si128 that 

(テストされていない)それを一緒に入れて、それだけの種類を変更します。

あなたが変換するフロートの二つのベクトルを持っていた場合、あなたは再使用できる命令を、例えばの最も:(いずれかテストしていない)

__m256i tmp1 = _mm256_cvtps_epi32(result_in_float1); 
__m256i tmp2 = _mm256_cvtps_epi32(result_in_float2); 
tmp1 = _mm256_packs_epi32(tmp1, tmp2); 
tmp1 = _mm256_permute4x64_epi64(tmp1, 0xD8); 
// _mm256_store_si256 this 
+0

あなた、先生です!私はあなたのコードをテストし、それは働いた!しかし1つの訂正。 __mm256iまたは__mm128iの代わりに_m256iと_m128iを指定する必要があります。私が使用した正確なコードは次のとおりです。 __m256i tmp = _mm256_cvtps_epi32(result_in_float); \t tmp = _mm256_packs_epi32(tmp、_mm256_setzero_si256()); \t tmp = _mm256_permute4x64_epi64(tmp、0xD8); – pythonic

+0

右の単一の 'm'があります。 – harold

+3

@pythonicとharold:単一ベクトルの場合、一時的なゼロ(AVX1のみ必要)は必要ありません:' _mm256_cvtps_epi32'、 '_mm256_extractf128_si256'と128ビットの '_mm_packs_epi32'への入力としてキャストされます。 (私は256b [VCVTPS2DQ ymm](http://www.felixcloutier.com/x86/CVTPS2DQ.html)がAVX1にあったのかどうかは確かではありませんでした。) –

関連する問題