私は2つのコアと4つのスレッドを持つインテルi5コアマシンで並列アルゴリズムを開発しています。コア番号に関する並列化の制限
nは、計算を実行するマトリックスのサイズを定義します。下の表から分かるように、1スレッドから2スレッドの使用率はほぼ50%削減されますが、2スレッドと4スレッドの間にはほとんど違いはありません。数字は私のコンパイラは、Windowsプラットフォーム上でmingwの-gccのある
を通過した秒を表します。私の並列化ツールは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];
}
}
メモリが制限されている可能性があります。あるいは、反復の間に2つの多くの依存関係があるかもしれません。ところで、これはコレスキー分解ですか? –
独立した/プライベートのアレイ/スレッド対を共有していることを比較しましたか? – gbulmer
@Oil Charlesworthはい、これはコレスキー分解アルゴリズムの一部です。しかし、私は記憶が限られているとは思わない。 n = 5000の場合、コンピュータは4 GB容量の362 MBを使用します。 –