2012-04-28 29 views
4

私はVisual StudioでコンパイルできたSIMDの行列乗算のためにこのコードを書いていましたが、gcc/g ++を使用してUbuntuでコンパイルする必要があります。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

私の質問は、グラムでのUbuntuにこのコードをコンパイルする方法です++またはgccコンパイラ...私は成功し、ウィンドウでVisual Studioでコンパイルしましたが、ubuntuでコンパイルする方法はわかりません。 – abhinav

答えて

7

SSEを有効にする必要があります。

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

あなたはまた、変更する必要があります:Windows固有である

declspec(align(16)) 

を、よりポータブルに:

__attribute__ ((aligned(16))) 
+0

これは多くのエラーをこのように与えています // matrix_simd.cpp:25:エラー: 'a'はこのスコープで宣言されていません。 – abhinav

+0

しかし、それは正常にコンパイルし、私はWindowsでビジュアルスタジオで実行することができました。ここで私はこのエラーを取得している私はここに任意のヘッダーを追加する必要がありますか? – abhinav

+0

上記の編集を参照 –

関連する問題