Maneira correta de habilitar o SSE4 em uma função / por bloco de código?
Para um dos meus programas OS X, tenho alguns casos otimizados que usam instruções SSE4.1. Em máquinas somente SSE3, a ramificação não otimizada é executada:
// SupportsSSE4_1 returns true on CPUs that support SSE4.1, false otherwise
if (SupportsSSE4_1()) {
// Code that uses _mm_dp_ps, an SSE4 instruction
...
__m128 hDelta = _mm_sub_ps(here128, right128);
__m128 vDelta = _mm_sub_ps(here128, down128);
hDelta = _mm_sqrt_ss(_mm_dp_ps(hDelta, hDelta, 0x71));
vDelta = _mm_sqrt_ss(_mm_dp_ps(vDelta, vDelta, 0x71));
...
} else {
// Equivalent code that uses SSE3 instructions
...
}
Para que o acima seja compilado, eu tive que definirCLANG_X86_VECTOR_INSTRUCTIONS
parasse4.1
.
No entanto, isso parece instruir o clang de que não há problema em usar oROUNDSD
instruções em qualquer lugar do meu programa. Portanto, o programa está travando em máquinas somente SSE3 comSIGILL: ILL_ILLOPC
.
Qual é a melhor prática para ativar o SSE4.1 apenas para as linhas do código dentro da verdadeira ramificação doSupportsSSE4_1()
se bloquear?