2016-05-25 3 views
1

OpenMPとキャッシュの競合についてもっと学びたいので、どのように動作するかを理解するための簡単なプログラムを書きました。私は単純なベクトルの追加のためにスレッドのスケーリングが悪くなっていますが、なぜそれは理解できません。これは私のプログラムです:OpenMPでのスケーリングが悪い(キャッシュの競合?)

これは次の出力を生成し実行
#include <iostream> 
#include <omp.h> 
#include <vector> 

using namespace std; 

int main(){ 

    // Initialize stuff 
    int nuElements=20000000; // Number of elements 
    int i; 
    vector<int> x, y, z; 
    x.assign(nuElements,0); 
    y.assign(nuElements,0); 
    z.assign(nuElements,0); 
    double start; // Timer 

    for (i=0;i<nuElements;++i){ 
     x[i]=i; 
     y[i]=i; 
    }  

    // Increase the threads by 1 every time, and add the two vectors 
    for (int t=1;t<5;++t){ 

     // Re-set z vector values 
     z.clear(); 

     // Set number of threads for this iteration 
     omp_set_num_threads(t); 

     // Start timer 
     start=omp_get_wtime(); 

     // Parallel for 
#pragma omp parallel for 
     for (i=0;i<nuElements;++i) 
     { 
      z[i]=x[i]+y[i]; 
     } 
     // Print wall time 
     cout<<"Time for "<<omp_get_max_threads()<<" thread(s) : "<<omp_get_wtime()-start<<endl; 
    } 
    return 0; 
} 

Time for 1 thread(s) : 0.020606 
Time for 2 thread(s) : 0.022671 
Time for 3 thread(s) : 0.026737 
Time for 4 thread(s) : 0.02825 

私は、このコマンドでコンパイル:clang++ -O3 -std=c++11 -fopenmp=libiomp5 test_omp.cpp

あなたが見ることができるように、スケーリングがちょうど数として悪くなりますスレッドの数が増えます。私はこれを4コアのIntel-i7プロセッサで実行しています。誰が何が起こっているか知っていますか?

+0

[this post](http://stackoverflow.com/a/11579987/5239503)をご覧ください。これは、1つのソケット/ NUMAノードを使用した場合のメモリー制約の問題で、パフォーマンスの向上が見られない理由を説明しています。ここでは、1つのコア(おそらく十分にベクトル化されたコード)で約12 GB/sのスループットを達成しています。あなたのハードウェアの仕様を確認してくださいが、私はあなたがはるかに良くできないと思います。 – Gilles

+0

正確なメモリ構成とCPUモデルに関する情報を提供してください。 – Zulan

答えて

0

CPUの速度ではなくメモリの帯域幅によって制限があります。あなたが行っていることが追加とコピーだけであれば、CPUを1つだけ使用してメモリを使用し続けるだけです。したがって、より多くのコアを追加することは役に立ちません。

さらにスレッドを追加する利点を確認するには、L1またはL2キャッシュに収まるほど小さな複雑な操作を実行してみてください。

+0

あなたは基本的に正しいかもしれませんが、これは一般的ではありません。「あなたが行っていることが追加とコピーだけであれば、CPUを1つだけ使用してメモリを使用するので、より多くのコアを追加することは役に立ちません。現在のシステムでは真実ではありません。また、デスクトップシステムと高性能システムの間には大きな違いがあります。後者は、メモリに束縛されていても、複数のスレッドからはるかに多くの利点があります。詳細については、[この回答](http://stackoverflow.com/a/36824169/620382)または[この回答のディスカッション](http://stackoverflow.com/a/37099530/620382)を参照してください。 – Zulan

+0

@ Zulanなぜそれが本当ですか?彼らがGPUと通信する方法がない場合、それらのスレッドは何をするつもりですか? – xaxxon

+0

@Zulan、私は彼のメモリと彼の* CPUを参照している、すべての現在のシステムに一般化していない、彼のメモリビジー状態を維持するためにCPUを1つだけ取ることをOPに伝える。 –