C 调用always_inline‘;时内联失败_mm_mullo_epi32’;:目标特定选项不匹配
我正在尝试使用cmake编译一个C程序,它使用SIMD内部函数。当我试图编译它时,我得到两个错误 /usr/lib/gcc/x86_64-linux-gnu/5/include/smmintrin.h:326:1:错误:调用always_inline'\u mm_mullo_epi32'时内联失败:特定于目标的选项不匹配 _毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米 /usr/lib/gcc/x86_64-linux-gnu/5/include/tmmintrin.h:136:1:错误:调用always_inline“\u mm_shuffle\u epi8”时内联失败:特定于目标的选项不匹配 _mm_shuffle_epi8(uuum128i_uuux,uuum128i_uuy) 此问题已在此处通过设置解决C 调用always_inline‘;时内联失败_mm_mullo_epi32’;:目标特定选项不匹配,c,cmake,x86,sse,simd,C,Cmake,X86,Sse,Simd,我正在尝试使用cmake编译一个C程序,它使用SIMD内部函数。当我试图编译它时,我得到两个错误 /usr/lib/gcc/x86_64-linux-gnu/5/include/smmintrin.h:326:1:错误:调用always_inline'\u mm_mullo_epi32'时内联失败:特定于目标的选项不匹配 _毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫米毫
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")
<>因为编译C代码,而不是C++,需要:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse4.1")
您可以取消所有其他-march XXX
和-msseXXX
设置
如果你使用C和C++的混合,那么你也可以添加:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.1")
<>因为编译C代码,而不是C++,需要:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse4.1")
您可以取消所有其他-march XXX
和-msseXXX
设置
如果你使用C和C++的混合,那么你也可以添加:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.1")
一种查找gcc指令开关的通用方法
文件intrin.sh:
#!/bin/bash
get_instruction ()
{
[ -z "$1" ] && exit
func_name="$1 "
header_file=`grep --include=\*intrin.h -Rl "$func_name" /usr/lib/gcc | head -n1`
[ -z "$header_file" ] && exit
>&2 echo "find in: $header_file"
target_directive=`grep "#pragma GCC target(\|$func_name" $header_file | grep -B 1 "$func_name" | head -n1`
echo $target_directive | grep -o '"[^,]*[,"]' | sed 's/"//g' | sed 's/,//g'
}
instruction=`get_instruction $1`
if [ -z "$instruction" ]; then
echo "Error: function not found: $1"
else
echo "add this option to gcc: -m$instruction"
fi
用法:
./intrin.sh _mm_shuffle_epi8 # output: -mssse3
./intrin.sh _mm_cvtepu8_epi32 # output: -msse4.1
./intrin.sh _mm_loadu_ps # output: -msse
./intrin.sh _mm_clmulepi64_si128 # output: -mpclmul
./intrin.sh _mm256_loadu_si256 # output: -mavx
./intrin.sh _mm512_and_ps # output: -mavx512dq
一种查找gcc指令开关的通用方法
文件intrin.sh:
#!/bin/bash
get_instruction ()
{
[ -z "$1" ] && exit
func_name="$1 "
header_file=`grep --include=\*intrin.h -Rl "$func_name" /usr/lib/gcc | head -n1`
[ -z "$header_file" ] && exit
>&2 echo "find in: $header_file"
target_directive=`grep "#pragma GCC target(\|$func_name" $header_file | grep -B 1 "$func_name" | head -n1`
echo $target_directive | grep -o '"[^,]*[,"]' | sed 's/"//g' | sed 's/,//g'
}
instruction=`get_instruction $1`
if [ -z "$instruction" ]; then
echo "Error: function not found: $1"
else
echo "add this option to gcc: -m$instruction"
fi
用法:
./intrin.sh _mm_shuffle_epi8 # output: -mssse3
./intrin.sh _mm_cvtepu8_epi32 # output: -msse4.1
./intrin.sh _mm_loadu_ps # output: -msse
./intrin.sh _mm_clmulepi64_si128 # output: -mpclmul
./intrin.sh _mm256_loadu_si256 # output: -mavx
./intrin.sh _mm512_and_ps # output: -mavx512dq
我还必须添加-maes或ti不适合我的设置(CMAKE_CXX_FLAGS“${CMAKE_CXX_FLAGS}-msse4.1-maes”),或者更好,如果为自己的机器编译,请使用
-march=native
。这将启用CPU的所有功能,并设置调优选项。我还必须添加-maes或ti不适合我设置(CMAKE_CXX_FLAGS“${CMAKE_CXX_FLAGS}-msse4.1-maes”),或者更好,如果为您自己的机器编译,请使用-march=native
。这将启用CPU的所有功能,并设置调整选项。请注意,通常最好使用-march=haswell
,而不仅仅是-mavx2-mfma
。或者至少在您的-m
ISA选项中添加-mtune=znver2
(Zen 2)或其他内容。对于可能未对齐的256位向量,“通用”调优可能非常糟糕,特别是当您的数据通常在运行时对齐,但编译器不知道这一点时。看见或者,如果您想为自己的机器制作二进制文件,-march=native
。感谢您的精彩脚本。救了我一命,回答得很好!请注意,通常最好使用类似于-march=haswell
,而不仅仅是-mavx2-mfma
。或者至少在您的-m
ISA选项中添加-mtune=znver2
(Zen 2)或其他内容。对于可能未对齐的256位向量,“通用”调优可能非常糟糕,特别是当您的数据通常在运行时对齐,但编译器不知道这一点时。看见或者,如果您想为自己的机器制作二进制文件,-march=native
。感谢您的精彩脚本。救了我一命,回答得很好!