2015-09-17 7 views
5

Also, AVX hat eine Funktion von immintrin.h, die es erlauben sollte, die Verkettung von zwei __m128i Werten in einem einzigen __m256i Wert zu speichern. Die Funktion istEinstellung __m256i auf den Wert von zwei __m128i Werten

__m256i _mm256_set_m128i (__m128i hi, __m128i lo) 

Allerdings, wenn ich es verwenden, etwa so:

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

ich einen Kompilierungsfehler erhalten:

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

Ich verstehe nicht wirklich, warum dies geschieht. Jede Hilfe wird sehr geschätzt!

+3

Sind Sie sicher, dass die Funktion in diesem Header ist? Wenn ich versuche, die Funktion zu verwenden, wie Sie nach '#include ' haben, bekomme ich die Warnmeldung "implizite Deklaration von' _mm256_set_m128i' ". In C bedeutet eine implizite Deklaration, dass der Compiler annimmt, dass die Funktion einen 'int' zurückgibt, was auch den Compilerfehler erklären würde. –

Antwort

9

Nicht alle Compiler scheinen _mm256_setr_m128i oder sogar _mm256_set_m128i zu haben, definiert in immintrin.h. Also habe ich in der Regel nur Makros definieren je nach Bedarf eingeklammert mit geeigneten #ifdef S, die Test für Compiler und Version:

#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)) 
  • Intel ICC 11.1 und hat später sowohl _mm256_set_m128i und _mm256_setr_m128i.

  • MSVC 2012 und später hat nur _mm256_set_m128i.

  • gcc/clang scheinen auch nicht zu haben, obwohl ich die letzten Versionen nicht überprüft habe, um zu sehen, ob das schon behoben wurde.

+0

GCC scheint nicht einmal '_mm256_set_m128i' in dieser Kopfzeile zu haben ... [Link] (http://ideone.com/f3gVol) –

+0

Das Ding ist ... Ich sorge mich wirklich um die Leistung hier, also möchte ich das richtige verwenden Anweisung, nicht nur etwas erhalten, was funktional das gleiche ist –

+0

@MartinLauridsen: '_mm256_insertf128_si256' Karten zu einer einzigen Anweisung, so glaube ich nicht, dass Sie dies verbessern können. –

Verwandte Themen