2015-09-17 31 views
5

Tak więc AVX ma funkcję z immintrin.h, która powinna zezwalać na przechowywanie konkatenacji dwóch wartości __m128i w jednej wartości __m256i. Funkcja jestUstawienie __m256i na wartość dwóch wartości __m128i

__m256i _mm256_set_m128i (__m128i hi, __m128i lo) 

Jednak, kiedy go używać, tak jak poniżej:

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

pojawia się błąd kompilacji:

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

I naprawdę nie rozumiem, dlaczego tak się dzieje. Każda pomoc jest bardzo cenna!

+3

Czy jesteś pewien, że funkcja znajduje się w tym nagłówku? Kiedy próbuję użyć tej funkcji tak jak po '#include ', pojawia się komunikat ostrzegawczy "domniemana deklaracja' _mm256_set_m128i' ". W języku C ukryta deklaracja oznacza, że ​​kompilator zakłada, że ​​funkcja zwróci wartość "int", co wyjaśnia również błąd kompilatora. –

Odpowiedz

9

Nie wszystkie kompilatory mają _mm256_setr_m128i, a nawet _mm256_set_m128i, zdefiniowane w immintrin.h. Więc zazwyczaj wystarczy zdefiniować makra, ile potrzeba, nawias z odpowiednimi #ifdef S, który test dla kompilatora i jego wersja:

#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 a później ma zarówno _mm256_set_m128i i _mm256_setr_m128i.

  • MSVC 2012 i późniejsze ma tylko _mm256_set_m128i.

  • gcc/clang nie wydają się mieć, chociaż nie sprawdziłem ostatnich wersji, aby sprawdzić, czy zostało to jeszcze poprawione.

+0

GCC wydaje się nie mieć nawet "_mm256_set_m128i" w nagłówku ... [Link] (http://ideone.com/f3gVol) –

+0

Chodzi o to ... Naprawdę zależy mi na wydajności tutaj, więc chcę użyć poprawnego instrukcja, a nie tylko uzyskać coś, co jest funkcjonalnie takie samo, jak –

+0

@MartinLauridsen: '_mm256_insertf128_si256' mapuje do pojedynczej instrukcji, więc nie sądzę, że możesz to poprawić. –