2012年10月12日金曜日

SDPA-C で OpenBLAS のスレッド数制御

新しいSDPA-C の場合は、CHOLMOD を同時実行するので、CHOLMOD のなかで使われる OpenBLAS が同時実行されると衝突して性能が著しくおちることが分かった。
たとえば、1スレッドで80秒程度で解けていた問題が、4スレッドになると615秒かかる。
(このとき、top で見ると ksoftirqd というデーモンの使用率が大きくなり、スレッド切り替えが頻発していることが分かる)

そこで、CHOLMOD を同時実行する前に OpenBLAS のスレッド数を1に変更する修正をした。CHOLMOD 終了後は、4スレッドなどに戻すことになる。
この変更は、
void openblas_set_num_threads(int num_threads);
関数を使うと簡単にできる。ちなみに、この関数は
void gotoblas_set_num_threads(int num_threads);
を呼び出しているだけである。

これによって、80秒から64秒に短縮された。

あと、ATLAS は実行時にスレッド数を変更する機能がないのだが、debian パッケージの ATLAS だとなぜか衝突が起こらず問題にならない。
ATL_NTHREADS が 2 に設定されていたり、CPU 使用率が 200% 程度になることから、スレッド数が2でコンパイルされたバイナリと思うのだが、なぜ衝突しないのかは謎である。
SDPA-Cで測定すると、 1スレッド147秒, 2スレッド 79秒, 4スレッド 49秒と、衝突が起きていればおかしいほど時間短縮されるので、衝突していない。

いまは、もっと大きな問題を解くように数値実験中である。

今日の作業内容:SDPA-C 数値実験 3h
今日のランチ:シッダルータ キーマカレー
明日の予測作業時間:2h


0 件のコメント:

コメントを投稿