Надлежащий способ включить SSE4 для каждой функции / блока кода?
Для одной из моих программ OS X у меня есть несколько оптимизированных случаев, в которых используются инструкции SSE4.1. На машинах только для SSE3 неоптимизированная ветвь запускается:
// 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
...
}
Чтобы скомпилировать вышесказанное, мне нужно было установитьCLANG_X86_VECTOR_INSTRUCTIONS
вsse4.1
.
Тем не менее, это, кажется, инструктирует Clang, что можно использоватьROUNDSD
Инструкция в любом месте моей программы. Следовательно, программа падает на компьютерах только с SSE3 сSIGILL: ILL_ILLOPC
.
Какова лучшая практика для включения SSE4.1 только для строк кода внутри истинной ветвиSupportsSSE4_1()
если блок?