我正在尝试使用cmake编译一个使用SIMD指令的C程序。 当我尝试编译它时,我遇到了两个错误:
/usr/lib/gcc/x86_64-linux-gnu/5/include/smmintrin.h:326:1:错误:调用always_inline‘_mm_mullo_epi32’失败:目标特定选项不匹配 _mm_mullo_epi32 (__m128i __X, __m128i __Y)
/usr/lib/gcc/x86_64-linux-gnu/5/include/tmmintrin.h:136:1:错误:调用always_inline‘_mm_shuffle_epi8’失败:目标特定选项不匹配 _mm_shuffle_epi8 (__m128i __X, __m128i __Y)
这个问题已经在StackOverflow中解决,方法是设置:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.1")
我尝试了相同的和许多其他选项。 但我的项目仍无法编译。
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.1")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -sse4_1")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=nehalem")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.1 -msse4.2")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ssse3")
-march=haswell
的选项,而不仅仅使用-mavx2 -mfma
。或者至少在您的-m
ISA选项中添加-mtune=znver2
(Zen 2)或其他内容。对于可能未对齐的256位向量,"通用"调整可能非常差,特别是当您的数据通常在运行时对齐但编译器不知道时。请参见为什么gcc不能将_mm256_loadu_pd
解析为单个vmovupd?。或者,如果您想为自己的机器制作二进制文件,请使用-march=native
。 - Peter Cordes