1 BIAS/Profil を動かす

BIAS/Profil というのは、 Technische Universität Hamburg-Harburg の Olaf Knüppel により開発された区間演算ライブラリィである。

15年ほど前に、修士の学生達がお世話になった。 今回、そのときのプログラムを発掘して動かしてみる気になった。

(今時、こんなことをするのは変かな?と思ったけれど、 プログラムを動かさないと話が進まない。 規格化してあればこういう苦労はないけれど、 まあこの分野では仕方がないかな、 と考えて自分を納得させる。)


15 年前の時点で、 「1994年頃からBIAS/Profilは放置されているみたいだ。 あ、コンパイル出来ない。」 ということで、動くようにするために色々手を入れる必要があった。 今回見てみたら、15年前に我々が作業したことは必要がなくなっていたけれど、 それからまた長い眠りについたようで、 現在の我々の環境 (Mac) ですんなり動くようにはなっていなかった。

具体的には、 浮動小数演算の丸めの設定法で引っかかった。 用意されているのは次の host/target configuration

  1. alpha-Linux-compat-gcc
  2. hppa-HPUX-fast-gcc
  3. mips-irix-compat-gcc
  4. ppc-MacOSX-compat-gcc
  5. rs6000-AIX4.1-compat-gcc
  6. rs6000-AIX4.1-compat-xlc
  7. sparc-Solaris2.x-compat-gcc
  8. sparc-Solaris2.x-fast-gcc
  9. sparc-SunOS4.1-compat-gcc
  10. sparc-SunOS4.1-fast-gcc
  11. x86-64-Linux-compat-gcc
  12. x86-Linux-compat-gcc
  13. x86-Linux-fast-gcc
  14. x86-Win32-compat-gcc
  15. x86-Win32-compat-watcom
  16. x86-Win32-fast-gcc
うわぁ、なつ… (昔話をしてもしょうがない)

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) でも良い。

そこで次のようにしてみた。

  1. c99-gcc というディレクトリィを作る。
    (単に c99 でも良いような気がしたけれど、 コンパイラーとか書くところがあるので。 今振り返ると、 HOST-OS-CC という命名ルールらしいので、any-any-gcc とかが良いのかな。)
  2. BiasRnd.c は次の内容 (注釈は適当に書いた)。
    #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);
    }
    
  3. BiasRnd.h は宣言だけを書けば良いだろう。 どこかのコピーで済ませれば良いかと思ったら、 x86 系は(注釈以外)皆同じ内容みたいだった。 私もコピーで済ませます。
    cp x86-Linux-compat-gcc/BiasRnd.h c99-gcc/BiasRnd.h
    vi c99-gcc/BiasRnd.h (注釈を書き換える)
    
  4. Host.cfg も x86 系は(注釈以外)皆同じ内容みたいだった。 またまたコピーで済ます。

    cp x86-Linux-compat-gcc/Host.cfg c99-gcc/Host.cfg
    vi c99-gcc/Host.cfg  (注釈を書き換える)
    
  5. fpRound.s は空にする。
    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.
となった。アルファベット順なので、2 番目に c99-gcc が登場している。 2 を選択する。

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
(以上のようにすると、BIAS のヘッダー・ファイルは、 /usr/local/include/profil/Bias の下に置かれるので、 例えば #include <Bias/Bias0.h> のようにインクルードすることになる。)

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-10-08