我将通过举例来提出我的问题。现在我有一个名为 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()
时会引发“非法指令”的错误。
也许我有一些不好的实践。你能给出一些建议吗?谢谢。
round[ss/sd/ps/pd]
偶尔很棒,而ptest
和blendps
肯定有它们的用途)。但是,如果正确使用,SSSE3(主要是pshufb
和pmulhrsw
)以及AVX可以产生巨大的差异。 - Stephen Canon