2015-09-17 11 views
5

したがって、AVXにはimmintrin.hという機能があり、2つの__m128i値の連結を1つの__m256i値に格納できるようにする必要があります。これがなぜ起こるか私は本当に理解していない__m256iを2つの__m128iの値に設定する

error: incompatible types when assigning to type ‘__m256i’ from type ‘int’ 

__m256i as[2]; __m128i s[4]; as[0] = _mm256_setr_m128i(s[0], s[1]); 

私はコンパイルエラーを取得:私はそうのように、それを使用するときの機能は、しかし

__m256i _mm256_set_m128i (__m128i hi, __m128i lo) 

です。どんな助けでも大歓迎です!

+3

機能がそのヘッダーにあることは確かですか? '#include 'の後に関数を使用しようとすると、警告メッセージ「_mm256_set_m128i'の暗黙の宣言」が表示されます。 Cでは、暗黙の宣言は、関数がコンパイラエラーを説明する 'int'を返すとコンパイラが想定していることを意味します。 –

答えて

9

で定義されているすべてのコンパイラが_mm256_setr_m128i、または_mm256_set_m128iであるとは限りません。だから私は、通常は、必要に応じて、マクロを定義するコンパイラおよびバージョンのテストに適し#ifdef秒で括弧:

#define _mm256_set_m128i(v0, v1) _mm256_insertf128_si256(_mm256_castsi128_si256(v1), (v0), 1) 

#define _mm256_setr_m128i(v0, v1) _mm256_set_m128i((v1), (v0)) 
  • インテルICC 11.1以降_mm256_set_m128i_mm256_setr_m128iの両方を持っています。

  • MSVC 2012以降は、ちょうど_mm256_set_m128iです。

  • gcc/clangはまだどちらかと思われませんが、最近のバージョンではまだ修正されていないかどうかは確認していません。

+0

GCCはそのヘッダに '_mm256_set_m128i'を持っていないようだ... [Link](http://ideone.com/f3gVol) –

+0

事実...私は本当にここでパフォーマンスが気になるので、正しいものを使いたい機能的に同じものを得るだけではなく、 –

+0

@MartinLauridsen: '_mm256_insertf128_si256'は単一の命令にマッピングされるため、これについて改善することはできません。 –

関連する問題