たにちゅーの思惑|谷口忠大Home Page(たにちゅー・どっと・こむ)

2017 年 11 月
« 1 月    
 12345
6789101112
13141516171819
20212223242526
27282930  

新着記事

最近のコメント

HOME > たにちゅーの思惑 >  研究 > CPPLAPACKの導入法

CPPLAPACKの導入法

2009-05-19  (tue)|カテゴリー:

CPPLAPACKの導入法

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

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ユーザになってから

Ubuntuやdebianなどの環境なら

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, Vine(Ubuntuもインストールしているなら))なら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 <cpplapack.h>

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 <cpplapack.h>

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 <iostream>

#include <cpplapack.h>

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 <cpplapack.h>

//ライブラリリンク

#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 転値が使用できなかった)

COMMENTS コメント

  1. じゃろうが 2009-08-27 (thu)

    大変参考になりました。
    ありがとうございます!

  2. たにちゅー 2009-08-27 (thu)

    そういっていただけると何よりです!
    がんばって下さい!

  3. たにちゅー 2009-12-17 (thu)

    上記の方法でやるとwindowsでコンパイルエラーが起きるようになっている・・.

    ■[C++]Visual Studioでcpplapack-2005_03_25を使うとC2440エラーになる
    http://d.hatena.ne.jp/babydaemons/20090728/1248775645

    http://sourceforge.net/projects/cpplapack/forums/forum/267868/topic/1374927

    VC7コンパイラのバグだそうですが,
    そんなのありかよって感じッスネ

  4. たにちゅー 2009-12-17 (thu)

    1>c:\cpplapack-2005_03_25\include\dgematrix-\dgematrix-misc.hpp(163) : error C2061: 構文エラー : 識別子 ‘A’
    1>c:\cpplapack-2005_03_25\include\dgematrix-\dgematrix-misc.hpp(165) : error C2440: ‘=’ : ‘double **(__cdecl *)(void)’ から ‘double **’ に変換できません。
    1> この変換が可能なコンテキストはありません。

    このようなエラーが出ることがありますが,
    これはVC7のバグだそうで,

    エラーの時に指摘されるファイル群について
    “*-misc.hpp”の中にあるswap関数で

    double** A_darray(A.Darray);
    ==> double** A_darray=A.Darray;

    のような修正をすればOKだそうです.

    vectorについて同じような,ファイルが後数個ありますが
    それらも同様に宣言部の()を= に切替える事で対応します.

    上記サイトより.

  5. おでゅる 2010-12-14  (tue)

    はじめまして,たにちゅーさん.
    こちらのサイトとても参考になります.ありがとうございます.

    しかし,小姓未だにコンパイルエラーが出てうまく実装することができておりません.
    もしよろしければ,少しご教示戴けますでしょうか?

    小姓の環境は下記の通りです.
    win-xp上で,VC++2008,Cygwin + g++ この2 つの環境で行っています.その中で以下のエラーがそれぞれ出ます.
    また,ソースはたにちゅーさんもリンクされていたページの固有値問題のままです.

    VC++2008:CPPL::t(A),CPPL::i(A)といった基本的な演算はできるのですが,A.dgeev(wr, wi ,vrr, vri)といった計算を行わせようとすると,

    error LNK2019: 未解決の外部シンボル __imp___CrtDbgReportW が関数 “public: double & __thiscall std::vector<double,class std::allocator >::operator[](unsigned int)” (??A?$vector@NV?$allocator@N@std@@@std@@QAEAANI@Z) で参照されました。
    : fatal error LNK1120: 外部参照 1 が未解決です。

    とこのような,エラーが出てコンパイルが通りません.
    なお,マルチスレッドの部分並びに,追加の依存ファイルにCLAPACK関連ライブラリは既に記述しています.

    Cygwin + g++:CPPL::t(A)はできるのですが,CPPL::i(A)は
    (.text$_ZN4CPPL9dgematrixC1ERKSO_[CPPL::dgematrix::dgematrix(CPPL::dgematrix const&)]+0xd5): undefined reference to ‘_dcopy_’
    となってしまい,コンパイルが通りません.
    また,A.dgeev(wr, wi ,vrr, vri)も同様のエラーがでるのですが,A.dgeev(wr, wi)とした場合は一応動作しました(但し,2 th eigen valeの値があちらの結果とは違っていました)ので,vectorで定義されているものが,何か悪さをしているのかもしれません.

    もしよろしければ,ご教示くださいませ.

  6. じゅんこ 2011-02-12 (sta)

    細かい事で申し訳ないのですが,2点ほど。

    VC++で使う際ライブラリリンクの部分をこのサイトから
    コピーすると,”"の部分が全角になっているためエラーが
    でるので注意してください。

    もう一点は,すでに指摘されているとおり 同じくVC++で使用する際,cpplapack.hのある部分を書き換えなければなりませんが

    double** A_darray(A.Darray);
    ==> double** A_darray=A.Darray;

    もう一箇所,書き直さなければならないケースがありました。
    ビルドした際,エラー箇所が出ると思います。
    これと同様にして書き直すとエラーが出なくなりました。

コメントの投稿




*


下記のタグが使用できます。
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <img localsrc="" alt=""> <pre lang="" line="" escaped="">

インフォメーション

LECTURE menu



tanichuの著作

copyright © Tadahiro Taniguchi All Right Reserved.