Dziedzina m128i_i64
i rodzina to rozszerzenia specyficzne dla kompilatora firmy Microsoft. Nie istnieją w większości innych kompilatorów.
Niemniej jednak są przydatne do testowania.
Prawdziwym powodem unikania ich użycia jest wydajność. Sprzęt nie może efektywnie uzyskać dostępu do poszczególnych elementów wektora SIMD.
- Brak instrukcji pozwalających na bezpośredni dostęp do poszczególnych elementów. (SSE4.1 ma, ale wymaga stałego indeksu kompilacji).
- Przechodzenie przez pamięć może spowodować bardzo dużą karę z powodu awarii store forwarding.
AVX i AVX2 nie rozszerzają instrukcji SSE4.1, aby umożliwić dostęp do elementów w 256-bitowym wektorze. I o ile mogę powiedzieć, AVX512 nie będzie go miał dla 512-bitowych wektorów.
Podobnie zestaw nieodłączny (na przykład _mm256_set_pd()
) cierpi na ten sam problem. Są one implementowane jako seria operacji losowania danych. Lub przechodząc przez pamięć i przejmując stoiska ze sprzętem do przechowywania.
Które nasuwa się pytanie: Czy istnieje skuteczny sposób, aby wypełnić wektor SIMD z skalarnych komponentów? (lub oddzielić wektor SIMD na składniki skalarne)
Krótka odpowiedź: Niezupełnie. Kiedy używasz SIMD, oczekuje się, że wykonasz dużo pracy w wektorze. Więc narzut inicjalizacji nie powinien mieć znaczenia.
Pola są specyficzne dla firmy Microsoft. Oczywiście, nie przejmują się tym, ponieważ będą chcieli zablokować cię w swoim kompilatorze. Prawdziwy powód to wydajność. Nie ma skutecznego sposobu dostępu do poszczególnych elementów rejestru SSE. SSE4.1 ma instrukcje, aby to zrobić, ale indeks musi być stałą czasu kompilacji. – Mysticial