2010年1月9日土曜日

unixbench 5.1.2 を FreeBSD でもCPU数に応じて動くようにしてみる

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
unixbench 5.1.2 を使ってベンチマークをとっていたのですが、FreeBSDで実行するとCPU数を認識してくれず、少々寂しい結果になるので、patchを作ってみました。ついでに、コンパイラの情報も表示させるようにもしてみたので、そのpatchも置いておきます。(FreeBSD版のpatchはLinux版のpatchの内容を含んでいます。)

■FreeBSD用のpatch はこちら→ unixbench-5.1.2.FreeBSD.patch
□Linux用のpatch はこちら→unixbench-5.1.2.custom.patch

GNU make が必要です。


%ls
unixbench-5.1.2.FreeBSD.patch unixbench-5.1.2.tar.gz
%tar -xzf unixbench-5.1.2.tar.gz
%patch -p < unixbench-5.1.2.FreeBSD.patch
Hmm... Looks like a unified diff to me...
The text leading up to this was:
--------------------------
|diff -ruN unixbench-5.1.2.orig/Makefile unixbench-5.1.2/Makefile
|--- unixbench-5.1.2.orig/Makefile 2007-12-23 04:51:21.000000000 +0900
|+++ unixbench-5.1.2/Makefile 2010-01-10 16:11:10.219596811 +0900
--------------------------
Patching file unixbench-5.1.2/Makefile using Plan A...
Hunk #1 succeeded at 38.
Hunk #2 succeeded at 137.
Hmm... The next patch looks like a unified diff to me...
The text leading up to this was:
--------------------------
|diff -ruN unixbench-5.1.2.orig/Run unixbench-5.1.2/Run
|--- unixbench-5.1.2.orig/Run 2007-12-23 06:48:10.000000000 +0900
|+++ unixbench-5.1.2/Run 2010-01-10 16:10:54.483552885 +0900
--------------------------
Patching file unixbench-5.1.2/Run using Plan A...
Hunk #1 succeeded at 62.
Hunk #2 succeeded at 80.
Hunk #3 succeeded at 681.
Hunk #4 succeeded at 723.
Hunk #5 succeeded at 734.
Hunk #6 succeeded at 796.
Hunk #7 succeeded at 1379.
Hunk #8 succeeded at 1582.
Hmm... The next patch looks like a unified diff to me...
The text leading up to this was:
--------------------------
|diff -ruN unixbench-5.1.2.orig/Run_FreeBSD unixbench-5.1.2/Run_FreeBSD
|--- unixbench-5.1.2.orig/Run_FreeBSD 1970-01-01 09:00:00.000000000 +0900
|+++ unixbench-5.1.2/Run_FreeBSD 2010-01-10 16:10:09.484287187 +0900
--------------------------
(Creating file unixbench-5.1.2/Run_FreeBSD...)
Patching file unixbench-5.1.2/Run_FreeBSD using Plan A...
Hunk #1 succeeded at 1.
done
%cd unixbench-5.1.2
%vi Makefile
(Makefileを編集します。GMAKEに GNU make コマンドを設定してください。
 FreeBSDの場合は gmake になると思います。
 GRAPHIC_TESTS を切るかどうかはお好みで。FreeBSDで動くかどうかは試していません。
 CC で C コンパイラを変更できます。その場合は、後述の Run_FreeBSD を編集して下さい。)
%vi Run_FreeBSD
(ベンチマークをとる perl スクリプトです。Makefileでの記述を参考に、
my $gMake = 'gmake';
my $cCompiler = 'gcc';
 を書き換えてください。)
