Jaki jest właściwy sposób używania różnych wersji intrinsics SSE w GCC?
Zadam pytanie, podając przykład. Teraz mam funkcję o nazwiedo_something()
.
Ma trzy wersje:do_something()
, do_something_sse3()
, ido_something_sse4()
. Po uruchomieniu mojego programu wykryje on funkcję procesora (sprawdź, czy obsługuje SSE3 lub SSE4) i odpowiednio wywołaj jedną z trzech wersji.
Problemem jest: Kiedy buduję swój program za pomocą GCC, muszę go ustawić-msse4
dlado_something_sse4()
skompilować (np. dla pliku nagłówkowego<smmintrin.h>
do włączenia).
Jeśli jednak ustawię-msse4
, następnie gcc może używać instrukcji SSE4, a niektóre wewnętrznedo_something_sse3()
jest także tłumaczony na niektóre instrukcje SSE4. Jeśli więc mój program działa na procesorze, który ma tylko obsługę SSE3 (ale nie obsługuje SSE4), powoduje „nielegalne instrukcje”, gdy połączeniado_something_sse3()
.
Może mam złą praktykę. Czy możesz podać jakieś sugestie? Dzięki.