2014-12-11 3 views
0

저는 SIMD의 기초를 배우므로 SSE와 SSE2에서 작동하는 원리를 알기위한 간단한 코드 조각을 받았습니다.C의이 SIMD 예제 코드가 minGW로 컴파일되지만 실행 파일이 Windows 컴퓨터에서 실행되지 않는 이유는 무엇입니까?

최근 Visual Studio 컴파일러 대신 gcc가있는 Windows에서 C 코드를 컴파일하기 위해 minGW가 설치되었습니다.

이 예의 목적은 두 개의 부동을 추가 한 다음 세 번째 부동 소수점을 곱하는 것입니다.

#include <time.h> 
#include <stdio.h> 
#include <xmmintrin.h> 
#include <pmmintrin.h> 
#include <time.h> 
#include <sys/time.h> // for timing 

그럼 내가 계산 사이의 시간을 비교, 그것이 무엇인지 시간을 확인하는 기능을 가지고 :

헤더는 (필자는 SSE의 내장 함수를 사용할 수 있도록 사용되는 추측되는) 다음과 같다 포함 :

void run_scalar(){ 
    unsigned int i; 
    for(i = 0; i < N; i++){ 
    rs[i] = (a[i]+b[i])*c[i]; 
    } 
} 
:

double now(){ 
    struct timeval t; double f_t; 
    gettimeofday(&t, NULL); 
    f_t = t.tv_usec; f_t = f_t/1000000.0; f_t +=t.tv_sec; 
    return f_t; 
} 

은 "스칼라"의미에서 계산을 수행하는 기능은 다음과 같다 이를 초기화하기 위해 호출되는 벡터는 다음과 같은 방식으로 정의된다

void run_sse2(){ 
    unsigned int i; 
    __m128 *mm_a = (__m128 *)a; 
    __m128 *mm_b = (__m128 *)b; 
    __m128 *mm_c = (__m128 *)c; 
    __m128 *mm_r = (__m128 *)rv; 
    for(i = 0; i <N/4; i++) 
    mm_r[i] = _mm_mul_ps(_mm_add_ps(mm_a[i],mm_b[i]),mm_c[i]); 
    } 

(N은 벡터의 크기이며,이 곳에서 정의된다)와 기능의 init() : 여기

는 SSE2 함수의 코드이다 :

float a[N] __attribute__((aligned(16))); 
float b[N] __attribute__((aligned(16))); 
float c[N] __attribute__((aligned(16))); 
float rs[N] __attribute__((aligned(16))); 
float rv[N] __attribute__((aligned(16))); 

void init(){ 
    unsigned int i; 
    for(i = 0; i < N; i++){ 
     a[i] = (float)rand()/RAND_MAX/N; 
     b[i] = (float)rand()/RAND_MAX/N; 
     c[i] = (float)rand()/RAND_MAX/N; 
    } 
} 

마지막으로 여기에 함수를 호출하고 결과 및 계산 시간을 인쇄하는 주입니다. 합계 이유로

int main(){ 
    double t; 
    init(); 
    t = now(); 
    run_scalar(); 
    t = now()-t; 
    printf("S = %10.9f Temps du code scalaire : %f seconde(s)\n",1e5*sum(rs),t); 
    t = now(); 
    run_sse2(); 
    t = now()-t; 
    printf("S = %10.9f Temps du code vectoriel 2: %f seconde(s)\n",1e5*sum(rv),t); 
} 

내가 "의 gcc -o VEC vectorial.c -msse -msse2 -msse3"또는 "mingw32-의 gcc -o VEC vectorial.c -msse -msse2의 명령 줄이 코드를 컴파일하는 경우 -msse3 ""문제없이 컴파일하지만 어떤 이유로 Windows 컴퓨터에서 실행할 수 없습니다. 명령 프롬프트에서 "액세스가 거부되었습니다"라는 큰 메시지가 화면에 나타납니다. "이 응용 프로그램은" PC에서 실행하여 PC 버전을 찾으려면 소프트웨어 게시자에게 문의하십시오. "

