BNCmatmul Version 0.21 released!

We have released BNCmatmul Ver.0.21. That dose not provide comfortable compilation but faster DD, TD, QD and MPFR prec. real BLAS functions.

遅くなりましたが,とりあえずBNCmatmul Version 0.21リリースしました。コンパイルには苦労すると思いますが,動けばそこそこ早い多倍長精度BLAS(現状は実数のみ)にはなっているかと思います。

LAPACK 3.9.0をGCCでインストール

 気が付いたらLAPACK 3.6.0のインストール方法を書いてから大分経ってたので,Ubuntu環境にTAR ballからインスト―する方法をメモ書きしておく。前提として

  • GCC (gcc, gfortran)が使える
  • make (GNU make)が使える
  • /usr/local/libにライブラリファイル(*.a)を,/usr/local/includeにインクルードファイル(*.h)をインストールできる権限(sudo)がある

を仮定している。 $ 太字がコマンドである。ついでに拙著「LAPACK/BLAS入門」のサンプルプログラム実行方法も書いておいた。

1. LAPACK 3.9.0のTAR ball(v3.9.0.tar.gz)をダウンロード

$ wget https://github.com/Reference-LAPACK/lapack/archive/v3.9.0.tar.gz
–2020-03-25 18:38:15– https://github.com/Reference-LAPACK/lapack/archive/v3.9.0.tar.gz
Resolving github.com… 52.192.72.89
Connecting to github.com|52.192.72.89|:443… connected.
HTTP request sent, awaiting response… 302 Found
Location: https://codeload.github.com/Reference-LAPACK/lapack/tar.gz/v3.9.0 [following]
–2020-03-25 18:38:16– https://codeload.github.com/Reference-LAPACK/lapack/tar.gz/v3.9.0
Resolving codeload.github.com… 52.193.111.178
Connecting to codeload.github.com|52.193.111.178|:443… connected.
HTTP request sent, awaiting response… 200 OK
Length: unspecified [application/x-gzip]
Saving to: “v3.9.0.tar.gz”
[ <=> ] 7,534,567 4.84M/s in 1.5s
2020-03-25 18:38:18 (4.84 MB/s) – “v3.9.0.tar.gz” saved [7534567]
$ ls -l v3.9.0.tar.gz
-rw-rw-r– 1 tkouya tkouya 7534567 Mar 25 18:38 v3.9.0.tar.gz
$ tar zxvf v3.9.0.tar.gz
lapack-3.9.0/
lapack-3.9.0/.appveyor.yml
(略)
lapack-3.9.0/meson.build
lapack-3.9.0/meson_options.txt
$

2. “lapack-3.9.0″ディレクトリに移動してMakefile用のincludeファイル(make.inc)をgfortran用に設定

$ cd lapack-3.9.0
$ ls
BLAS CTestCustom.cmake.in lapack.pc.in meson.build
CBLAS DOCS lapack_testing.py meson_options.txt
CMAKE INSTALL LICENSE README.md
CMakeLists.txt lapack_build.cmake Makefile SRC
CTestConfig.cmake LAPACKE make.inc.example TESTING
$ ls -l INSTALL
total 228
-rw-rw-r– 1 tkouya tkouya 483 Nov 21 16:57 CMakeLists.txt
-rw-rw-r– 1 tkouya tkouya 5355 Nov 21 16:57 dlamch.f
(略)
-rw-rw-r– 1 tkouya tkouya 2140 Nov 21 16:57 slamchtst.f
-rw-rw-r– 1 tkouya tkouya 21748 Nov 21 16:57 tstiee.f
$ cp INSTALL/make.inc.gfortran ./make.inc

3. Reference BLASを生成

$ cd BLAS
$ ls
blas.pc.in CMakeLists.txt Makefile SRC TESTING
$ make
make -C SRC
(略)

4. CBLASを生成

$ cd ../
$ cd CBLAS
$ ls
cblas.pc.in CMakeLists.txt include README testing
cmake examples Makefile src
$ make
cp include/cblas_mangling_with_flags.h.in include/cblas_mangling.h
make -C src

5. librefblas.a, libcblas.aが生成されていることを確認

$ cd ../
$ ls -l
-rw-rw-r– 1 tkouya tkouya 384424 Mar 25 18:44 libcblas.a <– cblas
-rw-rw-r– 1 tkouya tkouya 618312 Mar 25 18:43 librefblas.a <– reference BLAS

6. LAPACKを生成

