OpenMPのスケジューリング方式"runtime"は速いのか!?
OpenMPにはstatic, dynamic, guided,auto,runtimeと5つのスケジューリング方式がある.細かいことは本記事の末尾のリンク先に任せるが,今回のテーマはruntime.
runtimeは実行時に実行ファイルが環境変数を読みに行ってstatic, dynamic, guidedの3つのうちどれにするかを切り替える方式.
runtimeを今まで使ってないなかったのは内部の挙動がわからないからで,
疑問1) #pragma omp句はプリプロセッサがpthreadに変換するはずなのに,実行時に実行ファイルが環境変数を読みに行って挙動を切り替えるというのは,どういう実行ファイルが生成されているんだ.という疑問.
疑問2) そして切り替えのせいで実行時間はどのくらい伸びるんだ.という疑問
今日は時間もないので,疑問(1)はさておき,取り敢えず使い方と(2).まず使い方は
#pragma omp parallel for schedule(runtime)
とつけて,
OMP_SCHEDULE="static"
export OMP_SCHEDULE
とやる.
わかったところで疑問(2)をやる.
純粋なスケジューリング方式ごとの差は僕の選んだ問題依存だから問題によって異なる.
対象問題:
細かいことは研究に抵触するので避けるが,研究に使っている疎行列ベクトル積.1000回の平均時間
結果(桁が小さいので1000倍した時間,単位は秒)
static 0.72
runtime(static) 0.74
dynamic 2.60
runtime(dynamic) 2.62
guided 0.72
runtime(guided) 0.75
結果,やっぱりちょっとだけ遅かった.最大でguidedの+4%だから差は小さいけど,多少は違うみたい.
実行ファイルのサイズもちょっと違っていてstaticの約2.5MBと比べて,
dynamic +256byte
guided -72KB
runtime +5KB
と,まぁどうでもいい値だけど5KBくらい多かった.っていうかguidedってファイルサイズ小さいんだね.
ということで,アプリケーションの人とかはruntime使ってもいいと思うけど,1%でも早くしたい細かいチューニング屋さんはruntimeは駄目かもしれない.