2012-02-07 2 views
2

내가 헤더 파일을 포함했다 _mm_clmulepi64_si128()오류 : _mm_clmulepi64_si128은이 범위에서 선언되지 않은

새로운 인텔/AMD 프로세서에있는 올림이없는 곱셈 명령을 사용하려고하고 있는데이 -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; 
} 
+2

어떤 운영 체제가 어떤 버전의 컴파일러입니까? 함수가 선언되어 있다면'immintrin.h '를 보았습니까? 사용하는 컴파일러 및 헤더 파일의 버전이이 명령을 지원하는지 확인하십시오? (컴파일러의 문서를보십시오). – Jesper

+0

이것은 C++보다 C가 아닙니다. 유감스럽게도 pedant ... – Dennis

+0

OS는 우분투 .. 컴파일러는 g ++ 4.6.1 .. 그리고 데니스, 네 말이 맞아 .. 그게 .. C ... 나는 틀린 것을 붙여 넣었다 ... 그 C 버전은 설명서 ... 내 버전에 문제가 있는지 확인하기 위해 컴파일 중이었습니다 ...하지만 두 파일에서 같은 오류가 발생했습니다 ... 또 다른 헤더 파일이 있는데, 그 이유는 무엇 때문에 int가 먼저 표시되지 않습니다. 게시물 ... (wmmintrin.h). – projection

답변

0

에 선언되지 않은 내가 이름 mangeling 당신의 방법에 있다고 생각한다. C++ 컴파일러 대신 C 컴파일러를 사용해야합니다. 즉, g ++ 대신에 gcc source.c -options ....를 호출하십시오.

그리고이 확장을 지원하는 CPU가 여전히 필요합니다.

+0

같은 gcc와 g ++의 두 경우 모두 오류가 발생합니다. – projection

3

-mpclmul-msse4.1으로 컴파일해야 _mm_clmulepi64_si128()을 사용해야합니다. 또한 적절한 헤더 파일을 포함시켜야합니다. Clang 및 GCC에서는 <x86intrin.h>을 포함해야합니다. Intel, VC++ 및 기타 컴파일러는 <wmmintrin.h>이 필요합니다. 당신이 프로세서는 현대와 교육을 지원

경우, -march=native 등 SSE4_1, SSE4_2, PCLMUL, AVX, AVX2, BMI, BMI2 포함하여 프로세서의 모든 기능을 얻어야한다

3

시도

#include <x86intrin.h> 

대신

#include <immintrin.h> 

으로 설정하고 gcc 플래그 -msse2 -msse4.1 -mpclmul을 설정하십시오.

관련 문제