Erlang Performance

出典: KLablabWiki

目次

概要

並列処理に適したプログラミング言語 Erlang は、マルチプロセッサの環境で 効率よくパフォーマンスが向上すると言われています。そこで実際のマルチプ ロセッサ環境で様々な Erlang プログラムを走らせる検証を行ってみました。

行った検証の内容は以下の通りです

  • 並列ソート
  • N-Queen 問題

検証環境

ハードウェア
Sun Fire T1000
CPU
UltraSPARC T1
メモリ
16G
OS 
Solaris 10 8/07
Erlang 実行環境
OTP 12B-0(hipe 有効)

今回使用した UltraSPARC T1 プロセッサ は 8つのコア×4スレッド(CoolThreads)という構成 で合計 32個の並列処理が可能となっています。なお、検証に使用した Sun Fire T1000 はサン・マイクロシステムズ(株)様よりごお貸し頂きました。

ソースコード

今回の実験で使用したプログラムのソースコード全て公開しています。

erlang_performance.tar.gz

ビルドのための Makefile を用意してありますが、Erlang の実行環境が hipe に対応していない場合、コンパイルオプションから +native を外す必要があることと、 実行環境のバージョンが OTP 12B-0 より古い場合でマルチCPUを使用する際には -smp オプション を付ける必要があります。

検証内容

並列ソート

単一CPUを使用する普通のクイックソート(sort:qsort/1)、マージソート (sort:msort/1)と複数CPU を使用する並列クイックソート(sort:pqsort/4)、並 列マージソート(sort:pmsort/4) の速度を比較してみます。

この検証に使用したランダムデータは前記したソースコードの rnd/ ディレクト リに置いてあります。

アルゴリズム

並列ソートのクイックソートとマージソートのアルゴリズムは両方とも要素を 2分割した後に別のプロセスを立ち上げて再帰処理を行います、ある程度の深 さ(今回は深さ8)まで分割が進んだら、プロセスの生成を止め通常のソートに切 り替えるという単純なものです。例えば、並列マージソートの場合 2^8=256 個 要素列に分割され、並列ソートが行われます。

実行例

普通のクイックソートで要素数が 1000個のデータをソートします。

% erl -noshell -run sort start qsort rnd/1000.txt -run erlang halt
Time: 2913(usec)

並列クイックソートで要素数が 1000個のデータをソートします。

% erl -noshell -run sort start pqsort rnd/1000.txt -run erlang halt
Time: 5580(usec)

高々 1000 個程度の要素数であれば、並列処理の方が遅くなってしまうようです。

結果

単位はミリ秒

要素数 1万 10万 100万
クイックソート(1CPU) 41.794 737.209 8909.677
並列クイックソート(32CPU) 33.426 590.770 5402.714
マージソート(1CPU) 94.112 1201.185 14764.758
並列マージソート(32CPU) 44.284 377.994 3672.162

1CPU の時はマージソートよりクイックソートの方が早かったのですが、32CPU を使用した並列ソートでは、マージソートの方が早くなるという結果になりま した。これはマージソートが単純に 2分割するのに比べ、クイックソートは分 割自体にコストが掛かってしまうため 32CPU をフルに使用出来る時間が短くなっ てしまう為と思われます。

N-Queen問題

並列に N-Queen 問題を解く Erlang のプログラムを実行し、CPU を増やしていっ た際に処理速度がどのように向上するかを計測してみます。

アルゴリズム

最初の 2 駒目まで進めた譜面まで分割し、別プロセスを立ち上げ、続きを単純 なアルゴリズム(nq:nq/1) で並列に解き、解の数をメッセージで返します。例 えば N=14 の場合、14^2 - (置けないパターン) = 156 の盤面から並列に解い ていきます。

実行例

CPU を 8個使用して N=14 Queen 問題を解きます。

% erl -noshell +S 8 -run nq start 14 -run erlang halt
Num: 365596
Time: 65006641(usec)

N=14 Queen 問題の解の数が 365596 であることと処理時間が表示されます。

結果

CPU数 処理時間(秒)
1 522.048
2 260.400
4 129.477
8 65.006
16 37.581
32 30.678

Image:Erlang_Performance_nq.png

CPUが倍になると処理時間が約半分になり、比例とまでは行きませんがマルチプ ロセッサを効率よく使用出来ているようです。

参考文献

更新履歴

  • 2007/01/15 公開しました
  • 2007/01/16 幾つかの誤字を修正しました。
■このサイトについて

このサイトはKLab株式会社が開発したソフトウェアやノウハウ、実験的なサービスを公開していきます。

 RSS Feed

■メニュー