最適化問題に対する超高速&安定計算

大規模最適化問題、グラフ探索、機械学習やデジタルツインなどの研究のお話が中心

SDPA 7.3.x とマルチスレッド

2009年05月29日 03時05分53秒 | Weblog
今回は SDPA とマルチスレッドの内容になる(ほとんど業務連絡)。

例えば 8 コア(4 コア x 2 CPU) のマシンで動作させるとする。例えば OMP_NUM_THREADS=8 とすると、GotoBLAS も Schur complement 行列の計算も 8 スレッドで動作する。

1:行列全部が F3 式で計算される場合には BLAS を用いないので、8 コア上にちょうど 8 スレッドで収まる。
2:行列の一部が F1 式で計算されるとする。簡単のため 1 行だけ F1 式で計算されるとすると、ある 1 スレッドから GotoBLAS が呼び出されて DGEMM などでは、さらに 8 スレッドが生成される。このとき他の 7 スレッドは排他処理で一応停止させてあるが、コア数を大幅に越えるスレッドが存在するのでスレッド間の衝突(資源の奪い合い)が起こる。上記の排他制御から同時に 2 個のスレッドから F1 式が呼び出されることはない。
3:F2 式についても同様の排他制御を行っているが、F2 式の計算量が少ないので省略する。

○対策について
1: OMP_NUM_THREADS=4 に設定すると非常に高速になる。しかし Schur complement 行列の計算以外でも GotoBLAS を呼び出しているので、その部分は反対に遅くなることもある。GotoBLAS のスレッド数を動的に変更できると良い(上記の例では Schur complement 行列計算では OMP_NUM_THREADS=4、その他では OMP_NUM_THREADS=8)。

2:以下のように変更して GotoBLAS を作成する。しかし Schur complement 行列の計算以外での GotoBLAS の性能がかなり落ちてしまう。特に Schur complement 行列が疎になる場合では致命的に遅くなる。

変更1: 以下を 1 に変更する
# If you want to use legacy threaded Level 3 implementation.
USE_SIMPLE_THREADED_LEVEL3 = 1

変更2: 以下を 26 から 1 に変更する
CCOMMON_OPT += -DTHREAD_TIMEOUT=1
コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする