对于我的一个 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
to sse4.1
.
然而,这似乎指示 clang 可以使用ROUNDSD
我的程序中任何地方的指令。因此,程序在仅 SSE3 的机器上崩溃SIGILL: ILL_ILLOPC
.
仅对真实分支内的代码行启用 SSE4.1 的最佳实践是什么SupportsSSE4_1()
如果阻止?
目前还没有办法在 clang 中以块/函数粒度针对不同的 ISA 扩展。您只能在file粒度(将您的 SSE4.1 代码放入单独的文件中并指定要使用的文件-msse4.1
)。如果这对您来说是一项重要功能,请提交错误报告以请求它!
但是,我应该指出,实际的好处是DPPS
在大多数实际场景中非常小(并且使用DPPS
甚至减慢某些代码序列的速度!)。除非这个特定的代码序列很关键,并且您已经仔细测量了使用 DPPS 的效果,否则即使该编译器功能可用,也可能不值得为 SSE4.1 的特殊情况而烦恼。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)