2015-09-17 14 views
5

Quindi, AVX ha una funzione da immintrin.h, che dovrebbe consentire di archiviare la concatenazione di due valori __m128i in un unico valore __m256i. La funzione èImpostazione di __m256i sul valore di due valori __m128i

__m256i _mm256_set_m128i (__m128i hi, __m128i lo) 

Tuttavia, quando lo uso, in questo modo:

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

ottengo un errore di compilazione:

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

Io non capisco il motivo per cui questo accade. Qualsiasi aiuto è molto apprezzato!

+3

Sei sicuro che la funzione sia in quella intestazione? Quando provo ad usare la funzione come dopo "#include ", ricevo il messaggio di avviso "dichiarazione implicita di' _mm256_set_m128i' ". In C, una dichiarazione implicita significa che il compilatore assume che la funzione restituirà un 'int', che spiegherebbe anche l'errore del compilatore. –

risposta

9

Non tutti i compilatori sembrano avere _mm256_setr_m128i o anche _mm256_set_m128i, definito in immintrin.h. Così di solito si limitano a definire le macro, se necessario, tra parentesi con adeguati #ifdef s che prova per il compilatore e la versione: ha

#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 e successivamente sia _mm256_set_m128i e _mm256_setr_m128i.

  • MSVC 2012 e successivi ha solo _mm256_set_m128i.

  • gcc/clang non sembrano avere neanche, anche se non ho controllato le versioni recenti per vedere se questo è stato ancora risolto.

+0

GCC sembra non avere nemmeno '_mm256_set_m128i' in quell'intestazione ... [Link] (http://ideone.com/f3gVol) –

+0

Il fatto è ... mi interessa davvero le prestazioni qui, quindi voglio usare il corretto istruzioni, non solo ottenere qualcosa che è funzionalmente lo stesso –

+0

@MartinLauridsen: '_mm256_insertf128_si256' esegue il mapping ad una singola istruzione, quindi non penso che tu possa migliorare su questo. –