$ make
make -C INSTALL run
make[1]: Entering directory `/home/tkouya/pool/lapack/lapack-3.9.0/INSTALL’
gfortran -O2 -frecursive -c -o lsame.o lsame.f
(略)
–> LAPACK TESTING SUMMARY <–
Processing LAPACK Testing output found in the TESTING directory
SUMMARY nb test run numerical error other error
================ =========== ================= ================
REAL 1308195 0 (0.000%) 0 (0.000%)
DOUBLE PRECISION 1309007 0 (0.000%) 0 (0.000%)
COMPLEX 760590 1 (0.000%) 0 (0.000%)
COMPLEX16 768086 1 (0.000%) 1 (0.000%)

–> ALL PRECISIONS 4145878 2 (0.000%) 1 (0.000%)

7. LAPACKEを生成

$ cd LAPACKE
$ make
(略)
make[1]: Leaving directory `/home/tkouya/pool/lapack/lapack-3.9.0/LAPACKE/utils’

8. ファイル確認

$ cd ../
$ ls -l
-rw-rw-r– 1 tkouya tkouya 384424 Mar 25 18:44 libcblas.a
-rw-rw-r– 1 tkouya tkouya 12336044 Mar 25 18:51 liblapack.a
-rw-rw-r– 1 tkouya tkouya 6898692 Mar 25 19:11 liblapacke.a
-rw-rw-r– 1 tkouya tkouya 618312 Mar 25 18:43 librefblas.a
-rw-rw-r– 1 tkouya tkouya 630092 Mar 25 18:51 libtmglib.a

9. /usr/local/libにライブラリ(*.a)ファイルを,/usr/local/includeにヘッダファイル(*.h)をコピー

