How to use GSL with Visual C (Visual C でGSLを使う方法) (PDF

GSLを使ってみよう
Visual C/C++で数値計算ライブラリを使う方法のメモ
九州大学大学院 工学研究院
航空宇宙工学部門 宇宙機ダイナミクス研究室
平山寛
2008/6/20
「車輪の再発明」をしていないか?
車輪の再発明(しゃりんのさいはつめい)とは、「広く受け入れられ確立した
技術や解決法を無視して、同様のものを再び一から作ってしまう事」の慣用
句。英語では Reinventing the wheel であり、世界中で使われる。
車輪を題材にして、「広く受け入れられ確立した技術や解決法を無視して、
同様のものを再び一から作ってしまう事」を示している。新たな付加価値が
何もないものを作成するのにコストをかけることから、皮肉的なニュアンスで
用いられる。再発明を行ってしまう理由としては、「既存のものの存在を知ら
ない」「既存のものの意味を誤解している」といったことが挙げられる。主にIT
業界、特にSE・プログラマの間で良く用いられる。これらの業界では、ライブ
ラリや先行事例があるにもかかわらず、多様な理由でそれを利用せず、コー
ドやプログラミング技法を再び一から作ってしまう事が多い。
教育の現場では、ある技術の意味を理解させるために、意図的に車輪の再
発明を行わせる場合がある。
ウィキペディアの解説より引用
数値計算の場合・・・
z我々の分野でよく使う数値計算
¾数値積分(微分方程式)
¾ベクトル・行列計算
¾ベッセル関数,ルジャンドル関数(摂動問題で)
zこれらは再発明しなくても、既存の数値計算
ライブラリが利用できる。有名なのは、
¾Numerical Recipes → 研究室に書籍があります
(ソースは書籍を見て打ち込むか、別途購入)
¾GSL → これを使ってみよう!
GSLって?
GNUはUNIXの世界では
定評のある、フリーソフト
フェア開発の有志団体。
産総研・富永氏による和訳マニュアルから引用
信用できるだろうか?
z ブラックボックスにならないか?
¾ ソースコードは公開されています。
¾ 数百ページに及ぶ詳細な説明書も公開されています。
• つまりNumerical Recipesを丸写しするのと透明度は違わない。
• 解説文書が不完全な、先輩のプログラムをもらうより良いかも。
z 最新版がダウンロードできる
¾ 改訂の遅いNumerical Recipesの書籍版(とくに日本語)
よりバグは少ないと考えられる。
• Numerical Recipes も購入すればダウンロードできますが。
z 開発集団はボランティアとはいえ計算科学の専門家
¾ (恐らく)我々程度の生半可なプログラマが作るコードより
信頼できると考えます。
数値計算の理論そのものが
専門ではないという意味で。
入手方法
z 2008年6月現在 最新版はgsl-1.11
z ソースコード(GNU公式サイトから)
http://www.gnu.org/software/gsl/
¾ UNIXならソースからコンパイルしてインストール
z Windows Visual C/C++用
コンパイル済みバイナリファイル(CERNから)
http://service-spi.web.cern.ch/service-spi/external/distribution/
¾ ここからGSL_<version>__LCG_<platform>.tar.gz
というファイルをダウンロード
¾ 最新版はGSL_1.10__LCG_win32_vc71.tar.gz
ちなみにCERNは欧州の素粒子研究所で、
計算科学にも強く、WWW発祥の地。
展開
ztar.gzを展開できるソフトで、展開する。
z下図のようなディレクトリ構成になる。
¾include¥gslディレクトリ内にはヘッダファイル
(拡張子 *.h)
¾libディレクトリ内にはライブラリファイル
(拡張子 *.lib, *.dll)
ヘッダファイルの配置
z 展開した gsl フォルダを
(Visual Studioのインストール先)¥VC¥include
の中にコピー
z これで、ソースファイルからは
#include <gsl/gsl_***.h>
として参照できる。
静的ライブラリ(*.lib)の配置
z (Visual Studioのインストール先)¥VC¥lib
内に gsl フォルダを作る
z 展開した lib フォルダ内の *.lib ファイルを
(Visual Studioのインストール先)¥VC¥lib¥gsl
の中にコピー
*.exp ファイルは、ふつう使いませんが、
とりあえず一緒にコピー
動的ライブラリ(*.dll)の配置
z gsl.dll と gslcblas.dll を実行PATHの通った所に置く。
定番の場所は、
¾ 今後よく使うようなら、C:¥WINDOWS¥system32 内へコピー。
• この場合、一度だけコピーすればよい。
¾ たまにしか使わないようなら、先にプロジェクトを作製(次頁以降)し、
コンパイルしてから、生成された実行ファイル(*.exe)と同じ場所へコピー。
• プロジェクトフォルダ内の、debug ないし release というフォルダである。
• この場合、新しいプロジェクトを作るたびに、DLLをコピーして入れる必要がある。
gsltestというプロジェクトで使用する例
又は system32 へ
Visual C/C++での設定概要
z 以上で、GSLの使用準備は完了。
z 続いて、 Visual C/C++での作業となる。
1. 新規プロジェクトを作製
2. C/C++のプログラムソースを作成
(使用する関数のヘッダファイルをインクルードする)
3. プロジェクトのプリプロセッサを設定
4. 静的ライブラリを設定
5. コンパイル
6. (必要なら)DLLを実行フォルダにコピー
7. 実行
z これらの設定は、新規プロジェクトを作製するたび
に行うこと。3番以降の手順は、DebugからRelease
に切り換えたときも設定し直すこと。
プログラミング
zプロジェクトを作成する
z拡張子*.c ないし *.cpp のプログラムを作製
z使用する関数のヘッダファイルをインクルード
¾#include <gsl/gsl_***.h> とします
¾***のところは関数の説明書で調べること
(gsl_matrix.hなど)
プリプロセッサの設定
z 「プロジェクト」メニューから「プロパティ」を開く
z 「構成プロパティ」→「C/C++」→「プリプロセッサ」
z 「プリプロセッサの定義」に ;GSL_DLL を追加
プロジェクトにC/C++のソースファイル
を追加してからでないと現れない
静的ライブラリの設定
z 「プロジェクト」メニューから「既存項目の追加」して
z ライブラリフォルダに保存してある*.libファイルを
プロジェクトに追加
¾ gsl.lib GSL基本ライブラリ:必須
¾ gslcblas.lib 線形代数ライブラリ:必要に応じて
(BLAS = Basic Linear Algebra Subprogram)
gsl.exp
gslcblas.exp
gslML.lib
gslcblasML.lib
は、特殊なプロジェ
クトで使います。
とりあえず無視。
プロジェクトのプロパティで
設定する方法もあるけど、
難しいので説明省略します。
ドラッグ&ドロップでも追加できます
サンプルプログラム
#include <stdio.h>
#include <gsl/gsl_rng.h>
#include <gsl/gsl_vector.h>
#include <gsl/gsl_blas.h>
int
main (void)
{
const gsl_rng_type * T = gsl_rng_default;
gsl_rng * r = gsl_rng_alloc (T);
int i;
printf ("Here are ten random numbers in the range 0-99:¥n");
for (i = 0; i < 10; i++)
{
int k = gsl_rng_uniform_int (r, 100);
printf(" %d", k);
}
printf("¥n");
{
double x[5] = { 1.0, 2.0, 3.0, 4.0, 5.0} ;
double y[5] = { 5.5, 4.4, 3.3, 2.2, 1.1} ;
gsl_vector_view v = gsl_vector_view_array(x, 5);
gsl_vector_view w = gsl_vector_view_array(y, 5);
printf("blas operation DAXPY¥n");
printf("x:"); for (i = 0; i < 5; i++) { printf(" %g", x[i]); } ;
printf(" y:"); for (i = 0; i < 5; i++) { printf(" %g", y[i]); } ;
gsl_blas_daxpy (1.0, &v.vector, &w.vector);
printf("¥n");
printf("a x + y:"); for (i = 0; i < 5; i++) { printf(" %g", y[i]); } ;
}
printf("¥n");
return 0;
}
乱数発生と行列演算のデモ
GSL 1.2 for Visual C
に付属していたサンプルです。
実行結果
配布上の注意
zプログラムが完成し構成を「Debug」から
「Release」に変えたなら、プリプロセッサ
の設定で ;GSL_DLL を追加し直す。
zコンパイルした実行ファイルを、人に渡す
ときは、実行ファイルと同じフォルダに
gsl.dllとgslcblas.dllを入れてあげるとよい。
本稿での開発環境
zこの文章は以下の環境に基づいて執筆した
¾Microsoft Windows XP SP2 Professional
¾Microsoft Visual C++ 2005 Express Edition
z他のバージョンではフォルダ名や、メニューの
名前が異なるかもしれない。
参考サイト
zGSL公式サイト
http://www.gnu.org/software/gsl/
z産総研 富永氏による説明書の和訳
http://www.cbrc.jp/~tominaga/translations/index.php
対抗品
Numerical Recipesについて
z Numerical Recipesの公式サイト
http://numerical-recipes.com/
¾ Numerical Recipes in C の英語版は
無料でダウンロードできます。
¾ Numerical Recipes in C++ は書籍販売のみ。
¾ 掲載しているソースコードは$65で販売。
z 研究室にNumerical Recipes in C の
日本語版書籍があります。
¾ 原著の第1版の本文+第2版のコード相当。
¾ 英語の直訳が多く読みにくい。
z 数値計算アルゴリズムの教科書としてはよい
と思うのですが、ネットで検索すると、けっこう
批判意見も見つかるのが気になります。
¾ Why Not Numerical Recipes? など
(和訳) http://nakano.webmasters.gr.jp/nr.html
¾ まあ、それだけ大勢に利用されている証拠でもある。