A View of Tanichu (たにちゅーの思惑)

This blog is about personal thoughts and views by Tanichu. Tanichu is a nickname of Tadahiro Taniguchi.

CPPLAPACKの導入法

CPPLAPACKの導入法

CPPLapackは BLAS および LAPACKC++ クラスラッパーです.

CPPlapack自体はヘッダーのみで構成されていて,CPPlapackが内部でlapackやatlasライブラリを呼び出すことによってユーザが簡単にC++lapackやatlasライブラリを使用できるようにしたものです.

http://cpplapack.sourceforge.net/doc/main_page/Japanese.html

このURLが参考となるかもしれません.

Linux編〜

1.ライブラリのインストール

Synaptic(Ubuntuなら)パッケージ・マネージャでlapackを検索して適切なものをインストールしてください.(下記はVine Linux 4.2の一例)

clip_image002[7]

また,コマンドからインストールする方法は,

clip_image003

としてroot権限になります(この作業は各Linuxとも共通です).Ubuntuの場合は

clip_image004

としなければならないかもしれません.(ローカルユーザの場合)

rootユーザになってから

Ubuntudebianなどの環境なら

clip_image005

でインストールをしてください.最新のUbuntu8.10では,パッケージ名がliblapack3gfという名前に変わっているので注意してください.

また,Fedoraなどでは

clip_image006

でインストールができます.また,OS等によりパッケージ名は変わるので適宜検索等を行い調べて適切なものをインストールしてください.

ここで,CPPLapackのプロジェクトページよりヘッダーのダウンロードをしましょう.

http://sourceforge.net/projects/cpplapack/

よりcpplapack-2005_03_25.tar.gzをダウンロードします.

clip_image007

このようにコマンドで直接ダウンロードしてもかまいません.

そこで,できたcpplapackを解凍します.

clip_image008

そして,

clip_image009

として解凍したフォルダに入りましょう.

すると中には

clip_image010

とあると思いますので,ここでrootユーザとなって/usr/local/以下にインストールしましょう.

clip_image011

このようにして/usr/local/includeの中にcpplapackのヘッダーをコピーしてください.このディレクトリにコピーすることによりコンパイラはヘッダーファイルを見つけることが可能となります.

また,rpmコマンドが使える環境(Fedora, VineUbuntuもインストールしているなら))ならcpplapackのプロジェクトページよりcpplapackのrpmパッケージをダウンロードしてインストールした方がより簡単に済みます.

clip_image012

rootになってからrpmコマンドでインストールします.(すでにrootユーザの場合suコマンドは不要)

clip_image013

この場合cpplapackが/usr/include下に自動的にインストールされるので標準ライブラリを使う時と同様に扱え便利です.(コンパイル時にディレクトリを指定する特殊な操作が不要ということ)

2.サンプルプログラムの実行

では,準備ができたらサンプルを作成してコンパイルを行ってみましょう.

ホームディレクトリにtest.cというファイルを用意し

1

2

3

4

5

6

7

8

9

10

11

#include

int main()

{

CPPL::dgematrix A(2,3);

A(0,0)=1; A(0,1)=7; A(0,2)=5;

A(1,0)=3; A(1,1)=4; A(1,2)=6;

std::cout << A << std::endl;

return 0;

}

と入力してください.コンパイルの方法は

clip_image014

とすると,ホームディレクトリにtestが作成され

clip_image015

とこのような結果となればインストールは成功です.

ここでCPPL::i()は逆行列を求める関数ですが,この関数を用いる場合はコンパイル時にライブラリをリンクする必要があります.

1

2

3

4

5

6

7

8

9

10

11

12

13

#include

int main()

{

CPPL::dgematrix A(2,2);

A(0,0)=1; A(0,1)=7;

A(1,0)=3; A(1,1)=4;

std::cout << A << std::endl;

CPPL::dgematrix B = CPPL::i(A);

std::cout << B << std::endl;

return 0;

}

このようなAの逆行列を求める場合は

clip_image016

としてコンパイルする必要があります.(-llapackで/usr/libディレクトリに存在するliblapack.*** (***は環境により異なる)というライブラリをリンクするという意味です.)

clip_image019

3.基本的な使用例

cpplapackで主に使うクラス,変数はdgematrix(一般行列),drovector(行ベクトル),dcovector(列ベクトル)でしょう.これらは四則演算等の演算子がそのまま使えます.(演算子オーバーロードされている)

http://cpplapack.sourceforge.net/doc/html/index.html

このページに詳しく書かれているので,どのようなメンバ関数があるのかは自身で調べてください.

サンプルとして行,列ベクトルのそれぞれの掛け算と逆行列逆行列,転置を載せておきます.参考にしてください.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

#include

#include

int main()

