错误:使用未声明的标识符'_mm_shuffle_epi8'Ubuntu 16.04 Ryzen

时间:2017-08-24 01:39:20

标签: ubuntu gcc clang simd

所以我在尝试编译Dolphin时遇到了这个错误。我已经尝试过clang-3.7和3.8以及GCC 5.2和6.3。奇怪的是,所有其他_mm函数似乎都有效,它只是这一个。

1 个答案:

答案 0 :(得分:1)

SSE2是x86-64的基线,这就是其他_mm函数有效的原因(您可能只尝试过SSE2函数,而不是_mm_abs_epi8或{{1}等任何其他SSE3 / SSSE3 / SSE4函数})。

与MSVC不同,您需要_mm_cvtepi16_epi32(在您的情况下由-mssse3-march=native启用)才能使用SSSE3内在函数与gcc / clang

请注意,-march=znver1未设置-mssse3,但-mtune=确实设置了调整,因此最好使用-march=而不是仅使用{启用一对ISA扩展{1}}或者其他什么,特别是如果你只打算在一个目标CPU上运行二进制文件。

例如,要启用AVX2,最好使用-march=native-mpopcnt -msse4.1,因为-march=haswell不会覆盖-march=znver1的{​​{1}}行为,即使没有支持AVX2的CPU受益(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80568)。即-mavx2始终使用完全通用的调整设置,而不是调整支持启用的扩展的任何CPU集。

Sandybridge确实受益于-mtune=generic / -mavx256-split-unaligned-load,但它只支持AVX,而不支持AVX2。即使这样,只有当数据在运行时实际上未对齐时,如果您的数据在99%的时间内都是对齐的,那么您可能不希望这样。