2012-04-07 5 views
1

私は2つのコアと4つのスレッドを持つインテルi5コアマシンで並列アルゴリズムを開発しています。コア番号に関する並列化の制限

nは、計算を実行するマトリックスのサイズを定義します。下の表から分かるように、1スレッドから2スレッドの使用率はほぼ50%削減されますが、2スレッドと4スレッドの間にはほとんど違いはありません。数字は私のコンパイラは、Windowsプラットフォーム上でmingwの-gccのある

#of threads - computation time

を通過した秒を表します。私の並列化ツールはopenmpです。私は並列ルーチンの最初にomp_set_num_threads(numThreads);でスレッドの数を定義しています。

"実際の" 8コアマシンでアルゴリズムをテストする手段がありません。私のi5マシンでは、1スレッドで、タスクマネージャーはCPUパワーの25%が使用されていることを示しています。 2つのスレッドでは50%、4つのスレッドでは96-99%が予想通りです。

そのような状況の理由は何ですか?なぜ計算時間が半分にならないのですか?

平行コードセグメントは下記の通りである:

#pragma omp parallel for schedule(guided) shared(L,A) \ 
    private(i) 
    for (i=k+1;i<row;i++){ 
     double dummy = 0; 
     for (int nn=0;nn<k;nn++){ 
      dummy += L[i][nn]*L[k][nn]; 
      L[i][k] = (A[i][k] - dummy)/L[k][k]; 
     } 
    } 
+0

メモリが制限されている可能性があります。あるいは、反復の間に2つの多くの依存関係があるかもしれません。ところで、これはコレスキー分解ですか? –

+0

独立した/プライベートのアレイ/スレッド対を共有していることを比較しましたか? – gbulmer

+0

@Oil Charlesworthはい、これはコレスキー分解アルゴリズムの一部です。しかし、私は記憶が限られているとは思わない。 n = 5000の場合、コンピュータは4 GB容量の362 MBを使用します。 –

答えて

4

さて、マシンは2コア4スレッドを有しています。

あなただけの2つのコアを持っているので、あなたが1から4倍のスピードアップを取得することはありません - 4スレッド。

第2に、より多くのスレッドに拡張すると、メモリ帯域幅の最大化など、リソースの競合が発生する可能性が高くなります。

+0

しかし、私はいくつかのスピードアップ権利を取得する必要がありますか?私はそれがタスクマネージャーによると100%のCPU使用率に対して50%であることを意味します。したがって、4つのスレッドは、2つのスレッドケースでアイドル状態のソースの一部を使用する必要があります。 –

+0

あなたはスピードアップを始めています。 '177.669' - >' 162.182'小さくても、それはHyperthreadingのかなりの量です。あなたが完全なテストコードを投稿したら、私はいくつかのマシン、4コア/ 8スレッド、8コア/ 8スレッド、16コア/ 16スレッドでこれを実行できます... – Mysticial

+0

ありがとう。私は自分のコードのスケーラビリティをテストするためにhpcを借りなければならないと考えています。自宅のコンピュータはそれについての手がかりを与えません。 –

関連する問題