Mavericks で UnixBench 5.1.3
言わずと知れたUnixBenchはLinux環境ではそのまま動かせることが多い。
それがBSD系OSになるとちょっと難しい。
この記事ではMac OS X Mavericks で UnixBench 5.1.3 を動かす。
結論
$ wget https://byte-unixbench.googlecode.com/files/UnixBench5.1.3.tgz $ tar xzvf UnixBench5.1.3.tgz $ git clone https://gist.github.com/11033924.git $ cd UnixBench $ patch -p1 < ../11033924/UnixBench5.1.3.mavericks.patch $ make $ ./Run
説明
gcc はすでにインストールされているとする。
gcc (を含むコマンドラインツール) のインストールについてはここでは書かないので、
必要に応じて web 上の情報を参照されたい。
ところが Mavericks の "gcc" は、 実体が clang/LLVM である。
その関係で、make コンパイルオプションがそのままでは、そんなの知らないと言われてしまう。
Makefile を編集して、
## Very generic OPTON = -O # この行のコメントアウトを解除 (-Wall を追加する?) (中略) ## For Solaris 2, or general-purpose GCC 2.7.x #OPTON = -O2 -fomit-frame-pointer -fforce-addr -ffast-math -Wall # この行をコメントアウト
としてやる。
これでコンパイルは通るものの、
context1 (Pipe-based Context Switching) テストでだけ実行時にエラーが出てしまう。
Run: "Pipe-based Context Switching": slave read failed: Invalid argument; aborting
context1 (に限らず UnixBench の各ベンチプログラム) は無限ループを実行していて、
それに対して SIGALRM を送ることで、開始から一定時間経過したベンチプログラムを止める。
SIGALRM を送った時、Linux では何事もなくプログラムが終了する。
一方、Mavericks では read(2) の errno が EINVAL となってしまっている。
context1 と似たプログラムを自分で書いてテストしてみたところ、
Linux では read(2) が 0 を返しても errno は設定されず 0 (success) のままだが、
FreeBSD (や OS X Mavericks) では、read(2) が 0 を返した時に errno が EINVAL に設定されてしまっている。
しかし OS X の man では次のように説明されている。
RETURN VALUES
If successful, the number of bytes actually read is returned. Upon reading end-of-
file, zero is returned. Otherwise, a -1 is returned and the global variable errno
is set to indicate the error.
エラー処理としては read(2) が -1 を返した時だけ errno を見て perror するのが正しそう。
ということで src/context1.c をそのように書き直してやる。
これで make して ./Run を実行すると、テストがめでたく開始して、一通り成功する。
ところが、テストが 1 プロセスだけで終了してしまい、マルチプロセスのテストが始まらない。
CPU の個数は Run スクリプトの中で getCpuInfo サブルーチンが調べているのだが、
なんと /proc/cpuinfo を読んで CPU の情報を取得しようとしている。
/proc は Linux にはあるけれども、BSD や OS X にそんなものはない。
OS X の場合は、sysctl で memarch 変数を調べる必要がある。
(参考: Getting CPU info from the command line in OSX)
(参考: What is the equivalent of /proc/cpuinfo on FreeBSD v8.1?)
マルチ CPU サポートを使うには、この点を踏まえて、Run スクリプトの中の
getCpuInfo サブルーチンを適切に書きなおしてあげる必要がある。
まとめとして、UnixBench を Mavericks 上で動かすには、
Makefile, Run, src/context1.c の3つのファイルを適切に修正してあげればよい。
パッチを書いて Gist に置いておいた: UnixBench5.1.3.mavericks.patch
このパッチは Makefile, Run および src/context1.c の3つのファイルを変更して、
Mavericks 上で UnixBench 5.1.3 をマルチ CPU サポート付きで実行できるようにする。
[…] blog http://www.baru-san.net/archives/267 […]