{

CPPL::dgematrix A,iA,tA;//一般行列

CPPL::drovector R(2);//行ベクトル

CPPL::dcovector C(2);//列ベクトル

double S;

R(0) = 3; R(1) = 4;

C(0) = 5; C(1) = 6;

A = C*R;//列x行

S = R*C;//行x列

iA = CPPL::i(A);//逆行列

tA = CPPL::t(A);//転置

std::cout <<"R n" << R << std::endl;

std::cout <<"C n"<< C << std::endl;

std::cout <<"A n"<< A << std::endl;

std::cout <<"S n"<< S << std::endl;

std::cout <<"iA n"<< iA << std::endl;

std::cout <<"tA n"<< tA << std::endl;

return 0;

}

実行例

clip_image021

4.分割コンパイル方法

(複数ソースコードファイルに分けたプログラムのビルド方法)

プログラムを書いていくとコードが非常に長くなり,ある特定の機能を持つモジュールを特定のファイルに分割してコンパイルしたい場合があります.そのようなときに役立つのがMakefileです.書き方はいろいろありますが,一例を載せておきます.

clip_image022

このような書き方でsample.cppをmain関数の存在するメインファイルとして,cpplapack_plus.h,cpplapack_plus.cppが新たに作ったモジュールとしてファイルを分割してコンパイルすることが可能です.

コンパイルするときはmakeとすれば,

clip_image024

このようにコンパイル可能です.

また,新たにファイル(例えばadd.cpp と add.hというファイルを追加するとする)を作成しMakefileへと追加する場合はMakefileの内容を

clip_image025

のように変更すれば,追加することができます.(赤色の部分が変更点)

Windows編〜

まず,CPPLAPACKのヘッダーをダウンロードしてください.

http://sourceforge.net/project/showfiles.php?group_id=78519&package_id=87720&release_id=315440

よりcpplapack-2005_03_25.tar.gzをダウンロードして解凍してください.

適当な解凍ソフトで解凍したのち,その得られたcpplapack-2005_03_25とうフォルダをC:に置いてください.

次にライブラリの準備をします.

ライブラリを

http://www.netlib.org/clapack/index.html

のサイトからCLAPACK-3.1.1-VisualStudio.zip

をダウンロードして,解凍したフォルダCLAPACK-3.1.1-VisualStudio

を同様にC:直下に置いてください.

C:直下に図のようにおけたらVisualStudioを起動しましょう.

VisualStudioを起動したら

clip_image027

メニューのツールよりオプションを選択してください.

clip_image029

オプションを開いたら,左のメニューの「プロジェクトおよびソリューション」の中の「VC++ ディレクトリ」を選び,ディレクトリを表示するプロジェクトのコンボボックスの中の「インクルードファイル」を選択します.

そしてclip_image031を押して新しい行を追加し,その右側のclip_image033を押し先ほどC:直下に置いたcpplapack-2005_03_25の中のincludeファイルを選択します.

(C:cpplapack-2005_03_25includeこのディレクトリを追加します.)

同様に,コンボボックスを「ライブラリ ファイル」に変更して同じようにclip_image034を押して新しい行を追加し,

その右側のclip_image035を押し,CLAPACK-3.1.1-VisualStudioの中のLIBの中のWin32を選択します.(64bitOSならx64を選択)

(C:CLAPACK-3.1.1-VisualStudioLIBWin32このディレクトリを追加)

以上で設定は完了です.

おつかれさまでした.準備ができたらサンプルコードを書いてインストールができたかを見ましょう.

新たにVisualStudioを起動したら,プロジェクトを作成してください.

Win32コンソール アプリケーション」を選び,プロジェクトを作成してください.作成できたらまずプロジェクトのプロパティを開き,ライブラリをマルチスレッド又はマルチスレッド デバッグに変更してください.

clip_image037

変更できたらソースにこのようにタイプしてください.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

// cpplapack_test.cpp : コンソールアプリケーションのエントリポイントを定義します。

//プリコンパイル済みヘッダーファイルを使用する(/Yu)場合はインクルード

#include "stdafx.h"

#include

//ライブラリリンク

#ifdef WIN32

#ifdef _DEBUG

#pragma comment(lib,"f77blaswrapd.lib")

#pragma comment(lib,"libf2cd.lib")

#pragma comment(lib,"BLASd_nowrap.lib")

#pragma comment(lib,"clapackd_nowrap.lib")

#else

#pragma comment(lib,"f77blaswrap.lib")

#pragma comment(lib,"libf2c.lib")

#pragma comment(lib,"BLAS_nowrap.lib")

#pragma comment(lib,"clapack_nowrap.lib")

#endif

#endif

int main()

