BIAS/Profil というのは、 Technische Universität Hamburg-Harburg の Olaf Knüppel により開発された区間演算ライブラリィである。
15年ほど前に、修士の学生達がお世話になった。 今回、そのときのプログラムを発掘して動かしてみる気になった。
(今時、こんなことをするのは変かな?と思ったけれど、 プログラムを動かさないと話が進まない。 規格化してあればこういう苦労はないけれど、 まあこの分野では仕方がないかな、 と考えて自分を納得させる。)
15 年前の時点で、 「1994年頃からBIAS/Profilは放置されているみたいだ。 あ、コンパイル出来ない。」 ということで、動くようにするために色々手を入れる必要があった。 今回見てみたら、 Profil-2.0.8.tgz (2009-01-29) が最新版。 15年前に我々が作業したことは必要がなくなっていたけれど、 それからまた長い眠りについたようで、 現在の我々の環境 (Mac) ですんなり動くようにはなっていなかった。
具体的には、 浮動小数演算の丸めの設定法で引っかかった。
tar xzf Profil-2.0.8.tgz cd Profil-2.0.8 ./Configure |
Mac があるようだけど、ppc だし (これじゃアセンブリ言語のプログラムあっても、 使えない)、しかも作りかけ (のようなことも書いてある。 もう手元に PowerPC ベースの実機がないので分からない。)。
少し調べ物をして、以下のことがわかった。
えー、面倒そう。 でも、そもそも丸めモードの制御は、 C99 の規格に入ったのではなかったっけ? fast にはならなくても、compat レベルならば、 OS やコンパイラーに左右されないプログラムが書けるはずだよね。 今回は、動作チェックしたいだけで、スピードは要求しないから、それで十分だろう。
Profil-2.0.8.tar.gz を展開して出来る Profil-2.0.8 というディレクトリィの下に config というディレクトリィがあり、 そこに host/target ごとにディレクトリィ (例えば alpha-linux-compat-gcc というディレクトリィが存在する) を作り、 BiasRnd.c, BiasRnd.h, Host.cfg, fpRound.s という 4 つのファイルを用意すれば良いらしい。 ちなみに fpRound.s は中身が空 (サイズ 0) でも良い。
そこで次のようにしてみた。
cd config mkdir c99-gcc(any-any-gcc という名前にするのだったら、 mkdir any-any-gcc) |
#include <BiasRnd.h> #include <fenv.h> void BiasRoundInit (void) {} void BiasRoundNear (void) { fesetround(FE_TONEAREST); } void BiasRoundUp (void) { fesetround(FE_UPWARD); } void BiasRoundDown (void) { fesetround(FE_DOWNWARD); } |
cp x86-Linux-compat-gcc/BiasRnd.h c99-gcc/BiasRnd.h vi c99-gcc/BiasRnd.h (注釈を書き換える) |
cp x86-Linux-compat-gcc/Host.cfg c99-gcc/Host.cfg vi c99-gcc/Host.cfg (注釈を書き換える) |
touch c99-gcc/fpRound.s |
以上のようにして、 Profil-2.0.8 に戻って ./Configure を実行したら
Available host/target configurations (HOST-OS-CC): 1. alpha-Linux-compat-gcc The DEC Alpha support is currently just a test version. 2. c99-gcc 3. hppa-HPUX-fast-gcc 4. mips-irix-compat-gcc The MIPS/SGI support is in preparation. 5. ppc-MacOSX-compat-gcc The MacOSX port is under development. 6. rs6000-AIX4.1-compat-gcc 7. rs6000-AIX4.1-compat-xlc 8. sparc-Solaris2.x-compat-gcc 9. sparc-Solaris2.x-fast-gcc 10. sparc-SunOS4.1-compat-gcc 11. sparc-SunOS4.1-fast-gcc 12. x86-64-Linux-compat-gcc 13. x86-Linux-compat-gcc 14. x86-Linux-fast-gcc 15. x86-Win32-compat-gcc The Windows 95/98/NT port is under development. 16. x86-Win32-compat-watcom For b4m/BIAS use only. 17. x86-Win32-fast-gcc The Windows 95/98/NT port is under development. |
Mac の gcc は、LLVM なので、まずは本当の gcc (私が今使っているシステムでは gcc-mp-5 がコマンド名) を指定する。
make CC=gcc-mp-5 all make CC=gcc-mp-5 install |
make install は、 よくある「システムへの書き込み」ではないので、 sudo は不要である。 Profil-2.0.8/include, Profil-2.0.8/lib に必要なファイルを生成して終わる。
簡単なチェック・プログラムが用意されている。実行してみる。
[chronos:~/work/Profil-2.0.8] mk% make CC=gcc-mp-5 check ****************** * Making check * ****************** -n TBias.exe passed -n TBiasF.exe passed ************************************ Passed 2 of 2 -n WARNING: 0 -n FAILED : 0 ************************************ [chronos:~/work/Profil-2.0.8] mk% |
どこにインストールするか。 ライブラリィ・アーカイブファイルは libProfil.a, libBias.a, liblr.a, libProfilPackages.a の4つで (2つ増えているぞ… liblr.a はほぼ必須、 libProfilPackages.a はオプショナルという感じみたい)、 そのまま /usr/local/lib にコピーしても問題はなさそう。
インクルード・ファイルはたくさんあるので、 /usr/local/include に直接コピーするのは避けたい。 以前は /usr/local/include/bias, /usr/local/include/profil という2つのディレクトリィを用意したけれど、 どうも Profil-2.0.8/include を丸ごとコピーしろと言われている気がした (気のせいかな)。
結局、次のようにした。
sudo cp -pr include/ /usr/local/include/profil sudo cp -p lib/* /usr/local/lib |
Profil を利用する ``フツー'' のプログラム なんとか.cpp をコンパイルするには、
g++-mp-5 -I/usr/local/include/profil なんとか.cpp -L/usr/local/lib -lProfil -lBias -llr |
(2017/4/14) Xcode の gcc, g++ でも動作するみたいだ (LLVM でもOK ということ)。 Homebrew でも出来た。
mkdir -p /usr/local/Cellar/profil/2.0.8/{include,lib} cp -pr include/ /usr/local/Cellar/profil/2.0.8/include/profil cp -pr lib/* /usr/local/Cellar/profil/2.0.8/lib brew link profil |
(2017/11/6)
#include <iostream> #include <iomanip> #include <cstdlib> // exit() のため using namespace std; |
(2018/9/23)
curl -O http://www.ti3.tuhh.de/keil/profil/Profil-2.0.8.tgz tar xzf Profil-2.0.8.tgz cd Profil-2.0.8/config mkdir any-any-gcc cd any-any-gcc curl -O http://nalab.mind.meiji.ac.jp/~mk/20180923/BiasRnd.c cp -p ../x86-Linux-compat-gcc/BiasRnd.h . cp -p ../x86-Linux-compat-gcc/Host.cfg Host.cfg rm -f fpRound.s touch fpRound.s cd ../.. echo 2 | ./Configure make CC=gcc all>&make-all.log make CC=gcc install>&make-install.log make CC=gcc check>&make-check.log cat make-check.log sudo cp -pr include/ /usr/local/include/profil sudo cp -p lib/* /usr/local/lib |
桂田 祐史