2016-09-11 7 views
0

マトリックス回ベクトルと私は、プロセスをスピードアップしたいのOpenMPとC:私はループの多くのマトリックス回ベクトルを作ってみました

は、ここで私もあると思います私のコード

#include <stdio.h> 
#include <time.h> 
#include <omp.h> 

int main() 
{ 
    int i, j, n, a[719][719], b[719], c[719]; 

    clock_t start = clock(); 

    n = 100; //Max 719 

    printf("Matrix A\n"); 

    for (i = 0; i < n; ++i) { 
     for (j = 0; j < n; ++j) { 
      a[i][j] = 10; 
      printf("%d ", a[i][j]); 
     } 
     printf("\n"); 
    } 

    printf("\nMatrix B\n"); 

    #pragma omp parallel private(i) shared(b) 
    { 
     #pragma omp for 
     for (i = 0; i < n; ++i) { 
      b[i] = 5; 
      printf("%d\n", b[i]); 
     } 
    } 

    printf("\nA * B\n"); 

    #pragma omp parallel private(i) shared(c) 
    { 
     #pragma omp for 
     for (i = 0; i < n; ++i) { 
      c[i] = 0; 
     } 
    } 

    #pragma omp parallel private(i,j) shared(n,a,b,c) 
    { 
     #pragma omp for schedule(dynamic) 
     for (i = 0; i < n; ++i) { 
      for (j = 0; j < n; ++j) { 
       c[i] += b[j] * a[j][i]; 
      } 
     } 
    } 


    #pragma omp parallel private(i) shared(c) 
    { 
     #pragma omp for 
     for (i = 0; i < n; ++i) { 
      printf("%d\n", c[i]); 
     } 
    } 

    clock_t stop = clock(); 
    double elapsed = (double)(stop - start)/CLOCKS_PER_SEC; 
    printf("\nTime elapsed: %.5f\n", elapsed); 

    return 0; 
} 

ですこのコードでは効果のない部分がたくさんありますが、誰かがコードを有効なものに修正して処理を高速化できるのであれば、私は感謝します。

+0

'c [i] + = b [j] * a [j] [i]'あなたがしたい最初のインデックスを上手く通らないキャッシュです。 i] [j] 'である。いずれにしても、正しい場合でも、メモリ帯域幅が制限されます。 –

答えて

0

私は最近似たようなことをしようとしました2つのコアとハイパースレッディングを使って私が望んだ結果を得られない私のプログラムと線形実装に対するスピードアップはごくわずかであり、行列を非常に大きく使用していました。小さなサイズの行列では、スレッドオーバーヘッドのためにアルゴリズムが遅くなるだけです。

collapse(n)ステートメントを使用できます。スレッディングはネストされたループに適用されます。オーバーヘッドを減らす必要があります。 OpenMPディレクティブの概要はこちら(崩壊):http://bisqwit.iki.fi/story/howto/openmp/

私がここに書いたコードを確認することができます:http://pastebin.com/edi4DgrJ 行列のサイズをコンパイル時に定義することができます。定義を変更するだけです。

プログラミングセッションをスピードアップする "縮約" OpenMPディレクティブ(parallel forなど)を使用することもできます(また、コードの可読性が優れていると思います)。

関連する問題