WindowsのMinGWでlapackを使う


Windowsでlapackは使える???

数値計算の世界で欠かせない存在であるFortranとBLAS、lapack。
これらはLinuxやMacOSなら結構簡単に導入ができます。
しかしながら、WindowsにおいてはCygwinやWSLを使った方法が主となっており、コマンドプロンプトなどでは使えない状況です。

そこで今回は、MinGWを用いてgfortranやgccを導入したマシンにおいて、lapackを使えるように設定します。

参考にしたサイト

LAPACK for Windows
こちらのサイトにすべて設定の方法が載っております。今回はこちらを参考にして実際の画面をもとに説明していきます。

Windowsへのインストール方法

  1. lapack.tar.gzからファイルをダウンロードします.

  2. CMAKE.msi のインストーラーをダウンロードします.

  3. CMAKEをインストールする. この際PATHを通しておくと楽./

  4. 管理者としてコマンドプロンプトを開き, ダウンロードしてきた lapack-3.~ のフォルダに移動します.

  5. build, build_space という二つの新しいフォルダを作成します.
    C:¥Users~> mkdir build build_space

  6. cmake-guiを開きます. 次のコマンドを打ってください.
    C:¥Users~> cmake-gui

  7. Browse Source... というボタンを押して, lapack-3.~ のフォルダを選択する.

  8. Browse Build... というボタンを押して, 先程作成した build_space をさがして選択してください.

  9. Configure を押してください.

  10. 次のようなウインドウが出てくるので, MinGW Makefiles を選択して, Specify native compilers を選び, Next を押してください.

  11. 次のようなウインドウが出てくるので, 画像に書いてある通りにコンパイラの名前を入力して, Finish を押してください.

  12. もう一度 Configure を押してください. すると次のような赤いウインドウが出てくると思います.

  13. 図のようにチェックを入れてください. CMAKE_INSTALL_PREFIX の Value を押して, 先程作成した build を探して選んでください.

  14. 再び Configure を押してください.

  15. 画面が白くなったら, Generate を押してください.

  16. 開いていたコマンドプロンプトで build_space に移動し, 次のコマンドを入力してください.
    C:¥Users~> mingw32-make

  17. 終了したら, 同じ場所で次のようにコマンドを入力してください.
    C:¥Users~> mingw32-make install

  18. build に新しく lib, bin ができたら成功です.

  19. MinGWの中(gfortranとかがあるところ)にある lib, bin に, 先程出来上がった build の中身をコピーしてください.

サンプルコード

最後にサンプルコードを用意いたしました。
逆行列を求めて行列積を行うプログラムです。
確認のためにコピペして試してみてください。

  gfortran test_lapack.f90 -lm -lblas -llapack
test_lapack.f90
program inverse
  implicit none
  integer, parameter :: N=2
  double precision A(N,N), A_inv(N,N), C(N,N), work(N)
  integer :: lda=N, ipiv(N), info, lwork=N


  print *,"A="
    call random_number(A)   ! ランダムで2x2行列を生成
  call print_matrix(A,N)    !行列の表示のためのサブルーチン

  print *,"A_inv"
    A_inv = A   !行列を保存するために, A_invにAを代入しておいた
    call dgetrf(N, N, A_inv, lda, ipiv, info)
    call dgetri(N, A_inv, lda, ipiv, work, lwork, info)
  call print_matrix(A_inv,N)

  print *,"C"
    call dgemm('N', 'N', N, N, N, 1.d0, A, N, A_inv, N, 0.d0, C, N)
  call print_matrix(C,N)

end program inverse




!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
!::: 行列表示のためのサブルーチン
!::: 引数はprint_matrix(_表示したい正方行列の配列_, _正方行列の行数_)
subroutine print_matrix(X,N)
  integer i, j, N
  double precision X(N,N)
  do i=1,n
    do j=1,n
      write(*,fmt='(f15.8)',advance='no') X(i,j)
    end do
    write(*,*)
  end do
  print *, "==============================="
end subroutine