2011年2月14日月曜日

GotoBLAS2 の Windows 版を Debian の mingw32 でコンパイル

GotoBLAS2 の Windows 版を Debian 上の mingw32 でコンパイルできるようになったので、そのメモを残しておく。

[1] download
GotoBLAS2 は以下のところからダウンロードする。
http://www.tacc.utexas.edu/tacc-projects/gotoblas2/downloads/

[2] mingw32 の環境整理
sudo apt-get install mingw32-binutils mingw32-runtime wine

[3] ファイルを展開
tar xzf GotoBLAS2-1.13_bsd.tar.gz
cd GotoBLAS2

[4] ファイルを修正
以下のように修正する。
(先頭に - があるところを + の行に書き換える。ただし、Makefile.getarch は Makefile なので各行の最初がTabになるようにしなければならない)
Makefile.getarch では、
all: getarch_2nd
- ./getarch_2nd 0 >> $(TARGET_MAKE)
- ./getarch_2nd 1 >> $(TARGET_CONF)
+ cp getarch_2nd getarch_2nd.exe
+ wine ./getarch_2nd.exe 0 >> $(TARGET_MAKE)
+ wine ./getarch_2nd.exe 1 >> $(TARGET_CONF)
config.h : c_check f_check getarch
perl ./c_check $(TARGET_MAKE) $(TARGET_CONF) $(CC)
perl ./f_check $(TARGET_MAKE) $(TARGET_CONF) $(FC)
- ./getarch 0 >> $(TARGET_MAKE)
- ./getarch 1 >> $(TARGET_CONF)
+ cp getarch getarch.exe
+ wine ./getarch.exe 0 >> $(TARGET_MAKE)
+ wine ./getarch.exe 1 >> $(TARGET_CONF)

GotoBLAS2/driver/others/blas_server_omp.c では、
#include <sys/mmap>
をコメントアウトする。

GotoBLAS2.org/driver/others/dynamic.cでは、
#ifdef ARCH_X86
- if (gotoblas == NULL) gotoblas = gotoblas_KATMAI;
+ if (gotoblas == NULL) gotoblas = & gotoblas_KATMAI;
#else
- if (gotoblas == NULL) gotoblas = gotoblas_PRESCOTT;
+ if (gotoblas == NULL) gotoblas = & gotoblas_PRESCOTT;
#endif
と修正する。

[5] コンパイル
make \
DYNAMIC_ARCH=1 \
USE_THREAD=1 \
USE_OPENMP=0 \
CC=i586-mingw32msvc-gcc \
FC=i586-mingw32msvc-gfortran \
BINARY=32 \
libs netlib

なお、USE_OPENMP=1 は mingw32 に libgomp がないので失敗するため、USE_OPENMP は必ず 0 にする。
NO_WARMUP=1 にするのもありだと思うが、SDPA の場合には Warm up が効かなかった。
また、今回は 32 bit 版で作成している(pthread-win32 が 64bit でコンパイルできていないため)。
基本的にどの CPU にも対応できるように DYNAMIC_ARCH=1 であるが、これはすべての CPU の分を持つので、コンパイルに時間がかかるのとできるファイルが大きくなる。

[5]ranlib でライブラリにする。
i586-mingw32msvc-ranlib libgoto2.lib

これで mingw32 用に使える GotoBLAS2 がコンパイルできる。

今日の作業内容:SNL のデータ変換 2h
今日のランチ: らく 焼魚定食
明日の予測作業時間: 3h

0 件のコメント:

コメントを投稿