【发布时间】:2013-03-13 04:10:21
【问题描述】:
我会举个例子来问我的问题。现在我有一个名为do_something() 的函数。
它有三个版本:do_something()、do_something_sse3() 和do_something_sse4()。当我的程序运行时,它会检测 CPU 特性(看它是否支持 SSE3 或 SSE4)并相应地调用三个版本之一。
问题是:当我使用 GCC 构建程序时,我必须为 do_something_sse4() 设置 -msse4 才能编译(例如,要包含头文件 <smmintrin.h>)。
但是,如果我设置-msse4,那么gcc就可以使用SSE4指令,do_something_sse3()中的一些内在函数也会被翻译成一些SSE4指令。因此,如果我的程序在仅支持 SSE3(但不支持 SSE4)的 CPU 上运行,则在调用 do_something_sse3() 时会导致“非法指令”。
也许我有一些不好的做法。你能给一些建议吗?谢谢。
【问题讨论】:
-
我认为标准的做法是在不同的编译单元中编译不同的版本。
-
@Mysticial,首先感谢您编辑我的问题。据我了解,“在单独的编译单元中编译不同的版本”是指:将所有
do_things_sse4放在一个文件functios_sse4.c中,并使用选项-msse4进行编译;并用-msse3编译functions_sse3.c。我会试试这个。 (我可能需要重构我的代码,这些代码最初是为 MSVC 编写的) -
是的,这正是我的意思。 :)
-
@BoPersson,某些功能可以通过使用一些新的 SSE4 指令来进一步加速。由于我们正在处理可能非常耗时的视频编码/解码,我认为 SSE4 优化是有意义的。
-
@BoPersson:仍然有很多计算机没有 SSE4/SSE3 支持,甚至没有任何 SSE 支持。非 SSE 版本适合他们。
标签: c gcc sse intrinsics