$ sudo cp *.a /usr/local/lib
$ sudo cp CBLAS/include/*.h /usr/local/include
$ sudo cp LAPACKE/include/*.h /usr/local/include
$ ls -l /usr/local/lib
-rw-r–r– 1 root root 384424 Mar 25 19:15 libcblas.a
-rw-r–r– 1 root root 12336044 Mar 25 19:15 liblapack.a
-rw-r–r– 1 root root 6898692 Mar 25 19:15 liblapacke.a
-rw-r–r– 1 root root 618312 Mar 25 19:15 librefblas.a
-rw-r–r– 1 root root 630092 Mar 25 19:15 libtmglib.a
$ ls -l /usr/local/include
-rw-r–r– 1 root root 21243 Mar 25 20:42 cblas_f77.h
-rw-r–r– 1 root root 29918 Mar 25 20:42 cblas.h
-rw-r–r– 1 root root 444 Mar 25 20:42 cblas_mangling.h
-rw-r–r– 1 root root 8051 Mar 25 20:42 cblas_test.h
-rw-r–r– 1 root root 4236 Mar 25 19:15 lapacke_config.h
-rw-r–r– 1 root root 834528 Mar 25 19:15 lapacke.h
-rw-r–r– 1 root root 474 Mar 25 19:15 lapacke_mangling.h
-rw-r–r– 1 root root 33161 Mar 25 19:15 lapacke_utils.h
-rw-r–r– 1 root root 455216 Mar 25 19:15 lapack.h

10. 「LAPACK/BLAS入門」サンプルプログラムをインストール

$ git clone https://github.com/tkouya/lapack_blas_tutorial
$ cd lapack_blas_tutorial

Makefile.unix → 下記のように書き換え

#*************************************************#
# LAPACK/BLAS Tutorial                            #
# Makefile for Linux gcc or icc environment       #
# Last Update: 2016-12-02 (Fri) T.Kouya           #
#*************************************************#
# ------------------------ start of configuration --------------------------
# Intel C compiler
#include lapack_icc.inc ←コメント化

# GNU Compiler Collection
include lapack_gcc.inc ← コメント外して有効化

(略)
# ------------------------ end of configuration --------------------------
all: first matvec_mul linear_eq blas row_column_major eig dgecon openmp pthread ← "gpu"を外す
#all: first matvec_mul linear_eq blas row_column_major gpu eig dgecon openmp pthread spblas_mkl

lapack_gcc.inc → 下記のように書き換え

#*************************************************#
# LAPACK/BLAS Tutorial                            #
# Configuration file for GNU compiler collection  #
# Last Update: 2016-12-02 (Fri) T.Kouya           #
#*************************************************#
CC=gcc
FC=gfortran
CPP=g++

INC = -I/usr/local/include
#LIB = -L/usr/local/lib/gcc  -lgfortran -lm
LIB = -L/usr/local/lib  -lgfortran -lm

CBLAS_INC = $(INC)
CBLAS_LIB = $(LIB) -lcblas -lrefblas -lgfortran

LAPACKE_INC = -I/usr/local/include/lapacke $(CBLAS_INC)
#LAPACKE_LIB = -L/usr/local/lib/gcc -llapacke -llapack $(CBLAS_LIB)
LAPACKE_LIB = -L/usr/local/lib -llapacke -llapack $(CBLAS_LIB)

#IMKL_INC=-I/opt/intel/mkl/include
#IMKL_LIB=-L/opt/intel/mkl/lib/intel64 -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread -L/opt/intel/lib/intel64 -lifcore
#IMKL_LIB=-L/opt/intel/mkl/lib/intel64 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -L/opt/intel/lib/intel64 -lifcore -liomp5

OPENMP = -fopenmp
OPENMP_LIB = -lgomp

Makeしてコンパイル→実行ファイルの一つをお試し

$ make -f Makefile.unix
$./lapack_dgeev ←行列の固有値・固有ベクトルを計算
Dim = 3 ←次元数を入力
Eigenvalues =
0: ( 1.82216, 0)
1: ( 0.103726, 0.366921)
2: ( 0.103726, -0.366921)

(0.619085, 0) (0.634996, 0) (0.634996, 0)
(0.641249, 0) (-0.399111, -0.289681) (-0.399111, 0.289681)
(0.453358, 0) (-0.396179, 0.443416) (-0.396179, -0.443416)
||A * right_ev – lambda * right_ev||_F / ||A||_F = 4.35690729441612009e-16
||A^T * left_ev – lambda * left_ev||_F / ||A||_F = 3.79955740713784858e-16

12/1(日) 駿府・晴

 師走初日である。一気に寒くなって秋をすっ飛ばして冬になった感。富士山がきれいな季節になってしまったのである。

 「多倍長精度数値計算」,Amazonの順位を見る限り「LAPACK/BLAS入門」程度には売れているらしい。せいぜい初刷分のコストを吸収できる程度には在庫が捌けてほしいものである。黒字になって困ることはないからなぁ。高いけどよろしくお願い申し上げます。
 そーいや,早速誤字脱字のご指摘があったので,慌てて正誤表を追加した。こーゆー時にはやっぱりGitHubにサポート情報一切合切置いておくのは良い判断である。出版社が潰れてもファイルが残るというところが良い。いずれワシのサイトの情報は全部GitHub,ResearchGate,Researchmapに集約しておくことになるので,定年カウントダウンになったらボチボチやっておくことにしよう。

 「決算!忠臣蔵」を神さんと映画の日の本日見に行った。吉本興業バックアップ映画なので,そこそこ楽しめたが,クライマックスの討ち入りシーンがないというのはどーにも肩透かし感が拭えない。溝口健二の「元禄忠臣蔵」でも見るとするかな。大河ドラマでは「峠の群像」の伊丹十三,「元禄繚乱」の石坂浩二,いずれも良い殺されっぷりであった。ワシはあれが見たいのである。

 Python数値計算入門,とりあえず連立一次方程式の4章分の手前まで完成。問題はこの先で,LAPACK/BLASベースのSciPyを使う以上はせいぜい密行列用(scipy.linalg)と疎行列用(scipy.sparse.linalg)の2章にまとめてしまうのがスマートだと考えている。行列の固有値はその応用編という感じ。無駄に分厚くなるよりは,線型計算はカジュアルにお気楽に使いつつ,パフォーマンスと精度には気をつけてねという記述になれば良いかと。今月中にはここを何とかして一気に後半部分の下書きは完成させたいなぁ。

 ということであと一月頑張りましょうぞ。

幸谷智紀「LAPACK/BLAS入門」森北出版

[ Amazon ] ISBN978-4-627-84881-8, \2600 + TAX

 データ出た出たやっとデータ。悪戦苦闘したと見せかけつつ怠惰に過ごしたこの2年,毎回怒涛の如く押し寄せる編集担当Fさんの問い合わせ要求にきりきり舞いさせられながらもとうとう完成致しました。未完成の原稿を押し付けられて辟易させられた諸先生におかれましてはお詫び申し上げますと共に要らないといっても献本送り付け差し上げますのでどうぞ当方になり替わりまして恨みつらみ晴らして頂きたくいかようにもお使い下さいませませ。薄いから普通の五寸釘で打ち込めると思います。

 しかし出来上がってみればA5版で135ページ足らずのうっすいテキストなのに定価2600円(+消費税)とは暴利ではないかと訝しむそこのあなた! これでも安くしたのですよ,なにせ初版部数を売り切れるとはとても保証いたしかねる代物だし,弱小理工系出版社としては誠にリスキーな物件であるからして3000円でもどーだろーという線を何とか踏みとどまって頂いてこの価格に抑えたのですよこれでも! いーじゃない紙だけデカくて分厚くて開きづらいどっかのICTマニュアル本に比べれば,LAPACKEとCBLASとIntel Math Kernel Libraryと疎行列とMAGMAとcuBLASの解説に加えてOpenMPやPthreadまで言及しちゃってるんだから勘弁して下さいよ旦那。テキスト本体は薄くても,こっちゃどんだけしんどい思いして大量(でもないか)のプログラムを書いたとお思いか!

 まぁ,前書きにも書いたけど,この本,Web情報だけでスラスラLAPACKE, CBLASを使いこなしてプログラムをジャカジャカ書けるよーなパワフルな人向けには一切書いてませんので,読むだけ無駄,買うだけ無駄。とっととGoogleってBingってお仕事に邁進して下さいな,こちとら「行優先ってなーに?」「LU分解って酵素パワーみたいだけど洗剤?」「GPUってお絵かきのどーぐ?」ってなド素人向けに商売しようってんでぇこのすっとこどっこい。連立一次方程式と固有値問題とBLAS活用だけに話題を絞ってどんだけのことができるかっていうHPC業界と数値解析業界からは蝙蝠野郎と白い目見られそーな類書がないテキストなんでいっ。お手本がないテキスト書くってホントしんどいもんなんだよ全く,迷路みたいで精神的に参った参った。人様が積み上げたライブラリにすがってプログラムと解説書くだけでこんだけしんどいのに,全く漫画家さんとか小説家さんは偉いよなぁ,毎回読者を引き込むストーリーをスクラッチから考えなきゃいかんのだから全く頭が下がります。

 つーことで,章立てとかバグ情報とかプログラム一覧はサポートページを見て下さいな。「あの膨大なLAPACK/BLASの全解説?」ってんなわきゃねーだろっての目次見て目次。詐欺だといわれないよーに予防線張っておきますんでその辺誤解のないように一つヨロシク。まぁ学部2~4年生辺りでCは触ったことあるけどボチボチ高速な線型計算を使わないとダメなんだけど自分で書くのはシンドイという状況にある学生さんにとっては導入用としてはそこそこお役に立つのでは?ってな内容でございます。書店や図書館で見かけたらお手に取ってご覧くださいませ。で,間違いあったらお知らせ下さいませ。

 で,心は既に「多倍長数値解析入門(希望的タイトル)」に飛んでたりするんで,もちっと本格的なLAPACK/BLAS本をお望みでしたらちゃんとした線型計算・HPC屋さんにご依頼して下さいまし。なにせこの界隈の方々が立派な解説書書かないからこっちにお鉢が回ってきちゃったんだからねっ!

How to compile a LAPACKE program on Windows 8.1 x64

 Windows 8.1 x64環境下でのIntel Parallel Studio XE 2016 + Visual Studio 2016を使ったLAPACKEプログラムのコンパイル方法のメモ。

1. 必要な環境変数一切合切を用意してくれるCUIショートカット「コンパイラ―16.0 Update 2インテル(R) 64 VS2015環境」を起動

スクリーンショット 2016-02-29 17.17.43

2. LAPACKEソースプログラム”lapack_dgesv_mkl.cを置いた”c:\lapack”へ移動

2016-02-29_190704

3. シリアル実行の時はicl (C/C++コンパイラ) を使って,例えば

c:\lapack>icl lapack_dgesv_mkl.c /link mkl_intel_lp64.lib mkl_core.lib mkl_sequential.lib

とする。

c:\lapack>icl lapack_dgesv_mkl.c /link mkl_intel_lp64.lib mkl_core.lib mkl_sequential.lib
インテル(R) 64 対応インテル(R) C++ コンパイラー (インテル(R) 64 対応アプリケーシ
ョン用)、バージョン 16.0.2.180 ビルド 20160204
(C) 1985-2016 Intel Corporation.  無断での引用、転載を禁じます。

lapack_dgesv_mkl.c
icl: 注意: この製品の評価期間は 17-mar-2016 UTC に終了します。
Microsoft (R) Incremental Linker Version 14.00.23026.0
Copyright (C) Microsoft Corporation.  All rights reserved.

-out:lapack_dgesv_mkl.exe
mkl_intel_lp64.lib
mkl_core.lib
mkl_sequential.lib
lapack_dgesv_mkl.obj

c:\lapack>lapack_dgesv_mkl
Intel(R) Math Kernel Library Version 11.3.2 Product Build 20160120 for Intel(R)
64 architecture applications
Max Number of Threads: 1
Dim = 4
A =
  0:   1.000000   0.500000   0.333333   0.250000
  1:   0.500000   0.333333   0.250000   0.200000
  2:   0.333333   0.250000   0.200000   0.166667
  3:   0.250000   0.200000   0.166667   0.142857
B =
  0:   1.000000   2.000000   3.000000   4.000000
  1:   2.000000   3.000000   4.000000   5.000000
  2:   3.000000   4.000000   5.000000   6.000000
  3:   4.000000   5.000000   6.000000   7.000000
C =
  0:   4.000000   6.083333   8.166667  10.250000
  1:   2.716667   4.000000   5.283333   6.566667
  2:   2.100000   3.050000   4.000000   4.950000
  3:   1.721429   2.480952   3.240476   4.000000
X =
  0:   1.000000   2.000000   3.000000   4.000000
  1:   2.000000   3.000000   4.000000   5.000000
  2:   3.000000   4.000000   5.000000   6.000000
  3:   4.000000   5.000000   6.000000   7.000000
X - B =
  0:   0.000000   0.000000   0.000000   0.000000
  1:   0.000000   0.000000   0.000000   0.000000
  2:   0.000000   0.000000   0.000000   0.000000
  3:   0.000000   0.000000   0.000000   0.000000

4. Intel Threadを使ってパラレル実行の時はiclコマンドを使って,例えば

c:\lapack>icl lapack_dgesv_mkl.c /link libiomp5md.lib mkl_intel_lp64.lib mkl_core.lib mkl_intel_thread.lib

でコンパイル。
Core i5-2500 (4 cores)で実行すると下記のようになる。

c:\lapack>icl lapack_dgesv_mkl.c /link libiomp5md.lib mkl_intel_lp64.lib mkl_core.lib mkl_intel_thread.lib
インテル(R) 64 対応インテル(R) C++ コンパイラー (インテル(R) 64 対応アプリケーシ
ョン用)、バージョン 16.0.2.180 ビルド 20160204
(C) 1985-2016 Intel Corporation.  無断での引用、転載を禁じます。

lapack_dgesv_mkl.c
icl: 注意: この製品の評価期間は 17-mar-2016 UTC に終了します。
Microsoft (R) Incremental Linker Version 14.00.23026.0
Copyright (C) Microsoft Corporation.  All rights reserved.

-out:lapack_dgesv_mkl.exe
libiomp5md.lib
mkl_intel_lp64.lib
mkl_core.lib
mkl_intel_thread.lib
lapack_dgesv_mkl.obj

c:\lapack>lapack_dgesv_mkl
Intel(R) Math Kernel Library Version 11.3.2 Product Build 20160120 for Intel(R)
64 architecture applications
Max Number of Threads: 4
Dim = 4
A =
  0:   1.000000   0.500000   0.333333   0.250000
  1:   0.500000   0.333333   0.250000   0.200000
  2:   0.333333   0.250000   0.200000   0.166667
  3:   0.250000   0.200000   0.166667   0.142857
B =
  0:   1.000000   2.000000   3.000000   4.000000
  1:   2.000000   3.000000   4.000000   5.000000
  2:   3.000000   4.000000   5.000000   6.000000
  3:   4.000000   5.000000   6.000000   7.000000
C =
  0:   4.000000   6.083333   8.166667  10.250000
  1:   2.716667   4.000000   5.283333   6.566667
  2:   2.100000   3.050000   4.000000   4.950000
  3:   1.721429   2.480952   3.240476   4.000000
X =
  0:   1.000000   2.000000   3.000000   4.000000
  1:   2.000000   3.000000   4.000000   5.000000
  2:   3.000000   4.000000   5.000000   6.000000
  3:   4.000000   5.000000   6.000000   7.000000
X - B =
  0:   0.000000   0.000000   0.000000   0.000000
  1:   0.000000   0.000000   0.000000   0.000000
  2:   0.000000   0.000000   0.000000   0.000000
  3:   0.000000   0.000000   0.000000   0.000000

c:\lapack>