{

CPPL::dgematrix A(2,2);

A(0,0)=1; A(0,1)=7;

A(1,0)=3; A(1,1)=4;

std::cout << A << std::endl;

CPPL::dgematrix B = CPPL::i(A);

std::cout << B << std::endl;

return 0;

}

このようにタイプして,正常にコンパイルが通り,

clip_image039

このような結果となればOKです.お疲れ様でした.

補足説明:

8

9

10

11

12

13

14

15

16

17

18

19

20

21

//ライブラリリンク

#ifdef WIN32

#ifdef _DEBUG

#pragma comment(lib,"f77blaswrapd.lib")

#pragma comment(lib,"libf2cd.lib")

#pragma comment(lib,"BLASd_nowrap.lib")

#pragma comment(lib,"clapackd_nowrap.lib")

#else

#pragma comment(lib,"f77blaswrap.lib")

#pragma comment(lib,"libf2c.lib")

#pragma comment(lib,"BLAS_nowrap.lib")

#pragma comment(lib,"clapack_nowrap.lib")

#endif

#endif

これは,ソースコードでどのライブラリをリンクするかを指定しています.Linuxでのg++オプションの”-llapack ?lblas ?lf2c”に相当するものです.このこのように

#ifdef WIN32

#endif

で括っておけばソースコードLinux環境のg++でコンパイルしても無視されるため,他環境への移行も簡単になります.また,

#ifdef _DEBUG

ではビルドの設定を指定しています.Debugモードでビルドする場合はVisualStudioで自動的に

#define _DEBUG

とマクロが定義されるために_DEBUGが有効になりビルドモードに応じて適切なライブラリがリンクされます.

Linux編おまけ〜

Lapackなどのライブラリをパッケージ・マネージャでインストールすることができない環境での構築法を書いておきます.以下かなり操作が煩雑になります.

CLAPACKとATLASというライブラリをソースコードからコンパイルしてライブラリを作成します.

まず,

http://sourceforge.net/project/showfiles.php?group_id=23725

からStable版のatlasライブラリをダウンロードします.

09/3/4時点ではatlas3.8.3.tar.gzが最新版のようです.

atlas3.8.3.tar.gzをダウンロードしたら,解凍します.

clip_image040

するとATLASというフォルダができるので,そのディレクトリに入ってATLASライブラリをコンパイルします.そこで

clip_image041

として,ATLASディレクトリの中に新たなMyObjというディレクトリを作成します.そしてMyObjディレクトリの中に入り下記のコマンドを打ちます.

clip_image042

エラーが出ずにconfigureが終わればそのまま

clip_image043

と打ち,コンパイルが完了するのを待ちます.コンパイルが完了するとMyObj以下のlib/フォルダにlibatlas.a libf77blas.a libptcblas.a libtstatlas.a libcblas.a liblapack.a libptf77blas.aというライブラリができているのを確認してください.

clip_image044

そして,このライブラリはいったんこのままにしておき,次にlapackの準備をします.

http://www.netlib.org/clapack/index.html

よりclapack.tgzをダウンロードします.
clip_image045

clip_image046

ここで先ほど作成したATRASのライブラリをこのCLAPACKフォルダにコピーします.

clip_image047

となり,コピーできたら次にCLAPACKのmake.inc.exampleを編集します.

make.inc.exampleの中の

clip_image048

clip_image049

と書き換えます.そしてmake.inc.exampleをmake.incとリネームします.

clip_image050次にCLAPACKをコンパイルします.

clip_image051

と打ち,コンパイルが正常に完了するのを待ちます.コンパイルが完了するとディレクトリの中が

clip_image052

となり,新しくlapack_LINUX.a,libcblaswr.aができているのを確認してください.

次に,順に下記のコマンドを打ち

clip_image053

clip_image054

clip_image055

clip_image056

と打っていきます.するとディレクトリは

clip_image057

のようになっていればOKです.ここで新たにliblapack.aとlibblas.aがあればOKです.また,libf2c.aはF2CLIBS/フォルダの中にあります.

それも必要なら~/libに入れておきましょう.

このliblapack.aとlibblas.aの二つのライブラリをホームディレクトリにlibフォルダを作成してその中に入れておきます.

clip_image058

ライブラリのコンパイルが完了しました.このライブラリを実際に使用するには,先のサンプルをコンパイルするときに

clip_image059

としてコンパイルしてください.お疲れ様でした.

参考にしたURL

http://www.eml.hiroshima-u.ac.jp/member/staff/tamaki/LTI-Lib/index.php?LAPACK%2BATLAS

資料作成のために研究室のscuderia(Xeon Ubuntu 2.6.22-15-generic x86_64)マシンとmondeo(Pentium4 Fedora 2.6.25.9-40.fc8 i686)でライブラリコンパイルして作成し,テストプログラムの動作を確認した.(mondeoではCPPL::t 転値が使用できなかった)