Timings parSapply()
サイコロゲームの実行は「恥ずかしいほど並列化可能(embarrassingly parallel)」です。こうした種類のシミュレーションは、たいてい(いつもではありませんが)良いスピードアップが得られます。これまでと同様に、microbenchmark() または system.time() が使えます。今回は簡単のため、この演習では system.time() を使います。
この演習はコースの一部です
効率的なRコードの書き方
演習の手順
play() 関数はワークスペースに定義済みです。ここでは10万回ゲームを行うと仮定します。
no_of_gamesを1e5に設定してください。system.time()を使って、直列でplay()を繰り返し呼び出したときの時間を計測します。sapply()を1:no_of_gamesとplay()ラッパー関数で呼び出します。- 結果を
serialに代入します。 - この呼び出し全体を
system.time()で包んで計測します。
- 4コアのクラスターオブジェクトを作成し、
play()関数をそのクラスターにエクスポートします。 system.time()を使って、並列でplay()を繰り返し呼び出したときの時間を計測します。serialを作成したときのコードを書き換え、並列で動作するようにしてください。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
# Set the number of games to play
no_of_games <- ___
# Time serial version
system.time(serial <- sapply(1:___, function(i) play()))
# Set up cluster
cl <- makeCluster(___)
clusterExport(cl, "play")
# Time parallel version
system.time(par <- ___)
# Stop cluster
stopCluster(cl)