在GCC中使用不同版本的SSE内在函数的正确方法是什么?

she*_*eng 14 c gcc sse intrinsics

我举一个例子来问我的问题.现在我有一个叫做的函数do_something().

它有三个版本:do_something(),do_something_sse3(),和do_something_sse4().当我的程序运行时,它将检测CPU功能(看它是否支持SSE3或SSE4)并相应地调用三个版本之一.

问题是:当我建立我的程序与海湾合作委员会,我必须设置-msse4do_something_sse4()编译(如头文件<smmintrin.h>被包括在内).

但是,如果我设置-msse4,则允许gcc使用SSE4指令,并且一些内在函数do_something_sse3()也被转换为某些SSE4指令.因此,如果我的程序在仅支持SSE3(但没有SSE4)的CPU上运行,则在调用时会导致"非法指令" do_something_sse3().

也许我有一些不好的做法.你能提一些建议吗?谢谢.

kon*_*ski 9

我认为Mystical的提示很好,但是如果你真的想在一个文件中执行它,你可以使用适当的编译指示,例如:

#pragma GCC target("sse4.1")
Run Code Online (Sandbox Code Playgroud)

需要GCC 4.4,AFAIR.