2017-08-24 66 views
-2

所以我在編譯Dolphin時遇到這個錯誤。我已經嘗試過clang-3.7和3.8以及GCC 5.2和6.3。奇怪的是,所有其他_mm函數似乎都可以工作,只是這一個。錯誤:使用未聲明的標識符'_mm_shuffle_epi8'Ubuntu 16.04 Ryzen

+3

您嘗試過其他什麼內建函數? '_mm_shuffle_epi8'在SSSE3中;你是否包括''或''?你是用'-mssse3'編譯的嗎? – nemequ

+0

我已經加了,我試過那個標誌,但它仍然拒絕。我覺得我錯過了一些東西,或者GCC/clang沒有爲Zen架構啓用此功能。 – Mitchell

+0

如果你爲一個x86目標指定SSSE3,那麼你使用的是什麼CPU並不重要;即使對於實際上不支持的目標,編譯器也必須生成代碼。檢查以確保'__SSSE3__'在預處理器中定義(哪個-mssse3應該這樣做)。另外,請注意,它是ssse3而不是sse3 ... – nemequ

回答

1

SSE2是基線x86-64的,這就是爲什麼其他_mm職能的工作(你可能只嘗試SSE2功能,沒有任何其他SSE3/SSSE3/SSE4功能,如_mm_abs_epi8_mm_cvtepi16_epi32)。

你需要-mssse3(在你的情況下,通過-march=native-march=znver1啓用)使用SSSE3內在用gcc /鐺,不像MSVC。


注意-mssse3不設置-mtune=,但-march=確實設置調整,所以最好使用-march=native,而不是隻讓一對夫婦ISA擴展與-mpopcnt -msse4.1什麼的,特別是如果你只打算運行一個目標CPU上的二進制文件。

例如,爲了使AVX2,它可能會更好使用-march=haswell-march=znver1,因爲-mavx2不會覆蓋的-mavx256-split-unaligned-load-mtune=generic行爲,即使沒有AVX2,支持的CPU從它(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80568)受益。即-mtune=generic總是使用完全通用的調整設置,而不是調整任何一組CPU支持啓用的擴展。

的SandyBridge確實受益於-mavx256-split-unaligned-load/...store,但它僅支持AVX,不AVX2。即使如此,只有當數據在運行時實際上沒有對齊時,如果您的數據在99%的時間內對齊,您可能不希望這樣。

相關問題