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 |
桂田 祐史