Richtige Methode zum Aktivieren von SSE4 auf der Basis von Funktionen / Codeblöcken?
Für eines meiner OS X-Programme habe ich einige optimierte Fälle, in denen SSE4.1-Anweisungen verwendet werden. Auf Nur-SSE3-Computern wird der nicht optimierte Zweig ausgeführt:
// 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
...
}
Um das Obige zu kompilieren, musste ich setzenCLANG_X86_VECTOR_INSTRUCTIONS
zusse4.1
.
Dies scheint jedoch zu erklären, dass es in Ordnung ist, die zu verwendenROUNDSD
Anleitung irgendwo in meinem Programm. Daher stürzt das Programm auf Nur-SSE3-Rechnern mit abSIGILL: ILL_ILLOPC
.
Was ist die beste Praxis für die Aktivierung von SSE4.1 für nur die Zeilen, die der Code innerhalb des wahren Zweigs derSupportsSSE4_1()
wenn blockieren?