错误:未在此范围内声明_mm_clmulepi64_si128

时间:2012-02-07 13:12:31

标签: c ubuntu gcc

我正在尝试使用新的intel / amd处理器_mm_clmulepi64_si128 ()上的无进位乘法指令

我已经包含了头文件,我正在使用-maes -msse4选项进行编译...但我仍然收到错误消息:

错误:_mm_clmulepi64_si128未在此范围内声明

#include < immintrin.h >
#include < wmmintrin.h >

int main()

{

    __m128i a;
    __m128i b;

    a.m128i_i64[1] = 2;
    a.m128i_i64[0] = -1284;
    b.m128i_i64[1] = 25;
    b.m128i_i64[0] = 65535;

    const int product1 = 0x11;
    const int product2 = 0x00;
    const int product3 = 0xF2;

    int expect1 = int ( a.m128i_i64[1] * b.m128i_i64[1] );
    int expect2 = int ( a.m128i_i64[0] * b.m128i_i64[0] );
    int expect3 = int ( a.m128i_i64[0] * b.m128i_i64[1] );

    __m128i result1 = _mm_clmulepi64_si128( a, b, product1 );
    __m128i result2 = _mm_clmulepi64_si128( a, b, product2 );
    __m128i result3 = _mm_clmulepi64_si128( a, b, product3 );

    return 0;
}

3 个答案:

答案 0 :(得分:3)

您需要使用-mpclmul-msse4.1进行编译才能使用_mm_clmulepi64_si128()。您还需要包含正确的头文件。在Clang和GCC下,您应该包含<x86intrin.h>。英特尔,VC ++和其他编译器需要<wmmintrin.h>

如果 您的处理器是现代的并且支持该指令,那么-march=native应该获得处理器的所有功能,包括SSE4_1,SSE4_2,PCLMUL,AVX ,AVX2,BMI,BMI2等

答案 1 :(得分:3)

尝试

#include <x86intrin.h>

而不是

#include <immintrin.h>

并设置gcc标志-msse2 -msse4.1 -mpclmul。

答案 2 :(得分:0)

我怀疑名字管理在你的方式。如果是C ++编译器,请确保使用C编译器,即调用gcc source.c -options ....而不是g ++

你仍然需要一个支持这种扩展的CPU。