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 にはこの問題は無いようです。)
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 の上記手当ては必須ではなくなる(手当てをしてあっても構わない)。
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 の整合配列流儀に戻しているだけである。
まるっと一発
for %1 in (*.f) do f2c %1
f2c は新しめのものを使う。
f2c の -a
オプション(ローカル変数の自動変数化)を付すかどうかは悩ましい。これを行うと MSVC2013 (Express 64bit cross) でオプション /W4
において C4701 がいくつか出るようになるのは少し気になる。
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 のしかるべき場所にコピーする。
cl /MD /O2 /W4 foo.c len_trim.c vcf2c.lib libblas.lib
f2c foobarbaz.f
cl /MD /O2 /W4 /wd4210 foobarbaz.c len_trim.c vcf2c.lib libblas.lib /link /SUBSYSTEM:CONSOLE
nothing.
len_trim
に関する別解 を言及。
トップページ /
計算機関係の雑多なこと /
Reference BLAS を f2c でビルドする
このサイトについて・著者連絡先