2012-04-28 3 views
4

Visual Studio에서 컴파일 할 수있는 SIMD의 행렬 곱셈에이 코드를 썼지 만 이제는 gcc/g ++를 사용하여 우분투에서 컴파일해야합니다.gcc로 SIMD 코드를 컴파일하는 법

이것을 컴파일하는 데 사용해야하는 명령은 무엇입니까? 코드 자체를 변경해야합니까?

#include <stdio.h> 
#include <stdlib.h> 
#include <xmmintrin.h> 
#include <iostream> 
#include <conio.h> 
#include <math.h> 
#include <ctime> 

using namespace std; 

#define MAX_NUM 1000 
#define MAX_DIM 252 

int main() 
{ 
    int l = MAX_DIM, m = MAX_DIM, n = MAX_DIM; 
    __declspec(align(16)) float a[MAX_DIM][MAX_DIM], b[MAX_DIM][MAX_DIM],c[MAX_DIM][MAX_DIM],d[MAX_DIM][MAX_DIM]; 

    srand((unsigned)time(0)); 

    for(int i = 0; i < l; ++i) 
    { 
     for(int j = 0; j < m; ++j) 
     { 
      a[i][j] = rand()%MAX_NUM; 
     } 
    } 

    for(int i = 0; i < m; ++i) 
    { 
     for(int j = 0; j < n; ++j) 
     { 
      b[i][j] = rand()%MAX_NUM; 
     } 
    } 

    clock_t Time1 = clock(); 

    for(int i = 0; i < m; ++i) 
    { 
     for(int j = 0; j < n; ++j) 
     { 
      d[i][j] = b[j][i]; 
     } 
    } 

    for(int i = 0; i < l; ++i) 
    { 
     for(int j = 0; j < n; ++j) 
     { 
      __m128 *m3 = (__m128*)a[i]; 
      __m128 *m4 = (__m128*)d[j]; 
      float* res; 
      c[i][j] = 0; 
      for(int k = 0; k < m; k += 4) 
      { 
       __m128 m5 = _mm_mul_ps(*m3,*m4); 
       res = (float*)&m5; 
       c[i][j] += res[0]+res[1]+res[2]+res[3]; 
       m3++; 
       m4++; 
      } 
     } 
     //cout<<endl; 
    } 

    clock_t Time2 = clock(); 
    double TotalTime = ((double)Time2 - (double)Time1)/CLOCKS_PER_SEC; 
    cout<<"Time taken by SIMD implmentation is "<<TotalTime<<"s\n"; 

    Time1 = clock(); 

    for(int i = 0; i < l; ++i) 
    { 
     for(int j = 0; j < n; ++j) 
     { 
      c[i][j] = 0; 
      for(int k = 0; k < m; k += 4) 
      { 
       c[i][j] += a[i][k] * b[k][j]; 
       c[i][j] += a[i][k+1] * b[k+1][j]; 
       c[i][j] += a[i][k+2] * b[k+2][j]; 
       c[i][j] += a[i][k+3] * b[k+3][j]; 

      } 
     } 
    } 

    Time2 = clock(); 
    TotalTime = ((double)Time2 - (double)Time1)/CLOCKS_PER_SEC; 
    cout<<"Time taken by normal implmentation is "<<TotalTime<<"s\n"; 

    getch(); 
    return 0; 
} 
+0

내 질문 우분투와 g ++에서이 코드를 컴파일하는 방법입니다 또는 gcc 컴파일러 ... 나는 성공적으로 윈도우에서 Visual Studio로 컴파일되었지만 우분투에서 컴파일하는 방법을 모른다. – abhinav

답변

7

예를 들어 SSE를 활성화해야합니다.

declspec(align(16)) 

는 Windows 관련되는, 더 많은 휴대용으로 :

$ g++ -msse3 -O3 -Wall -lrt foo.cpp -o foo 

또한 변경해야합니다

__attribute__ ((aligned(16))) 
+0

이처럼 많은 오류가 발생한다. // matrix_simd.cpp : 25 : 오류 : 'a'가이 범위에서 선언되지 않았습니다. – abhinav

+0

하지만 성공적으로 컴파일하고 Windows에서 Visual Studio를 실행할 수있었습니다.이 오류가 발생하면 여기에 헤더를 추가해야합니까 ??? – abhinav

+0

위의 편집 내용보기 –

관련 문제