Qual é a maneira correta de usar diferentes versões de intrínsecos SSE no GCC?
Eu vou fazer a minha pergunta, dando um exemplo. Agora eu tenho uma função chamadado_something()
.
Tem três versões:do_something()
, do_something_sse3()
edo_something_sse4()
. Quando meu programa é executado, ele detecta o recurso da CPU (veja se ele suporta SSE3 ou SSE4) e chama uma das três versões de acordo.
O problema é: Quando eu construo meu programa com o GCC, eu tenho que definir-msse4
parado_something_sse4()
para compilar (por exemplo, para o arquivo de cabeçalho<smmintrin.h>
A ser incluído).
No entanto, se eu definir-msse4
, então o gcc pode usar instruções SSE4, e alguns intrínsecos emdo_something_sse3()
também é traduzido para algumas instruções SSE4. Então, se o meu programa roda na CPU que tem apenas suporte SSE3 (mas não SSE4), ele causa "instrução ilegal" quando as chamadasdo_something_sse3()
.
Talvez eu tenha alguma prática ruim. Você poderia dar algumas sugestões? Obrigado.