2014年4月8日火曜日

使ってはいけないPAUSE命令

仕事でmanycoreのスケーラビリティなんかを調査する必要がでてきた。

で、いろいろ調べて適当なベンチマークを使ってたんだけど、2008年頃に作られたベンチマークでspinlockの中でアセンブラのpause命令を多用してた。

google先生に聞くと、spinlockでpauseを使って性能アップ!みたいなiSUSの記事が出てくるんで、そのままにしてたんだけど、よくよく考えると、pause命令ってパイプラインに空命令を流し込むような処理をしてるんだよね。

当時は1スレッドでパイプライン埋めれなかったとかで問題ないんだろうけど、今だと1スレッドでパイプライン埋めれるので、無駄に空命令流し込むと、SMT使ってると性能ガタ落ちのはず。ちょwww

明日修正して再度計測するわ。


で、修正してみたんだけど、並列に同時に処理してばっと終わるようなコードではあまり影響が出なかった。マルチスレッドで順々にデータを渡すような処理で、空き時間をPAUSEで待ってると、結構影響があった。Xeon Phiを使ってたので、_mm_delay(1)とに置き換えて試した。

0 件のコメント:

コメントを投稿