マルチスレッディングとプロセスプライオリティとコンテキストスイッチング(→ヨクワカラン)
TLに
“ Linuxでリアルタイム・プロセスを作るには…? - Okiraku Programming” htn.to/nBCjGn
— rtiさん (@super_rti) 6月 10, 2012
てな感じでプロセスプライオリティの話が流れて来てたので、
をふわりと見て、それからふと、haskellのrepaさんで単純な畳み込みするにコンテキストスイッチングとプロセスプライオリティの影響たるや如何に、と気になったので確かめてみる事に。
おソース
@shelarcyさんの連載の
にある簡単なrepaの畳み込み処理の計算量を単純に増やしてtimeってみる事に。
(※このソースの本来の意図は計算順序によって結果が変わるからfoldAllSの使い所があるのよ、って話な点は注意)
import Data.Array.Repa main = do let xs = fromListUnboxed (ix3 256 256 256) [(1::Double)..256**3] x <- foldAllP (-) 0 xs print x y <- foldAllP (/) 1 xs print y z <- foldAllP (+) 0 xs print z w <- foldAllP (\ a b -> sin a * cos b) 0 xs print w
実験環境
- CPU確認 → `cat /proc/cpuinfo`
- メモリー確認 → `dmidecode --type 17 | egrep "(Type|Speed):"`
実験環境1
- PhenomII X4 940BE @ 3.0GHz
- DDR2-800 8GB
- archlinux
% uname -a Linux LH-MAIN 3.3.7-1-ARCH #1 SMP PREEMPT Tue May 22 00:26:26 CEST 2012 x86_64 GNU/Linux % ghc --version The Glorious Glasgow Haskell Compilation System, version 7.4.1 % cabal list repa * repa Synopsis: High performance, regular, shape polymorphic parallel arrays. Default available version: 3.2.1.1 Installed versions: 3.1.4.2, 3.2.1.1 Homepage: http://repa.ouroborus.net License: BSD3
実験環境2
- Intel Core2 Quad Q9550 @ 2.83GHz
- DDR2-800 8GB
- archlinux
% uname -a Linux LH-LAB1 3.3.7-1-ARCH #1 SMP PREEMPT Tue May 22 00:26:26 CEST 2012 x86_64 GNU/Linux % ghc --version The Glorious Glasgow Haskell Compilation System, version 7.4.1 % cabal list repa * repa Synopsis: High performance, regular, shape polymorphic parallel arrays. Default available version: 3.2.1.1 Installed versions: 3.2.1.1 Homepage: http://repa.ouroborus.net License: BSD3
測定方法
% /usr/bin/time --version GNU time 1.7
実験内容
ベンチマーク用実行ファイルの生成
% ghc -Odph -fllvm -optlo-O3 -threaded test.hs -o test
ベンチマーク実施手順
% cat tester.sh /usr/bin/time --verbose ./test nice -20 /usr/bin/time --verbose ./test chrt 99 /usr/bin/time --verbose ./test nice -20 chrt 99 /usr/bin/time --verbose ./test /usr/bin/time --verbose ./test +RTS -N4 nice -20 /usr/bin/time --verbose ./test +RTS -N4 chrt 99 /usr/bin/time --verbose ./test +RTS -N4 nice -20 chrt 99 /usr/bin/time --verbose ./test +RTS -N4
実験結果
この例では`+RTS -N4`せずにシングルスレッドで計算させた方が速い(スレッド起動コストの方が大きい)点はさておいてしまうことにしましょう(´・ω・`)
`nice`ではVCS(voluntary context switch)もIVCS(involuntary context switch)も特に気にするほどの違いは出ていません。これは競合する高負荷のプロセスが存在しない場合は然程意味が無いかな。
`chrt`ではIVCSの現象が顕著で、明らかにコンテキストスイッチが抑え…と思ったがそれはintel Core2 Quad Q9550の環境2の場合のみで、AMD PhenomII X4 940の環境1では`+RTS -N4`時に`chrt`により爆発的にIVCSが増えている( ゚д゚)…
つまり、…ヨクワカラン(´・ω・`)