나는 무슨 일이 일어나고 있는지 전혀 알지 못하며, MinGW 또는 C에 대한 많은 경험이 없습니다 (단지 입문 물론 리눅스 머신에서 C++로 처리했다.) 나는 다른 헤더로 놀아 보려고 노력했다. 아마도 내 PC에있는 프로세서와 다른 프로세서를 목표로 삼고 있었지만 문제를 해결할 수 없었을 것입니다. 내가 찾은 대부분의 정보는 혼란 스러웠습니다.

누군가가 나를 어떻게 이해할 수 있습니까? Linux 플랫폼을 대상으로 컴파일하는 minGW 구성의 문제점입니까? 그것은 Windows에서 상응하는 것이없는 코드에서 무엇입니까?

내가 64 비트 Windows 8.1 PC

편집에서 실행하기 위해 노력하고있어 : 아래에 링크 된 사이트에 제안 된 구성을 시도했다. 출력은 동일하게 유지됩니다.

MSYS를 실행하려고하면 "잘못된 파일 번호"가 표시됩니다. 명령 프롬프트를 실행하려고하면 액세스가 거부됩니다.

사용 권한 때문에 발생하는 일종의 버그가 있다고 생각합니다. 바이러스 백신 및 사용자 계정 컨트롤을 해제하려고 시도했지만 운이 아직 없습니다.

아이디어가 있으십니까?

+0

아마도 교차 컴파일러는 x64를 대상으로하지만 32 비트 Windows에서 실행하려고합니까? –

+0

GCC로 컴파일 된 간단한 "hello world"프로그램을 실행할 수 있습니까? –

+0

예,했는데 정상적으로 실행됩니다 :/ –

답변

1

코드에 아무런 문제가 없으며 sum() 또는 N의 정의를 제공하지 않았지만 문제는 없습니다. 스위치 -msse -msse2이 필요하지 않은 것 같습니다.

저는 리눅스 (우분투 x86_64, gcc 4.8.2 및 4.6.3, Atom D2700 및 AMD Athlon LE-1640) 및 Windows7/64 (gcc 4.5로 컴파일 됨)에서 코드를 컴파일하고 실행할 수있었습니다. 3 (32 비트) 및 4.8.2 (64 비트), Core i3-4330 및 Core i7-4960X). 그것은 문제없이 달리고 있었다.

CPU가 필수 지침을 지원합니까? 오류 코드는 정확히 무엇입니까? 어떤 MinGW 구성을 사용 했습니까? 호기심에서, 나는 매우 똑 바른 http://win-builds.org/download.html에 이용할 수있는 것을 사용했다.

그러나 최적화 플래그 -O3을 사용하면 스칼라 루프가 가장 좋습니다. 또한 유용한 것은 -m64 -mtune=native -s입니다.

+0

마지막 단락에 대해서 :'-O3'에서 자동 벡터화가 가능합니다. 그래서 대부분 "스칼라"버전은 전혀 스칼라가 아닌 것으로 컴파일됩니다. –

+0

MY CPU는 i7-4860HQ입니다. 내 minGW가 내 CPU 또는 그와 비슷한 것을 목표로 설정되지 않았다는 것을 추측하고 있습니다. MinGW에 전혀 익숙하지 않아 문제가 어디서 발생했는지 추측 할 수 있습니다. 나는 4.8.1 gcc 버전을 가지고있다, 나는 그들의 웹 사이트에서 MinGW를 방금 내려 준 후 기본 설정을위한 지침을 따른다. 웹 사이트의 설치 지침에 따라 제안했지만 사용하지 않으려 고 노력했습니다. Mysys를 통해 컴파일러를 실행하고 exe를 실행하려고하면 오류 또는 경고없이 컴파일이 진행되지만 exe를 실행하려고하면 "잘못된 파일 번호"가 표시됩니다. –

+0

MinGW와 gcc를 사용하는 법을 배우기 위해 내가하고있는 일과 MinGW 웹 사이트가 정말로 명확하지 않거나 초보자 친화적인지 전혀 알지 못하는 것 같아요. BTW : 답변 해 주셔서 감사합니다. –