xcode – 在每个功能/每个代码块的基础上启用SSE4的正确方法?

前端之家收集整理的这篇文章主要介绍了xcode – 在每个功能/每个代码块的基础上启用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指令.因此,程序在仅使用SIGILL:ILL_ILLOPC的SSE3计算机上崩溃.

为SSE4.1仅支持SupportsSSE4_1()if块的真分支内部代码行的最佳实践是什么?

解决方法

目前无法在clang中以块/函数粒度定位不同的ISA扩展.您只能以文件粒度执行此操作(将您的SSE4.1代码放入单独的文件中并指定该文件以使用-msse4.1).如果这对您来说是一项重要功能,请提交错误报告以申请!

但是,我应该注意到DPPS的实际好处在大多数实际场景中都非常小(并且使用DPPS甚至会减慢一些代码序列!).除非这个特定的代码序列是关键的,并且您已经仔细测量了使用DPPS的效果,否则即使该编译器功能可用,SSE4.1的特殊情况也可能不值得.

猜你在找的iOS相关文章