C++ ときどき ごはん、わりとてぃーぶれいく☆

USAGI.NETWORKのなかのひとのブログ。主にC++。

マルチスレッディングとプロセスプライオリティとコンテキストスイッチング(→ヨクワカラン)

TLに

てな感じでプロセスプライオリティの話が流れて来てたので、

をふわりと見て、それからふと、haskellのrepaさんで単純な畳み込みするにコンテキストスイッチングとプロセスプライオリティの影響たるや如何に、と気になったので確かめてみる事に。

おソース

@さんの連載の

にある簡単な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が増えている( ゚д゚)…

つまり、…ヨクワカラン(´・ω・`)