¿Forma correcta de habilitar SSE4 por función / por bloque de código?
Para uno de mis programas OS X, tengo algunos casos optimizados que usan instrucciones SSE4.1. En máquinas solo SSE3, se ejecuta la rama no optimizada:
// 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 poder compilar lo anterior, tuve que configurarCLANG_X86_VECTOR_INSTRUCTIONS
asse4.1
.
Sin embargo, esto parece indicar a Clang que está bien usar elROUNDSD
instrucción en cualquier parte de mi programa. Por lo tanto, el programa se bloquea en máquinas solo SSE3 conSIGILL: ILL_ILLOPC
.
¿Cuál es la mejor práctica para habilitar SSE4.1 solo para las líneas del código dentro de la rama verdadera de laSupportsSSE4_1()
si bloque?