Reference BLAS を f2c でビルドする

2020/02/29

だめもとで netlib の Reference BLAS を f2c にかけてみたら、わずかな修正だけで、意外にも問題なく通りました。使用した Reference BLAS は blas-3.8.0.tgz です([2022/02/06] blas-3.10.0.tgz でも作業手順は同じです)。なお、前掲の Netlib の Reference BLAS ページには公式の CBLAS も掲載されているのですが、これを書いた当時あったものの中身は2011年以降全くメンテナンスされていないもののようなので、こういうお試しをしてみようと思ったわけです(なお2022年2月現在あるものもやはり2011年の中身のままのようです)。

出来上がったものがちゃんと使えるかどうかまではノーチェックです。あしからず。

ここでは MSVC/win32 で行っているが、他のコンパイラでも同じ結果になるはず。

この試行のモチベーションは、これ


ソースの展開

w32tex の tar を使う。

tar xzvf blas-3.8.0.tgz

ファイル名が ._ で始まるファイルが重複してできてしまうが、いらないので消す。([2022/02/06] blas-3.10.0.tgz にはこの問題は無いようです。)

xerbla.f 一部修正

diff -u xerblaf.f.org xerblaf.f
--- xerbla.f.org        Wed Nov 15 14:39:06 2017
+++ xerbla.f    Sat Feb 29 11:40:28 2020
@@ -73,7 +73,7 @@
 * =====================================================================
 *
 *     .. Intrinsic Functions ..
-      INTRINSIC          LEN_TRIM
+c      INTRINSIC          LEN_TRIM
 *     ..
 *     .. Executable Statements ..
 *

この修正は、len_trim が f2c の組み込み関数としては用意されていないための対処。len_trimこれこのページ を参照)を使う。なお、ここでは IMPLICIT NONE 宣言をしていないため、戻り値型が integer の外部関数は特段 EXTERNAL 宣言をしなくても問題ないようだ。

[2022/07/02] 別解として、len_trim 自体を len 関数と同様の組み込み扱いにしてしまうべく、f2c 自体を改造する という方法もあり、それを適用するならば xerbla.f の上記手当ては必須ではなくなる(手当てをしてあっても構わない)。

xerbla_array.f 一部修正

diff -u xerbla_array.f.org xerbla_array.f
--- xerbla_array.f.org  Wed Nov 15 14:39:06 2017
+++ xerbla_array.f      Sat Feb 29 11:38:50 2020
@@ -89,7 +89,7 @@
       INTEGER SRNAME_LEN, INFO
 *     ..
 *     .. Array Arguments ..
-      CHARACTER(1) SRNAME_ARRAY(SRNAME_LEN)
+      CHARACTER*(*) SRNAME_ARRAY(SRNAME_LEN)
 *     ..
 *
 * =====================================================================

この修正は、バイト配列の表記の仕方がこの部分だけ Fortran90 流儀になっているのを、 FOTRAN77 の整合配列流儀に戻しているだけである。

f2c で C に変換

まるっと一発

for %1 in (*.f) do f2c %1

f2c は新しめのものを使う。

f2c の -a オプション(ローカル変数の自動変数化)を付すかどうかは悩ましい。これを行うと MSVC2013 (Express 64bit cross) でオプション /W4 において C4701 がいくつか出るようになるのは少し気になる。

netlib 公式版 f2c.h の確保

netlib 公式 にあるものを f2c で生成された *.c と同じところに入れる。

コンパイル および ライブラリファイルにとりまとめ

cl /c /O2 /MD *.c
lib -out:libblas.lib *.obj

ちなみに

cl /c /O2 /MD /W4 *.c
としてどんな警告が出るか見てみても面白いかもしれません。なお C4210 は実害がないので cl のオプション /wd で抑止でいいでしょう。一方 C4100 は調査不十分ですが、「C4100: 'foobar_len' : 引数は関数の本体部で 1 度も参照されません。」(foobar は適宜読み替えのこと)はおそらく、当該の関数の動作モードを 1 byte の「文字」( CHARACTER*1 )で与える仕様の引数を、f2c が「文字列」と思い込んで文字列長を暗黙引数として追加しているようであり(C言語ではポインタ渡しにしたときに文字と文字列の区別がつかないので仕方ない)、実害は恐らくないのでは?と思われます(未確認)。

使い方

libf2c を MSVC でビルドした vcf2c.lib (このページこのページ を参照)と、len_trim.cこのページ を参照)をあらかじめ用意しておく。(ただし len_trim に関する別解 を適用する場合は、len_trim.c もそちらの物を使う。)

superlu_5.2.1\SRC ディレクトリを include path に追加するか、ディレクトリ内のヘッダファイルを target project のしかるべき場所にコピーする。

C のプログラム foo.c から使う場合

cl /MD /O2 /W4 foo.c len_trim.c vcf2c.lib libblas.lib

FORTRAN77 のプログラム foobarbaz.f を f2c したプログラム foobarbaz.c から使う場合

f2c foobarbaz.f
cl /MD /O2 /W4 /wd4210 foobarbaz.c len_trim.c vcf2c.lib libblas.lib /link /SUBSYSTEM:CONSOLE

雑感

nothing.


略歴


トップページ / 計算機関係の雑多なこと / Reference BLAS を f2c でビルドする
このサイトについて・著者連絡先