2016/09/23 2015/06/20, 2015/06/27 暫定
Lis (Library of Iterative Solvers for linear systems) は純国産、C言語実装(一部特殊機能のみFortran実装)、3条項BSDライセンスの疎行列計算ライブラリです。対称・非対称の各種解法を実装してあるそうです。
lis-1.5.55.zip を Microsoft Visual C++ (Visual Studio 2010, 2013) でのビルドを試みました。Cコンパイラだけでも大半の機能が使えるライブラリを生成できるようです。
Version 1.6.11からVersion 1.6.12にかけて、MS-VC++における Makefile.in と configure.bat の不具合が修正されたようです。めでたし。(→http://www.ssisc.org/lis/ChangeLog.txt)
ユーザガイド「2.3 Windowsシステムへの導入」において、win ディレクトリで configure と書いてあるのは、unix系OS用シェルスクリプトではなく、win ディレクトリ内にあるバッチファイル configure.bat を動かせということですのでお間違え無きよう。
以下は lis-1.5.55.zip 当時の古い記述です。
公式サイトのユーザガイドには「configure と nmake を動かせ」としか書いていない。書庫を展開しても、ルートディレクトリのREADMEにはunixに関することしか書いていない。nmake はわかるが、Windowsで configure shell script とは如何に? ハテ、どうしたものか? と思いきや、winディレクトリ内にあるバッチファイル configure.bat を使えば良いのでした。
バッチファイルの基本コマンドだけで configure shell script にほぼ対応する処理をさせてしまう実装には感服しました。こんなの初めてです。
ということで、winディレクトリ内の README に書いてあることに従えば、一応あっさりビルドできることはできるのですが、実は落とし穴がたくさんあります。注意点と対処を以下に示します。
- configure.bat のオプション --cflags を指定すると「指定されたバッチ ラベルが見つかりません - setusercflags」と言われる。
- configure.bat がLF改行(unix形式)であり、cmd.exeがラベルをうまく認識できないため(cmd.exeのメモリリーク?)。
- CRLF改行に直せば大丈夫。
- それを直しても --cflags で指定したオプションが効かない場合がある。
- Makefile.in における $(USER_CFLAGS) の位置がまずく、後ろに来るマクロのもので上書きされる。
- Makefile.in と configure.bat を修正する必要がある。
- MSVCランタイムライブラリの静的リンク(LIBCMT)とDLL(MSVCRT)を選べない。
- configure.bat と Makefile.in のつくりが、LIBCMTしか考慮していないため。
- メインのプログラムと分割コンパイルするときにライブラリ競合となって困ることがある。
- Makefile.in と configure.bat を修正する必要がある。
- debug要否の指定がおかしい。
- C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\win32.mak (MSVC2010の場合)にある Build Rules Quick Start の指定への準拠が中途半端なため。
- マクロ cdebug 自体がデバッグ有無を決めるのではなく、NODEBUG を定義するかしないかで cdebug の中身が変わってデバッグかリリースかが決まる。/Ox を /O2 等に替えたい場合を除き、cdebug の指定はいつも必要。
- Makefile.in と configure.bat を修正する必要がある。
- 最適化がされない。
- 上記と同じ。
- 最適化の有無で計算時間に結構差が出る。
- configure.bat をCRLF改行に直せば --cflags で指定できなくはないが、複数のコンパイルオプションに対応できないので片手落ち。
- Makefile.in と configure.bat を修正する必要がある。
- 「warning D9002 : 不明なオプション '-ML' を無視します」と言われる。
- かつて存在した、シングルスレッド専用静的CRT(LIBC.lib)を指定するオプションで、VS2005以降では廃止済みです。https://support.microsoft.com/en-us/kb/154419/ja
- せっかく Makefile を使っているのに、毎度たくさんコンパイルしてくれる。
- obj の依存関係にディレクトリ移動が含まれている。サフィックスルール .c.obj でまとめ記述しているが、MSVCの cl.exe は出力 .obj をカレントディレクトリに書く仕様なのでサフィックスルールではうまくいかない。
- あきらめる。
- 「warning LNK4006: _main は test6.obj で定義されています。」とか「warning LNK4221: このオブジェクト ファイルは、以前に未定義で…」とか言われる。
- 上記と同じでサフィックスルールの弊害。再ビルド時は、nmake clean を毎回実行する。
- configure.bat のオプション --cflags には複数のオプションを列挙できない。
- あきらめる。
- MSVCのヘルプ「CL のコマンド ファイル」を見て、コマンドファイルで対応する。
ということで、上記のいくらかを改善すべく勝手にいじった configure.bat と Makefile.in を置いておきます。正直なところ、事務的にやっただけで中身はまったく理解していません。自己責任でどうぞ。
Lis_win_configure_amend.zip [2015/06/27] - CRLFです。
- MSVCR*.DLLも選択可能。configure.bat にオプション --msvcrtdll を追加実装。
- デバッグビルド指定のあたりを訂正…いいかげんです。うまくいかないかも。試していません。
- SDKの win32.mak に従うと、リリースビルドでは最大限の最適化 /Ox になるが、MSVC2010ではコンパイルにとてつもなく時間がかかる(Core i5-520M 2.4GHzで25分くらい。lis_matvec 関係が異様に時間がかかる)。じっと我慢するか、PCを離れてコーヒーを淹れてください。一方、MSVC2013では /Ox でもまあ普通のコンパイル時間です。
- 依存関係とサフィックスルールについてはそのまま。
- --cflags に、二重引用符でくくって複数のオプションを列挙できるように修正しました。(例)
configure.bat --msvcrtdll --cflags "/Qpar /Qpar-report:2 /Qvec-report:1"
(この例はMSVC2013の自動並列化オプションとそのレポート表示、自動ベクター化のレポート表示ですが、試したところ、VC++コンパイラの自動ベクター化はされているが自動並列化の恩恵にはあずかれないことが判明。)- /Ox よりも /O2 のほうが良いのかどうか、よくわかりません。
- Intelコンパイラは知りません(関係個所放置)。
言うまでもなく、この Makefile.in は GCC(MingwおよびCygwin)では使えません。MSVC の流儀に合わせたものですし、configure.bat なるバッチファイルでやっている以上しかたありません。 GCCの場合はオリジナルのunix用 configure とMSYSあるいはCygwinか何かで対処することになるのでしょう。
--enable-omp
は、MSVCの場合、CPU負荷を増やすだけで、あまり効果がないみたいです。
to be continued...
この文書が誰か・何かの役に立てば幸いです。さらに願わくば、この文書の公開(並びに SuperLU / Eigen / MUMPS の各事例)が、日本における数値計算ライブラリ利用裾野を広げ、日本全体の底上げにつながることを、静かに期待します。
トップページ /
計算機関係の雑多なこと /
LisをWin32上でビルドする
このサイトについて・著者連絡先