% gmake
% ./Run_FreeBSD
gmake all
gmake[1]: Entering directory `/home/tarai/unixbench-5.1.2'
Checking distribution of files
...
(ここからベンチマークを実行しますので、60分ほど放置するか、
screen などで逃げられるようにしておいたほうがいいでしょう)


./Run のかわりに ./Run_FreeBSD を実行すると、こんなふうにベンチマークが取れる、はず。

BYTE UNIX Benchmarks (Version 5.1.2-custom)

System: zitaku.localdomain: FreeBSD
OS: FreeBSD -- 8.0-RELEASE-p2 -- FreeBSD 8.0-RELEASE-p2 #0: Thu Jan 7 18:38:59 JST 2010 tarai@zitaku.localdomain:/usr/obj/usr/zsrc/sys/GENERIC
Machine: amd64 (GENERIC)
Language: en_US.utf8 (charmap=, collate=)
Compiler: gcc (GCC) 4.2.1 20070719 [FreeBSD]
CPU 0: hw.model: Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz (0.0 bogomips)

CPU 1: hw.model: Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz (0.0 bogomips)

CPU 2: hw.model: Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz (0.0 bogomips)

CPU 3: hw.model: Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz (0.0 bogomips)

CPU 4: hw.model: Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz (0.0 bogomips)

CPU 5: hw.model: Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz (0.0 bogomips)

CPU 6: hw.model: Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz (0.0 bogomips)

CPU 7: hw.model: Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz (0.0 bogomips)

1:41AM up 1 day, 6:44, 1 user, load averages: 0.00, 0.00, 0.00; runlevel

------------------------------------------------------------------------
Benchmark Run: 土 1 09 2010 01:41:48 - 02:13:24
8 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables 19614465.7 lps (10.0 s, 7 samples)
Double-Precision Whetstone 4220.0 MWIPS (9.7 s, 7 samples)
Execl Throughput 3474.9 lps (29.9 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks 131206.9 KBps (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks 33294.4 KBps (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks 462368.5 KBps (30.0 s, 2 samples)
Pipe Throughput 1622117.6 lps (10.0 s, 7 samples)
Pipe-based Context Switching 248853.7 lps (10.0 s, 7 samples)
Process Creation 10993.0 lps (30.0 s, 2 samples)
Shell Scripts (1 concurrent) 7765.5 lpm (60.0 s, 2 samples)
Shell Scripts (8 concurrent) 2535.4 lpm (60.0 s, 2 samples)
System Call Overhead 974418.6 lps (10.0 s, 7 samples)

System Benchmarks Index Values BASELINE RESULT INDEX
Dhrystone 2 using register variables 116700.0 19614465.7 1680.8
Double-Precision Whetstone 55.0 4220.0 767.3
Execl Throughput 43.0 3474.9 808.1
File Copy 1024 bufsize 2000 maxblocks 3960.0 131206.9 331.3
File Copy 256 bufsize 500 maxblocks 1655.0 33294.4 201.2
File Copy 4096 bufsize 8000 maxblocks 5800.0 462368.5 797.2
Pipe Throughput 12440.0 1622117.6 1304.0
Pipe-based Context Switching 4000.0 248853.7 622.1
Process Creation 126.0 10993.0 872.5
Shell Scripts (1 concurrent) 42.4 7765.5 1831.5
Shell Scripts (8 concurrent) 6.0 2535.4 4225.6
System Call Overhead 15000.0 974418.6 649.6
========
System Benchmarks Index Score 873.4


------------------------------------------------------------------------
Benchmark Run: 土 1 09 2010 02:13:24 - 02:42:59
8 CPUs in system; running 8 parallel copies of tests

Dhrystone 2 using register variables 81213813.6 lps (10.0 s, 7 samples)
Double-Precision Whetstone 26264.1 MWIPS (9.9 s, 7 samples)
Execl Throughput 7712.6 lps (29.9 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks 93489.7 KBps (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks 23754.0 KBps (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks 371435.3 KBps (30.0 s, 2 samples)
Pipe Throughput 8691978.0 lps (10.0 s, 7 samples)
Pipe-based Context Switching 2075904.6 lps (10.0 s, 7 samples)
Process Creation 16325.9 lps (30.0 s, 2 samples)
Shell Scripts (1 concurrent) 21494.6 lpm (60.0 s, 2 samples)
Shell Scripts (8 concurrent) 2922.0 lpm (60.1 s, 2 samples)
System Call Overhead 5527171.2 lps (10.0 s, 7 samples)

System Benchmarks Index Values BASELINE RESULT INDEX
Dhrystone 2 using register variables 116700.0 81213813.6 6959.2
Double-Precision Whetstone 55.0 26264.1 4775.3
Execl Throughput 43.0 7712.6 1793.6
File Copy 1024 bufsize 2000 maxblocks 3960.0 93489.7 236.1
File Copy 256 bufsize 500 maxblocks 1655.0 23754.0 143.5
File Copy 4096 bufsize 8000 maxblocks 5800.0 371435.3 640.4
Pipe Throughput 12440.0 8691978.0 6987.1
Pipe-based Context Switching 4000.0 2075904.6 5189.8
Process Creation 126.0 16325.9 1295.7
Shell Scripts (1 concurrent) 42.4 21494.6 5069.5
Shell Scripts (8 concurrent) 6.0 2922.0 4870.0
System Call Overhead 15000.0 5527171.2 3684.8
========
System Benchmarks Index Score 2050.6





以下説明。patchを当てずに実行すると、

BYTE UNIX Benchmarks (Version 5.1.2)

System: zitaku.localdomain: FreeBSD
OS: FreeBSD -- 8.0-RELEASE-p2 -- FreeBSD 8.0-RELEASE-p2 #0: Thu Jan 7 18:38:59 JST 2010 tarai@zitaku.localdomain:/usr/obj/usr/zsrc/sys/GENERIC
Machine: amd64 (GENERIC)
Language: ja_JP.utf8 (charmap=, collate=)
CPU: no details available
12:28AM up 1 day, 5:30, 1 user, load averages: 0.00, 0.00, 0.00; runlevel

ベンチマークの結果も 1CPUのときのみを計測して終わってしまいます。これはつまらない。

理由は、Run スクリプトが Linux 決め打ちのコードになっていて、CPUに関する情報を
/proc/cpuinfo から取っているためです。Linux エミュレーションを入れていれば、おそらくその絶対パスを書き換えるだけでいいと思うのですが、たまたま手元のマシンにはLinux エミュレーションを入れていなかったので、perlの勉強がてら、sysctlから取るようにしてみました。

sysctl の情報しか取り出していないので、bogomips や CPUの機能情報は決め打ちで埋めてます。CPUの個数さえ分かれば SMP の時のベンチマークも取るようになるので、これで十分かなと思っています。これ以上の情報を取ろうとすると cpuid とかのお世話にならないといけないのかな?

NetBSD, OpenBSD, PC-BSD などの場合は、sysctl のキーが同じなら、Run_FreeBSD のスクリプトを見て場合分けを書き換えればいけると思います。手元にないので確認は取れてません。

Linux エミュレーションが有効な場合は、./Run にある $pCpuinfo="/proc/cpuinfo" を書き換えれば ./Run でも実行できると思います。そういうふうに書き換えてはおきましたが、動作は未確認です。

実は Compiler 情報も表示するよう改造していたり、本家 Run スクリプトも、ハードコーディングしている部分を書き換えたりしているので、これをそのまま ports パッチにするのは改変の度が過ぎると思います。(バージョン情報もちょっといじっています。)Run_FreeBSD のファイルを抜いたものを本家に提出して、もし本家に採用されたら、そこから USE_GMAKE=YES, USE_LINUX=YES という条件で ports を作るのが綺麗な気がしますけど、需要があるのかどうか……

0 件のコメント: