内联调用always_inline‘_mm_mullo_epi32’失败:目标特定选项不匹配

问题描述 投票:0回答:2

我正在尝试使用使用 SIMD 内在函数的 cmake 编译 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")  
c cmake x86 sse simd
2个回答
24
投票

寻找gcc指令开关的通用方法

文件 intrin.sh:

#!/bin/bash

get_instruction ()
{
    [ -z "$1" ] && exit
    func_name="$1[^1-9a-zA-Z_]"

    header_file=`grep --include=\*intrin.h -Rl "$func_name" /usr/lib/gcc | head -n1`
    [ -z "$header_file" ] && exit
    >&2 echo "found 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
./intrin.sh _mm_shl_epi8          # output: -mxop

20
投票

由于您正在编译 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")
© www.soinside.com 2019 - 2024. All rights reserved.