Mavericks で UnixBench 5.1.3

カテゴリ: Mac OS X

言わずと知れた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 サポート付きで実行できるようにする。

2014/4/18 (金)

1件のコメント

コメント