サポートする環境
サポートするOS
簡易インストーラが対応しているOSは以下の4つです.対応外のOSにも手動でインストールできますが面倒です.
1.Ubuntu 18.04
2.Ubuntu 20.04
3.CentOS 7
4.CentOS 8
サポートするCPU
基本的にはIntel CPUです.
他のCPUの場合,丸めモードが変更可能なBLASを利用しにくいため,利用できはしますが,ものすごく遅いです...
近似計算のみの場合はもちろん,どのCPUでも構いませんが,その場合は別にVCP Libraryでなくても良いと思います.
インストール方法
インストーラは以下の手順で入手,実行します.
1. もし必要なら、既にインストールされているアプリのアップデート
2. wgetのインストール
3. wgetを使ってインストーラのダウンロード
4. インストーラの実行
インストーラでは,ホームディレクトリに新しいフォルダを作成します.
新しいフォルダの名前を入力するように途中で聞かれます(Please input a new folder name:)
小文字のアルファベットのみで新しいフォルダ名を設定してください.
(作成されたフォルダは後で移動しても何も問題ありません.)
Ubuntu 20.04
shell上で以下のコマンドを実行してください:
sudo apt update -y
sudo apt upgrade -y
sudo apt install wget -y
wget https://raw.githubusercontent.com/koutasekine/vcp/master/installer/install_ubuntu2004.sh
bash install_ubuntu2004.sh
途中でIntel MKLが色々と聞いてきます.その中でもupdate-alternativeの設定については,おすすめは全てyesです.
しかし,他の環境を使っている場合(例えば,pythonでscipyなど)はお気を付けください.
インストール後は以下のコマンドで,-lblas, -llapackで指しているBLASがMKLであることを確認してください.
sudo update-alternatives --config libblas.so-x86_64-linux-gnu
sudo update-alternatives --config liblapack.so-x86_64-linux-gnu
Ubuntu 18.04
shell上で以下のコマンドを実行してください:
sudo apt update -y
sudo apt upgrade -y
sudo apt install wget -y
wget https://raw.githubusercontent.com/koutasekine/vcp/master/installer/install_ubuntu1804.sh
bash install_ubuntu1804.sh
CentOS 8
shell上で以下のコマンドを実行してください:
sudo dnf update -y
sudo dnf install wget -y
wget https://raw.githubusercontent.com/koutasekine/vcp/master/installer/install_centos8.sh
bash install_centos8.sh
CentOS 7
shell上で以下のコマンドを実行してください. yum updateはカーネルのアップデートも含まれる場合があるので注意してください.
sudo yum update -y
sudo yum install wget -y
wget https://raw.githubusercontent.com/koutasekine/vcp/master/installer/install_centos7.sh
bash install_centos7.sh
コンパイル方法
Ubuntu 20.04
何も使用しない最小限のコンパイル方法:
g++ -I.. filename.cpp
kv libraryやVCP library, MKLなどの力を引き出すには以下のようにしてください.たくさんあるオプションは大抵はMKLのための設定です.Intel MKL Link Line Advisor
※ 長いので3行に書いています.
g++ -I.. -DNDEBUG -DKV_FASTROUND -O3 filename.cpp \
-llapack -lblas -Wl,--no-as-needed -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread \
-lm -ldl -lmpfr -fopenmp
Ubuntu 18.04, CentOS 7, CentOS 8
何も使用しない最小限のコンパイル方法:
g++ -I.. filename.cpp
kv libraryやVCP library, MKLなどの力を引き出すには以下のようにしてください.たくさんあるオプションは大抵はMKLのための設定です.Intel MKL Link Line Advisor
※ 長いので3行に書いています.
g++ -I.. -std=c++11 -DNDEBUG -DKV_FASTROUND -O3 -m64 filename.cpp \
-L${MKLROOT}/lib/intel64 -Wl,--no-as-needed -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread \
-lm -ldl -lmpfr -fopenmp
VCPのコンパイルオプション
全体のコンパイルオプション
-DVCP_DEBUG : 色々と表示されるようになります。-DVCP_NOMP : VCPライブラリ内でOpenMPが使われなくなります。
行列クラスのコンパイルオプション
-DVCP_MATS_NOMP : mats.hpp内のOpenMPが使われなくなります。-DVCP_NOMPで自動でONになります。ルジャンドル基底クラスのコンパイルオプション
-DVCP_LEGENDRE_DEBUG : ldbase.hppについて表示されるようになります。-DVCP_DEBUGで自動でONになります。-DVCP_LEGENDRE_NOMP : ldbase.hpp内のOpenMPが使われなくなります。-DVCP_NOMPで自動でONになります。
VCPの構成(vcpフォルダ内)
行列クラス
matrix.hpp :: 行列クラス。型と指定した型にあう行列ポリシーをテンプレートで与える。matrix<T,P>。
matrix_conv.hpp :: matrixクラス同士の型の変換用ヘッダーファイル。
matrix_assist.hpp :: imats_assist.hpp、matrix_conv.hpp、vcp_fio.hppをまとめたヘッダーファイル。
mats.hpp :: 行列ポリシー。型を与えることで指定した型の行列ポリシーが生成される。
minimatrix.hpp :: 行列ポリシー。型を与えることで指定した型の行列ポリシーが生成される。
imats.hpp :: 行列ポリシーminimats<T>とmatrixクラスのminimatsポリシーによる特殊化。符号判定を持たない型向け。
imats_assist.hpp :: 精度保証用行列ポリシーを導入したmatrixクラス用のmidradなどの補助関数用ヘッダー。
pdblas.hpp :: mats doubleを継承し、BLASで高速化した近似用行列ポリシー。BLAS、Lapackが必要。
pidblas.hpp :: imats<double,pdblas>を継承した精度保証用行列ポリシー。kv、BLAS、Lapackが必要。
vcp_fio.hpp :: matrixクラスのバイナリファイルへの保存、呼び出し用ヘッダーファイル。
ルジャンドル基底クラス
ldbase.hpp :: ルジャンドル基底を用いた楕円型偏微分方程式の近似空間を作成。
ldase_assist.hpp :: 型を限定した場合のhppファイルをまとめるファイル。
irk_legendre_parameter.hpp: ガウス-ルジャンドル法に基づくブッチャー表を作成。
implicit_rk.hpp: 与えられたブッチャー表に基づき,ルンゲクッタの陰解法を行う。デフォルトはガウス-ルジャンドル法。
make_Matrix_ldbase_on_interval.hpp :: ルジャンドル基底に区間を入れた。(Version Alpha 0.0.4まで)
数値解析用のヘッダーファイル
newton.hpp: Newton法のクラス.クラスを継承してメソッドfとdfをオーバーライドで使用。
legendre_integral.hpp: Legendre積分の分点と重みのクラスinterval_ld_weightpoint。
その他のヘッダーファイル
vcp_converter.hpp :: kvライブラリに含まれるinterval-conv.hppの改造。
vcp_psa_assist.hpp :: kv::psa型の値域を求める際の関数psa_valueとpsa_value_Hornerをまとめたヘッダーファイル。
vcp_metafunc.hpp :: is_intervalなどのメタ関数をまとめたヘッダーファイル。
vcp_timer.hpp :: 実行時間計測用のクラスのヘッダーファイル。
テストファイルの構成
行列クラスのテスト(test_matrixフォルダ内)
test_matrixbool.cpp :: matrix<bool>の使い方をまとめたファイル。
test_submatrix.cpp :: matrixクラスの機能として部分行列の使い方をまとめたファイル。
test_matrix.cpp :: matrixクラスの機能を簡単にまとめたメインファイル。中身を改造して色々と実行可能。
test_metafunction.cpp :: metafunctionの使い方を簡単にまとめたメインファイル。
test_minimatrix.cpp :: ポリシーminimatsの使い方を簡単にまとめたファイル。
test_convert.cpp :: convertの使い方を簡単にまとめたメインファイル。
test_interval_matrix.cpp :: magやintervalmagの使い方をまとめたファイル。
Check_pdblas_rounding.cpp :: matrixクラスの行列積を事前に丸めモード変更しても良いかチェックする。BLASも可能。
Check_pidblas_rounding.cpp :: 精度保証行列ポリシーpidblasの丸めモード確認用メインファイル。
Check_Compile_Option1.cpp :: コンパイルオプションによる結果を確認するファイルその1。--2.cppと対。
Check_Compile_Option2.cpp :: コンパイルオプションによる結果を確認するファイルその2。--1.cppと対。
Check_OpenMP.cpp :: OpenMPを使用しても使用前と結果が変わらないことを確認するファイル。
benchmark.cpp :: ベンチマークを計測するためのファイル。
ルジャンドル基底クラスのテスト(test_PDEフォルダ内)
test_Allen_Cahn.cpp :: ldbase.hppを用いてAllen_Cahn方程式の線形化作用素の逆作用素ノルムを求める。
test_Emden.cpp :: ldbase.hppを用いてEmden方程式を解く。
test_Emden_New_Method.cpp :: 2019年考案の新しい精度保証理論に基づく方法でEmden方程式を解く。
test_Lotka_Volterra2.cpp :: Lotka_Volterra方程式の線形化作用素の逆作用素ノルムをGoerischの方法を用いて求める。
test_Gray-Scott.cpp :: ldbase.hppを用いてGray-Scott方程式を解く。(未完)
test_Laplace_eigenvalue.cpp :: ldbase.hppを用いてLaplace作用素の固有値を解く。
test_newton1.cpp: newton.hppの使用例。単純な1変数の非線形方程式の近似解を求める。
test_newton2_Emden.cpp: newton.hppの使用例2。定常Emden方程式の近似解をnewton.hppで求める。
test_IRK_Legendre_approximate.cpp :: implicit_rk.hppを用いてODEの初期値問題の近似解を求める。
test_parabolic_Emden_approximate.cpp :: implicit_rk.hppとldbase.hppを組み合わせて,放物型偏微分方程式を離散化して得られるODEの近似解を求める方法。
test_make_Matrix_ldbase_on_interval.cpp :: テストファイル(Version Alpha 0.0.4まで)
手動による導入方法(古い方法)
1.最新バージョンのVCPライブラリをダウンロード、及び解凍する。
2.vcpフォルダ内にヘッダーファイル群が入っており、必要なものを#includeすることで導入可能。
3.testフォルダ内にテストファイル群が入っている。
4.C++11以降を前提とする。(例g++4.8のコンパイルオプション-std=C++11が必要。)
5.名前空間をVCPとしているので忘れないように。
6.精度保証付き数値計算を行う場合は柏木雅英先生が作成されたkvライブラリもダウンロードする。
7.doubleの高速な行列計算をするためにBLASやLapackを導入する必要がある。
8.BLASを用いて精度保証もする場合、丸めモードが全てのスレッドで変更されるかチェックが必要。
C++11に準拠している必要があります。
C++11として
・右辺値参照(move、&&など)
・可変長テンプレート
・std::enable_if
・std::is_constructible
・defalt
・override
・randomのメルセンヌ・ツイスター
などを使っています。
gcc 5.4.0 with Ubuntu 16.04 on windows 10 (bash on windows with Creators Update)(2017年5月24日記載)
・(確認済)gcc 7.4.0 with Ubuntu 18.04 on windows 10 (bash on windows 1903)(2019年10月2日追記)
普段はこの環境で開発しています。 OpenBlasについてはgcc 4.8.4 with Ubuntu 14.04 on windows 10 (bash on windows)同様にapt-get installで入るOpenBLASは各スレッドの丸めモードが変更されません。 そのため精度保証では利用できません。 Creators Update後はIntel MKLがインストール可能です。 (追記)Fall Creators Update後のWindows Subsystem for Linux, Intel MKL 2018 Update 1でも検証済み 1) MKLをダウンロード(著者は商用版とAcademic Researchers用のフリー版を使用。) 2) MKLの圧縮フォルダを解凍する。 3) 解凍したフォルダのsilent.cfgをテキストエディタで開く。 4) ACCEPT_EULA=decline を ACCEPT_EULA=accept に変更し,エディタを閉じる。 5) sudo ./install.sh -s silent.cfgを実行。(何も文字は出ません) 6) source /opt/intel/bin/compilervars.sh intel64 を実行(intel64以外はリファレンスを参照)。 7) source /opt/intel/mkl/bin/mklvars.sh intel64 lp64 を実行(intel64,lp64以外はリファレンスを参照)。 6)と7)は.bashrcにでも書いておくと便利です. ・コンパイル例 : testフォルダ内で...g++ -I.. -std=c++11 -DNDEBUG -DKV_FASTROUND -O3 -m64 「メイン.cpp」 -L${MKLROOT}/lib/intel64 -Wl,--no-as-needed -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread -lm -ldl -lmpfr -fopenmp
コンパイルオプション -DNDEBUG と -DKV_FASTROUND についてはkvのリファレンスを参照して下さい。
また,MKLの丸めモードの対応については下にある gcc 4.8.5 with CentOS 7.2 を見てください。
Intel MKLのオプションはここを参照して下さい.
gcc 4.8.4 with Ubuntu 14.04 on windows 10 (bash on windows) (2017年1月7日記載)
# If you need to synchronize FP CSR between threads (for x86/x86_64 only).
CONSISTENT_FPCSR = 1
としMakeする必要があります(現在ver 0.2.19では)。 また、OpenBLAS+Lapackで解く固有値問題がシングルコアしか使われていないように見え、さらに遅いです...
・コンパイル例 : testフォルダ内で...
g++ -I.. -std=c++11 -O3 -DNDEBUG -DKV_FASTROUND 「メイン.cpp」 -llapack 「OpemBLASの.a」 -lmpfr -fopenmp
コンパイルオプション -DNDEBUG と -DKV_FASTROUND についてはkvのリファレンスを参照して下さい。
gcc 4.8.5 with CentOS 7.2(2017年1月7日記載)
この環境は大規模な計算を想定して普段利用しているものです。 OpenBLASについては上記と同じです。 また、この環境ではmklも試しています。 mklでも無事に動作します。 mklを使用する際は、mkl.hをインクルードしないで下さい。 あるいは、インクルードしたい場合はpdblas.hppのextern"C"の部分を削る必要があります。・コンパイル例 : testフォルダ内で...
g++ -I.. -std=c++11 -DNDEBUG -DKV_FASTROUND -O3 -m64 「メイン.cpp」 -L${MKLROOT}/lib/intel64 -Wl,--no-as-needed -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread -lm -ldl -lmpfr
Intel MKLはスレッド化をintelかgnu選べます。 -lmkl_intel_thread 及び -liomp5 とするとintelが選ばれます。 一方で
・コンパイル例 : testフォルダ内で...
g++ -I.. -std=c++11 -DNDEBUG -DKV_FASTROUND -O3 -m64 「メイン.cpp」 -L${MKLROOT}/lib/intel64 -Wl,--no-as-needed -lmkl_intel_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm -ldl -lmpfr
のように -lmkl_gnu_thread 及び -lgomp とするとgnuが選ばれます。 現在、確かめたところintelのスレッド化は各スレッドの丸めモードが変更され精度保証が可能ですが、gnuのスレッド化は各スレッドの丸めモードが変更されませんので注意して下さい。
Intel Composer 16.03 (on gcc 4.8.5) with CentOS 7.2(2017年1月7日記載)
Intel Composerがあるので試している程度です。 kvライブラリの動作環境にも記述されていないので精度保証をする際は確認が必要となります。 Intel Composerを使い上での注意はコンパイルオプション -fp-model=strict を付けるようにしましょう。・コンパイル例 : testフォルダ内で...
icpc -I.. -std=c++11 -fp-model=strict -DNDEBUG -DKV_FASTROUND -O3 -mkl 「メイン.cpp」
コンパイルオプション -mkl を用いてmklを使う場合、各スレッドの丸めモードが変更されるため精度保証が可能でした(Intelのスレッド化を利用?)。