Friday, November 12, 2010

【Intel VSL】乱数発生時の注意点

 seed(初期条件)を適切に設定すること。2つ以上の乱数を発生させたいときは特に注意。例えば、quasi-random numberの場合、これは確定的な動きをするので、2つの独立するVSLの乱数生成器で(seed = 1として)「乱数発生」させても、両者が全く同じ値をとる。この場合、seed=2としなければならない。

 なお、seedはpseudo-random numberのときは初期値、quasi-random numberのときは次元を表すことに注意。詳しくはVSL Noteを参照。
To obtain a random number sequence from a given basic generator, you should assign initial, or seed values. The assigning procedure is called the generator initialization (the C language function analogous with the initialization function is srand(seed)) in stdlib.h). Different types of basic generators require a different number of initial values. For example, the seed for MCG31m1 is an integral number within the range from 1 to 231–2, the initial values for MRG32k3a are a set of two triples of 32-bit digits, and the seed for MCG59 is an integer within the range from 1 to 259–1. In contrast to the pseudorandom number generators, quasi-random generators require the dimension parameter on input. Thus, each BRNG, including those registered by the user, requires an individual initialization function. However, requiring individual initialization functions within the library interface would limit the versatility of the routines. (VSL Note, p. 31)

Thursday, November 11, 2010

【LaTeX】 AucTeX

EmacsでのLaTeX環境を提供してくれるAucTeXをUbuntuにインストール。
sudo apt-get install auctex

(注)個人的に英語でしか使わないので、日本語環境pLaTeXの設定まではわからない。

インストール後、Emacsでfilename.texを編集するには
emacs filename.tex
とすればよい。

Emacs上でfilename.dviへのコンパイルは"Ctl + c”を2回繰り返し、Entキーを押す。

さらに"Ctl + c”をし、Entキーを押すことでfilename.dviを見ることができる。

filename.dviからpdfにコンパイルすには、端末やEmacs(Alt + X)から、
dvipdf filename.dvi

Wednesday, November 10, 2010

乱数発生

 Intel Math Kernel Library (MKL)に入ってある乱数発生ライブラリーVector Statistical Library (VSL)を使うことにする。
 Fortranの組込みであるrandom_numberはpseudo-random number generatorを基礎としているらしいが、具体的な乱数発生方法はわからない(ちゃんと調べてない)。

 一方、VSLには流行のMersenne Twister (これはpseudo-random number)やquasi-random number generatorを簡単に選択することができる。

 pseudo vs. quasiにはたくさんの議論があるよう。なんとなく、後者が積分を計算する上でパフォーマンスが良い(収束が速い)というイメージ。

link
http://demonstrations.wolfram.com/MersenneTwisterAndFriends/

Thursday, November 4, 2010

RCI様様

 Intel MKLはreverse communication interface (RCI)を採用しているので、ユーザーが目的関数やヤコビアンの値を与えるサブルーチンを用意することになる。前者があるのは当たり前だが、後者があるのが面倒、なんて思ったりしたが、実はこのRCIはとてもありがたい。非線形最小二乗法で利用するヤコビアンのルーチン(central difference法)の精度がよろしくなくて、収束しない(プログラムがうまく走るか走らないかはヤコビアンに関する収束条件に大きく依存)なんてことが生じてしまう。もし解析的にヤコビアンを求めることができるなら、それを計算するサブルーチンを用意すればいいのだ。ありがたやRCI。

 自分の場合、ヤコビアンはmaximaを使ってシコシコと。なんとも原始的なアプローチ。コンピュータに詳しいなら、mathematicaとFortranを連携させてこんな無駄な作業をしなくて済むんだろうな。憧れるわー。

(追記)
 Trust Region method(信頼領域法)はglobal convergence(大域的収束)が保証されているという。でも、大域的収束の意味って、単に「少なくとも局所最適解に収束する」ことしか意味してない。もちろん、これは望ましい特徴であるのは間違いない。
 解析的にexactlyな値を与えるJacobian用のサブルーチンを用意しても、Intel MKLの1回のループでは非線形方程式を解いてくれない場合がある。
 ということで、少なくとも2通りのアプローチが考えられる。
 (1) 並列化で遺伝的アルゴリズムを採用
 (2) 収束条件を満たさなければ初期条件を変更するというsequentialな形にする
がある。将来的には別の次元(外側のループ)で並列化することを考えてるから、とりあえず後者の方法を採用してみよう。
 というか、Intel MKLの内容って、RCIと言いながら、この種の反復についてはユーザーが勝手にやってくださいねって感じなんだよな。おかしいよ。

Wednesday, November 3, 2010

makefileを作るべきかな

 コンパイル&リンクするファイルの数が増えると、いちいち入力するのが面倒になる。emacsでも、起動時は必ず入力しないといけない。

 近いうちに、これをみて勉強してみよう。

Tuesday, November 2, 2010

【Intel MKL】 Intel MKL Nonlinear Least Squaresを使う方法

Intel Math Kernel Library (MKL)の中の非線形最小二乗法ルーチンの使い方についてのメモ。ちなみに、自分のマシン環境を前提に書く。具体的には、言語はFortran90、アーキテクチャはIntel(R) 64である。リファレンスはIntel(R) Math Kernel Library for Linux* OS User's Guide January 2010, Doc. N.314774-010US(UG2010)。

  • 言語やアーキテクチャによってパスが異なるので注意。


手順は次の通り:
  1. MKLのルーチンを呼び出しているソース・コードの頭に、
    program name
    implicit none
    include 'mkl_rci.fi'
    のように、include 'mkl_rci.fi'を付け加える。

  2. 次のようにコンパイルする。
    (dynamic & threadingの場合)
    ifort filename_1.f90 filename_2.f90 ... filename_x.f90 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread

    (dynamic & sequentialの場合)
    ifort filename_1.f90 filename_2.f90 ... filename_x.f90 -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread

    (static & threadingの場合)
    ifort filename_1.f90 filename_2.f90 ... filename_x.f90 -Wl,--start-group -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -Wl,--end-group -liomp5 -lpthread

    (static & sequentialの場合)
    ifort filename_1.f90 filename_2.f90 ... filename_x.f90 -Wl,--start-group -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -Wl,--end-group -lpthread
    • ポイントは、staticの場合、cluster components(この場合使用していない)、interface、threading、そしてcomputational librariesの前後を-Wl,--start-group-Wl,--end-groupで囲うこと。
    • sequentialの場合、Compiler Support Run-time librariesは関係ないので、オプション-liomp5(compatibility OpenMP run-time libraryで、US2010が推奨)を外している。

Note.1: Intel MKLの構造
Intel MKLは次の4つの階層を持つレイヤー・モデル:

1. Interface layer
2. Threading layer --- threadingがデフォルト
3. Computational layer
4. Compiler Support Run-time libraries

であり、それぞれのレイヤー毎にユーザーが必要なライブラリの選択を行う。なお、linking modelがstaticかdynamicかで選択するファイル名が異なる(アバウトに言えば、staticなら拡張子が.aで、dynamicなら拡張子が.so)。各レイヤーの内容(選択肢)についてはUG2010 Table 3-6、3-7を参照。

注意点は以下の通り([x]はレイヤーxに関するもの):

  • [1] 2^31-1(約21億)以上の要素を持つ配列を使用する場合、デフォルト・インターフェイスのLP64ではなく、ILP64を指定する必要がある。これは配列のインデックスを与える上での問題。(UG2010, p.3-6)

  • [2] MPIを利用する等、特別な理由がない限りthreadingを選択するべき。(UG2010,p.3-5)

  • [2] sequentialを選択する場合、Compiler Support Run-time librariesは関係ない。

  • [2] sequentialを選択する場合、*sequential.*libraryを選択する。また、個の場合、link lineにPOSIX threads library(pthread)を追加する。

  • [2]Optimization Solver routinesのfunction domainはMKLがデフォで使用するスレッディング機能は使われない(UG2010,p.6-1,Using the Intel(R) MKL Parallelism)。そのため、OpenMPのスレッディングの数を指定に関するオプション設定を気にしなくてもOK。

  • [3] 非線形最小二乗法はMKL function domainではOptimization (Trust-Region) Solver routinesに対応。この場合、includeファイルmkl_rci.fiを使う。

また、UG2010は、次のように、dynamic linkを推奨している。
You are strongly encouraged to dynamically link in the compatibility OpenMP* run-time library libiomp or legacy OpenMP* run-time library libguide. Link with libiomp and libguide dynamically even if other libraries are linked statically.

Linking to static OpenMP* run-time library is not recommended because it is very easy with complex software to link in more than one copy of the library. This causes performance problems (too many threads) and may cause correctness problems if more than one copy is initialized. (UG2010,p.5-6)


Note.2: 環境設定
.profileに以下の行を追加。
# setting up MKL environment for bash
. absolute_path_to_installed_MKL/tools/environment/mklvarsem64t.sh
.の後は半角スペースが必要。

Note.3: コンパイル&リンク
ifort filename.f90 -L(MKL path) -I(MKL include)
[-I(MKL include)/{32|em64t|{ilp64|lp64}|64/{ilp64|lp64}}]
[-lmkl_blas{95|95_ilp64|95_lp64}]
[-lmkl_lapack{95|95_ilp64|95_lp64}]
[cluster components]
-lmkl_{intel|intel_ilp64|intel_lp64|intel_sp2dp|gf|gf_ilp64|gf_lp64}
-lmkl_{intel_thread|gnu_thread|pgi_thread|sequential}

[-lmkl_lapack] -lmkl_core
{-liomp5|-lguide} [-lpthread] [-lm]
なお、()はパスを表す。ただし、Note.2で環境設定している場合、-L(MKL path)-I(MKL include)を書く必要はない。

Saturday, October 30, 2010

【Fortran】 Intel MKL Nonlinear Least Squares Problem with Bounded Linear Constraint

 非線形連立方程式を解くためにアルゴリズムを探している。

 いくつかあるだろうけど、ここではIntel Compilerに同梱されているMath Kernel Library (MKL)を使う方法を考える。

 MKLの中では、線形制約下の最小二乗法のルーチンを使うことになる。このルーチンはTrust Region Methodを使っている。Trust Region Methodについては、こちらのレジュメがわかりやすい。

(追記)
 この非線形最小二乗のアルゴリズムは使い物にならないかもしれない。というのも、内部でJacobianを求めるときに引数として用意すべき外部サブルーチンの形式への規制が強すぎるから。具体的には、外部サブルーチンが sub(M,N,X,F) (Mは連立方程式の数、Nは変数の数、Xは変数、Fは関数の値)の形でなければならず、連立方程式に登場するパラメータを引数として定義することができなくなっている。もちろん、サブルーチンの中でテキストファイルから読み込むというアプローチも考えられるけど、I/O時間が余計に掛かってしまって計算が遅くなると思われる。

(追記2)
 上記の(追記)は間違い。グローバル変数を使えば大丈夫。具体的には、moduleファイルを使う。

Sunday, October 10, 2010

【Rocks】ifortの-i_dynamic -mcmodel=mediumが使えない理由

静的に2GB以上のメモリ容量を必要とする配列宣言をする場合、ifortコンパイルオプションに次のように"-i_dynamic -mcmodel=medium"を加える必要がある。
ifort -i_dynamic -mcmodel=medium -o filename.out source.f90
MPICH2を用いる場合は、
mpif90 -f90=ifort -i_dynamic -mcmodel=medium -o filename.out source.f90
とする(簡単化のため、最適化オプションなどは書いていないことに注意)。

ただし、このようにしてコンパイルされた実行ファイルをMPICH2を使って実行しようとすると問題が生じる。
$ mpiexec -machinefile mf -n #processes ./filename.out
./filename.out: error while loading shared libraries: libifport.so.5: cannot open shared object file: No such file or directory

ifortのライブラリーである"libifport.so.5"がcompute nodeからアクセスすることができないというエラー。

原因は明白。ifortをインストールしたのはfront endの/opt以下のフォルダであり、compute nodeとは共有することができないから。

対策としては、ifortを/share/apps以下にインストールすればOK。

Saturday, October 2, 2010

多分これが原因

スプライン補間の近似すげーと思った。
元の離散的なデータから滑らかな曲線で近似できる。

でも、この「滑らか」という部分で勘違いをしてしまっていたようだ。
具体的には、移動平均みたいな、滑らかな「トレンド」を抽出してくれると勘違いしてしまっていた。なんともお恥ずかしい。でもまあ、スプライン近似の定義からありえないのだが(笑)

以下の図は元のデータがギザギザな部分を含む場合。

グリッドの数は400とまあまあ細かい。
これに対してspline.f90の中の3次スプライン補間法を適用。
するとどうだろう。まあ当たり前だけど、ギザギザの部分も見事に再現してくれた。
でも、自分としてはこのギザギザを削ぎ落とした滑らかな曲線がほしいわけだ。まあ考えられる方法はあるのでいいのだ。とりあえず問題発見はできた。これがプログラムの結果が上手くいかない1つの原因と思われる。

あと、もう1つは、外挿の精度の低さ。これも図の右端でわかる。これもプログラムが上手く結果を出さない1つの原因だと思われる。

さて、これからシャワー。今日はテニスだ!

Thursday, September 30, 2010

【Fortran90】 3次スプライン補間法

関数を何らかの方法で補間する必要があるので、その方法として3次スプライン補間法を考える。よく使われているらしいから。

でも、これがよく使われる理由とは?データがたくさんあるときでも、ラグランジュ補間のように当てはまりの精度が問題にならないこと、なのかな。なぜ3次かはわからない。

B-スプラインというのも耳にしたことあるけど、これはデータの点を通過しないという点で、個人的には、問題がある。

スプラインのサブルーチンはFortran Source CodesSPLINEがある。

3次スプライン補間法(Piecewise Cubic Spline)を使うには、次のサブルーチンを使う。

  • spline_cubic_val(n,t,y,ypp,tval,yval,ypval,yppval)

  • spline_cubic_set(n,t,y,ibcbeg,ybcbeg,ibcend,ybcend,ypp)
    • 2階微分の情報を与えるサブルーチン。
    • スプライン補間の境界条件はここで設定する。自然境界(natural boundary。2つの境界点における近似関数の2階微分が0となる)を使う場合、ibcbeg=2, ybcbeg=0.0D0, ibcend=2, ybcend=0.0D0とする必要がある。

Codingの手順(自然境界条件の場合)

1. n, t, yにそれぞれデータ・ポイントの数(整数)、argumentの配列(倍精度、n個の要素)、関数値の配列(倍精度、n個の要素)を設定する。

2. ``spline_cubic_set''サブルーチンをコールして2階微分の配列yppを得る。

3. ``spline_cubic_val''サブルーチンをコールして、argumentがtval(倍精度、input)の時の関数の近似値yval(倍精度、output)、1階微分ypval(倍精度、output)、2階微分yppval(倍精度、output)を得る。


Note 1: 微分可能でない関数の近似精度は低い。特に、微分可能でない点の近傍においてそれは顕著。

Tuesday, September 28, 2010

【ifort】バグ

コーディングに問題があるにも関わらず、コンパイル・エラーが出ないバグについて、発見したものを記録しておく。[ ]の中はifortのヴァージョン。
  • [Ver.11.1_072] メインのプログラム・ファイルとモジュール・ファイルで同じ名前の変数を宣言してもエラーが出ずにコンパイルされる。ただし、値は"NaN"となる。

Monday, September 27, 2010

【Fortran】チューニング

並列計算をする前に考えるべきことは、チューニング。
簡単に思いついたものを箇条書きでメモしておく。

  • if文はできる限り使わない。
    • (例)配列を上手く使う。

  • 割り算や累乗をできるだけ避ける。
    • (例)ループ内で無駄な処理が重複しないよう、できる限りループの外へ出す。

  • メモリへの連続アクセスをできるように配列の添字の使用を行う。
    • ただし、キャッシュ・ヒット率とのバランスを考慮する。

  • キャッシュ・ヒット率を高める。
    • (例)ループ・アンローリング。
    • ただし、メモリ連続アクセスとのバランスを考慮する。

  • できる限り組み込み関数を使わない。

  • I/O処理を少なくするため、インライン展開を行う。
    • インライン展開しない場合、コンパイラの最適化が上手く行わず、処理速度が低下することがある。
    • もちろん、コードの見やすさとのバランスを考慮すべき。

【Fortran】メモリ連続アクセスとキャッシュヒット

Fortranのコーディングをしていて気づいたのだけど、何が何でもメモリに連続アクセスできるように配列の添字を最優先すればいいというわけでもないっぽい。

同じ変数を使う場合、多少連続アクセスを犠牲にしてもキャッシュ・ヒットを高めることで計算処理を高速化できる場合がある。

要は両者のバランスをうまくとる必要があるということ。この辺はプログラムを走らせながら確認しないとわからない。

Monday, September 6, 2010

オバマ氏の印象的な言葉

This is America. We don't disparage wealth. We don't begrudge anybody for achieving success. And we certainly believe that success should be rewarded. But what gets people upset -- and rightfully so -- are executives being rewarded for failure, especially when those rewards are subsidized by U.S. taxpayers, many of whom are having a tough time themselves.
Source: "New rules" @ The White House Blog

Wednesday, September 1, 2010

【R】UbuntuにRをインストール

こちらのwikiを参照。

起動は端末で
$ R
と入力すればOK。

Tuesday, August 31, 2010

【研究】計算結果は収束しそう

システムの解が複数ないか検証するため、ループの初期条件を変えてその収束先を観てみた。すると、すべてのケースで同じ値に収束した。変化率は次のようになっている。
いずれの場合も、その変化を直観的に解釈することができる点でも良い結果が得られていると考えられる。ただ、すべての変数が収束するには時間が掛かる(下図)。これは、初期条件の推測値と収束先との乖離幅が変数によっては大きくなってしまっているためだ。

Sunday, August 29, 2010

PCクラスタ、マルチコアのメリットとは?

PCクラスタは分散メモリ型の並列計算システム。マルチコアとの違いは、メモリやHDDを分散させることができるという点にあり、これが1つのメリット。

これくらいの違いしかないから、マルチコアのメリットを考えることで同時にPCクラスタのメリットを考えることができる。

ではマルチコアのメリットは何か。

これは、並列化処理を行えるということ。1つは、あるプログラム内の作業をMPI等を使って各コアに分散させるという方法。1つは、複数のプログラムをSGEを使って各コアに振り分けるという方法。個人的に、後者でまず様々なパラメータの下でシミュレーションを試してみて、最終の本格的な計算をするときに前者を使うという位置づけ。試してみたいパラメータの組み合わせは結構あるものなので、逐次に計算するとなると非常に時間が掛かってしまう。PCクラスタのように分散できる数が多ければそれだけいろんなシミュレーションを思いついたときにすぐに並列的に実行できるので生産性が大幅に上昇する。

Friday, August 27, 2010

【SGE】 Using Sun Grid Engine (SGE) in Rocks


  • To submit a serial program filename.out to SGE,

    Step 1. Make a sh file (call it "filename_sh.sh"), which contains:
    #!/bin/bash
    #
    #$ -cwd
    #$ -j y
    #$ -S /bin/bash
    #
    ./filename.out


    Step 2. Then, input the following in the command line:
    $ qsub filename_sh.sh

    In this case, output files are saved in the current folder. Messages displayed in the terminal in usual case are saved in "filename_sh.sh.ox" file.


  • To delete a job (let "id" denote the corresponding job ID) submitted but not being executed, command the following:
    $ qdel id


  • To delete a job (let "id" denote the corresponding job ID) being executed, command the following:
    $ qdel -k id

Wednesday, August 25, 2010

【MPICH2】MPICHに適したコンパイラはifort?

RocksをインストールすることでMPI環境の一つであるMPICH2を利用することができるようになる。

一方、Fortranのコンパイラはデフォルトではgfortranになっている。

あるプログラムで、それもオプションをいじらずに得ただけの結果だけど、gfortranではPCのノード数しかプロセスを並列化することができなかったのに対し、ifortを使うとその制約が無くなった。

Friday, August 13, 2010

【Ubuntu】Ubuntu 10.04にIntel Fortran Compilerをインストールする

Ubuntu 10.04にIntel Fortran Compilerをインストールする。

Last Update: August 13, 2010.

Step.1 まずはNon-Commercial Software Downloadから「Intel® Fortran Compiler Professional Edition for Linux」を選んでダウンロード。

Step.2 次に圧縮ファイルを解凍。
$ tar xvzf l_cprof_p_11.1.072_intel64.tgz

Step.3 rootになってインストールする。
$ sudo su
を入力し、Enterキーを押す。パスワードの入力を求められるので、入力する。これでOK。
# ./install.sh
後はインストーラーにしたがっていけばOK。

Step.4 rootからログアウト。homeディレクトリの".bashrc"の最後に次の一行を追加。
. /opt/intel/Compiler/11.1/072/bin/ifortvars.sh intel64
※初めの"."の後は半角スペースであることに注意。

Note.1 ただ、インストール(Step.3)の途中に
ステップ: 4 / 7 | インストール設定 - 重要な必要条件の不足
--------------------------------------------------------------------------------
インストールに必要な次のコマンドがありません。
g++;libstdc++.so.5 (library)
--------------------------------------------------------------------------------
1. 次の問題を表示する [デフォルト]
2. [必要条件サマリー] ダイアログへ戻る

h. ヘルプ
b. 前のメニューに戻る
q. 中止
--------------------------------------------------------------------------------
と表示され、"g++"と"libstdc++.so.5"をインストールすることが要求される。"g++"については
# aptitude install g++
で解決。しかし、"libstdc++.so.5"は駄目。これについてはNote.2を参照。

Note.2 こちらを参考にして、"libstdc++.so.5"を次の手順でインストールする。
# wget http://ftp.riken.go.jp/pub/Linux/ubuntu/pool/universe/g/gcc-3.3/libstdc++5_3.3.6-17ubuntu1_amd64.deb
# dpkg -i libstdc++5_3.3.6-17ubuntu1_amd64.deb

Tuesday, August 10, 2010

Windowsが数値計算に向かない1つの理由

PGI® Workstation/ServerWindows®版の詳細からの引用。
# 64ビット Windows版の PGI コンパイラでは、2GB以上の単一オブジェクトを扱うことができる Linux上の -mcmodel=medium オプションと等価な機能を提供しておりません。これは、Microsoft(R) Win64 プログラミング・モデルが、まだ 2GB を超える静的な単一データオブジェクトのハンドリングをサポートしていないためです。従って、2GB を超える静的配列を扱うようなプログラムでは、実行モジュールは生成できません。たとえ Windows 64ビット版であっても、2GBを超える単一配列オブジェクトがプログラム上に存在する場合、静的な配列宣言はできず、動的な配列宣言(Allocatable 配列宣言)を行う必要があります。これは、PGI コンパイラの制約ではなく、Win64 プログラムモデルの問題です。従って、2GB以上のデータオブジェクトを扱うプログラムをコンパイルする場合は、現在のところ、このような制約がない Linux 版の方が適しています。
※ 静的な単一配列オブジェクトとは、具体的に言えば、Fortranでは、COMMON 文宣言、ルーチン内でローカルに宣言された配列であっても、その総和が 2GB を超えるもの(メモリマップ上、シングルセクション上に割り付けられる)、C言語では、STATIC 宣言された配列等が相当します。なお、Fortran の allocatable 宣言された配列は 2GB 以上であっても問題なく実行モジュールを生成できます。

Windows x64 (Win64) は、64ビットのアドレス空間は使用できるものの、そのプログラミングモデルにおいては、上記のとおり 単一の静的データあるいはデータセクションのサイズが、2GB 以内に制限されております。従来の静的宣言された配列の多いプログラムでは大きな制約となり、2GB 以上使用するプログラムではリンケージでエラーとなるケースが出てきます。この制約は、コンパイラの問題ではなく、Win64 上の共通の制限ですので、フルに 2GB 以上の個別データ領域を使用するプログラムをコンパイル・実行したい場合は、「Linux」でのコンパイル・実行環境を強く推奨します。

Saturday, August 7, 2010

GPGPUのテキスト

GPGPUの勉強用テキストとして参考になりそうなもの。
※まだ読んだことなくて、今C++の勉強で読んでいるテキストを読み終えたら読んでいこうと思う。逸る気持ちを抑えて。。。

Tuesday, August 3, 2010

Fortran9xとC++の違い

Fortran9x(以下単純にFortran)とC++の違いについて、知っているものから順に箇条書きにしていこうと思う。

慣れれば気にならなくなる違い
  • パラメータの宣言:例えば、「a=0.5」というパラメータaを定義したい場合、Fortranでは宣言部で
    real, parameter :: a = 0.5
    と書けばよい。一方、C++ではプログラムの始めに
    #define a 0.5
    と書く方法がある。ただ、この場合aのデータ型が(普通に宣言したときのデフォルトの)倍精度実数なのか、そもそもデータ型がないのかがよくわからん。

  • 倍精度実数の宣言:
    Fortranでは"9.9D0"のように実数9.9を倍精度実数として認識させるのに"D0"をつける必要があるのに対し、C++では"9.9"とすれば倍精度実数として認識される。デフォルト設定について、Fortranが単精度実数になっているのに対して、C++は倍精度実数になっている。

  • 多次元配列のメモリ上の記録位置:
    Fortranでは
    integer, dimension(2,2) :: M
    で宣言された配列Mの各要素のメモリ上の配置は、M(1,1)→M(2,1)→M(1,2)→M(2,2)と、左側のindexを優先して並べられる。この場合、ループを書く場合は左側のindexほどループの中に書く必要がある。C++はこれとはまったく逆。右側のindexを優先してメモリ上に記録される。したがって、速いループを書くには、左側のindexほどループの外側に書く必要がある。

  • 変数の値の入れ換え:
    メインプログラムにある変数xとy(ここでは整数とする)の値を入れ換えるのに外部手続き(Fortranではサブルーチン、C++では関数)を使いたいと仮定する。このとき、Fortranでは
    subroutine exhange(x,y)
    integer, intent(inout) :: x, y
    integer z
    z = y
    y = x
    x = z

    end subroutine
    と書いて"intent"を使えばOK。一方、C++はポインタかエイリアスを使う必要がある。
    • (注)このポインタやエイリアスを使うことによって最適化が不十分になってしまうという問題点があるらしい。この点で計算速度がFortranに比べて劣るか。

  • 配列の添え字:Fortranでは配列の添え字が1から始まるが、C++では0から始まる。

  • 1次元配列(ベクトル)の書き方:1次元配列をベクトルと捉えて、例えば、v=[1,2,3]を配列vを使って定義する場合、Fortranでは
    v=(/1, 2, 3/)
    であるが、C++では
    v={1, 2, 3}
    と書く。

  • 行列(2次元配列)の初期化:
    M = [ 1, 2 ]
       [ 3, 4 ]
    という行列を2次元配列Mで定義するとき、C++は
    int M[2][2] = {1, 2, 3, 4};
    とすればよいが、Fortranでは
    integer, dimension(2,2) :: M = reshape( (/1, 3, 2, 4/), (/2, 2/) )
    とする。いずれもメモリ上に記録されている順に数値が代入されていく。


C++の面倒くさい部分
  • 累乗:
    Fortranでは「xのa乗」は"x**a"と書けばいいが、C++は累乗の演算子がなく、面倒らしい。


C++の、便利そうだが実はそうでもなさそうな機能
  • 変数の宣言位置:Fortranでは変数の宣言はすべてプログラム冒頭(なんて言ったっけ?)で宣言する必要があるが、C++は変数を使う部分より前であればどこでもOK。
    • 後で参照しやすくするため、一ヶ所でまとめて宣言する方が良いに決まってる。

Saturday, July 31, 2010

遺伝的アルゴリズム

遺伝的アルゴリズムについてわかりやすく解説を行っているページを発見。

同志社大学工学部知識工学科知的システムデザイン研究室の上浦二郎氏のページ

Friday, July 30, 2010

【CentOS】テキストモードへの切り替え

CentOSはデフォルトではGUIモードでの起動になっているけど、設定を書き換えてやれば、CUIモードで起動できるようになる。こちらを参考に、"/etc/inittab"を次のように書き換える(青文字部分が変更点。デフォルトでは"id:5:initdefault:"):
# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:

GUIを使いたい場合は、"startx"でX windowを立ち上げる。

制約条件付非線形最適化のアルゴリズム

Mathematicaさんの解説の引用です。

制約条件付きの非線形最適化に対する数値アルゴリズムは,大まかに分けると勾配法と直接探索法とに分けられる.勾配法では,第1導関数(勾配)か第2導関数(ヘッシアン)が使われる.この例には逐次二次計画(SQP)法,拡大ラグランジュ法,非線形内点法がある.直接探索法では,導関数情報は使われない.この例としては,Nelder-Mead法,遺伝的アルゴリズム,微分進化法,焼きなまし法がある.直接探索法の方が収束が遅い傾向があるが,関数と制約条件のノイズの存在への耐性は強い.

Tuesday, July 27, 2010

【Rocks】ifortを使うには

Rocks 5.3のHPC rollにはIntel Fortran Compilerが含まれていないので、ifortを利用するには自分でインストールする必要がある。スタンフォード大学のRolls Working Groupというのがあるけど、素人の自分にはかなり不親切で使い物にならない。

まず注意しないといけないのは、Rocks 5.3では、"mpif90"のデフォルト・コンパイラがgfortranになっていること。mpich2のパッケージを一度削除。再インストールするときのconfigurationでmpif90のデフォルト・コンパイラにifortを指定するという方法があるかもしれないが、mpich2のアンインストールの方法がよくわからない。

一番簡単で安全な方法は、

$ mpif90 -f90=ifort program.f90

と"-f90=ifort"を添えてやるというもの。ここで、program.f90はコンパイルするプログラムを表す。

この方法を実践する前提は2つ。
  • もちろん、ifortがインストールされている。
  • ホームディレクトリの".bash_profile"もしくは".bashrc"でifortへのパスの設定をしている。

【Rocks】Computeノードを削除するには

あるcomputeノード"compute-x-y"を削除する方法は、root権限でログインしたあとに、端末で

# rocks remove host compute-x-y
# rocks sync config


と入力すればよい。

参考

Monday, July 26, 2010

【CentOS】NICとインターネット接続

自作PCにCentOS 5.4をインストールした。カーネルのバージョンは2.6.18-164.el5("# uname -v"で調べる)。

マザーボードにオンボードのNICとPCI Expressの拡張で付けたNICの2つがあるけど、前者ではインターネットに接続できず、後者では問題なく接続できた。前者はASUS P7H55-Mマザーボードに搭載されているNICで、チップセットはRealtek RTL8111/8168B(rev 06)。後者はcorega CG-LAPCIEGTRのNICで、チップセットはRealtek RTL8111/8168B(rev 01)。

CentOS wikiのHardware Compatibility Listには、CentOS 5.2までの情報しかないけど、問題のあるNICの一つにRealtek RTL8111/8168Bが挙げられている。

ただ、この場合、

Starting with Centos 5.2, the stock kernel offers support for this chipset via the r8169 driver. However the driver currently works only for revision 01 of the network cards - and even those can still have problems (see below under Problem); the newer cards using revision 02 are identified by the stock kernel driver and can be configured, but they do not work. For problematic cases one of the methods described in Solutions below must be used.


最初の注意書きにあるように、revision 01のNICは完全ではないもののCentOS 5.2はサポートしている。記述したような、CentOS 5.4上でRealtek RTL8111/8168B(rev 01)がうまく動作したというのは、この注意書きに整合的。backward supportができているっぽい。

今後のために、今手元にあるオンボードのNICと拡張NICについての情報を張りつけておこう("lspci -v"の出力の一部)。

02:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 06)
Subsystem: ASUSTeK Computer Inc. Unknown device 8432
Flags: bus master, fast devsel, latency 0, IRQ 74
I/O ports at c800 [size=256]
Memory at f2fff000 (64-bit, prefetchable) [size=4K]
Memory at f2ff8000 (64-bit, prefetchable) [size=16K]
Capabilities: [40] Power Management version 3
Capabilities: [50] Message Signalled Interrupts: 64bit+ Queue=0/0 Enable+
Capabilities: [70] Express Endpoint IRQ 1
Capabilities: [b0] MSI-X: Enable- Mask- TabSize=4
Capabilities: [d0] Vital Product Data

03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 01)
Subsystem: Allied Telesyn International Unknown device c127
Flags: bus master, fast devsel, latency 0, IRQ 66
I/O ports at d800 [size=256]
Memory at f7eff000 (64-bit, non-prefetchable) [size=4K]
Expansion ROM at f7ec0000 [disabled] [size=128K]
Capabilities: [40] Power Management version 2
Capabilities: [48] Vital Product Data
Capabilities: [50] Message Signalled Interrupts: 64bit+ Queue=0/1 Enable+
Capabilities: [60] Express Endpoint IRQ 0
Capabilities: [84] Vendor Specific Information



【追記】
接続がうまく行かないのはインターネットだけではなかった。プライベートネットワークに関しても、OSがNICチップセットのドライバーをサポートしていなければ接続できない。

【Linux】 eth0とeth1を入れ替える方法

複数のNICを搭載している場合、状況によってはNICが認識される順番を変えたいときがある。例えば、手元にOSがサポートしているNICチップセットを搭載しているNIC(「NIC-s」と表記)とそうでないNIC(「NIS-ns」)の2つがあるとする。仮に、eth1はインターネットへの接続用、eth0はプライベート・ネットワークへの接続用だとしよう。もしNIC-nsがeth1として認識されている場合、ネットに接続することはできない。

このようなときに対処するには、"/etc/sysconfig/network-scripts"にある"ifcfg-eth0"、"ifcfg-eth1"のMACアドレスを入れ替えて再起動すればOK。

Friday, July 23, 2010

[Rocks] MPI通信を行うまで

以下でMPICH2を使った並列計算を行うまでの設定を簡単に箇条書きで整理する。

Last Update: July 23, 2010.

  • Rocks 5.3をマニュアルに従ってインストールする。
    • Frontendノードについてはこちら
      • Frontendノードとインターネットの間にルータを挟んでいる場合、プライベートIPアドレスを設定するとき、他のPCのIPアドレスと競合しない値を入力することに注意。
    • Computeノードについてはこちら
      • Frontendノードにroot権限でログインし、

        # insert-ethers

        と入力、"Choose Appliance Type"から("managed ethernet switch"でない場合)"Compute"と進んで"Inserted Appliances"の画面に進む。
      • このとき、computeノードのPCの電源を入れても認識されず、フリーズした感じで、さらに、computeノードの方では勝手にPXEブートが進むということが生じることがある。この場合、computeノード側で"Ctl+Alt+Del"で再起動をする。そのうち、Frontendの"Inserted Appliances"にMACアドレスなどが表示されるはず。決して、Frontendノードの端末の右上のxをクリックして強制終了してはいけない。後で"# insert-ethers"と入力してもエラーが出る。どう対処するかはよくわからない。
      • computeノードのインストールが終了したら、computeノードのbootの順番を、CD->Hardware->Networkにしておく。
  • mpiexecコマンドを実行するためにアカウントを作成する。
    • ルートでログインし、次のように端末でコマンド入力。
    • # useradd username # passwd username # rocks sync users
      ※ここで、usernameは追加するアカウント名、usernameはそのアカウントでログインするときに必要なパスワード。
    • Computeノードをうまくインストールできていない場合、"ssh compute-0-0"等でアクセスするときにログインパスワードの入力を求められる。さらに、compute-0-0の"/home"にはusernameのディレクトリが存在しない。その場合、こちらを参考に。
  • ステップ2.で作成したアカウントでログインし、mpdのパスを通す。
    • デフォルトではmpdへのパスが設定されていない。ログイン時に毎回設定するのは面倒なので、次の行を".bash_profile"内の"export PATH"よりも前に書き加えておく。
    • PATH=/opt/mpich2/gnu/bin:$PATH
      ※mpcih2が入っているのは"/opt/mpich2"フォルダ。
  • ステップ2.で作成したアカウントのホームディレクトリに".mpd.conf"の名前でファイルを作成し、アカウント所有者だけが読み書きできるようにする。
  • $ cd $HOME $ touch .mpd.conf $ chmod 600 .mpd.conf
    さらに、エディタを使って次の行を書き加える。
    secretword=xxxxxxxxxxx
    ※"xxxxxxxxxxx”は自由に。ただし、ログインのパスワードと同じにならないように。
  • ホームディレクトリにmpdのリングを構成するホスト名をリストアップした"mpd.hosts"を作成。
    • 1行に1ホスト名。例えば、次のように感じ
    • hostname.of.frontend compute-0-0
    • ファイル名はなんでもOK。
  • 各ノードでmpdデーモンを立ち上げる。
  • $ mpdboot -n #daemons -f mpd.hosts
    #daemonsは立ち上げるデーモンの数で、ノードの数より大きくない正の整数。
  • 実行ファイル(execute.out)があるフォルダに各ノードにプロセスを振り分けるためのファイル"mf"を作成し、以下のようにホストを書き加える。
  • hostname.of.frontend:nproc1 compute-0-0:nproc2
    • ここでnproc1はFrontendノードに連続して与えるプロセスの数を表す。同様に、nproc2はComputeノードcompute-0-0に連続して与えるプロセスの数を表す。
    • コロン(:)の前後にスペースはいらない。
    • 詳しくはMPICH2 User's Guid (pp.9-10)を参照。
    • ファイル名は何でもOK。"mf"はmachine fileの頭文字。
  • "mpiexec"を使ってexecute.outを実行する。
  • $ mpiexec -machinefile mf -n #procs ./execute.out
    • ここで、#procsは実行ファイルを走らせるプロセス数。MPIではランクが0から#procs-1まで振り分けられる。
    • #procsはノードの数より小さい必要はない。大きくても、ラウンドロビンで実行。ただし、その場合、メモリの競合問題が大きくなるなどして計算速度が大きく低下する。

Note 1: compute nodeの電源をオフにする方法
root権限でfront endにログインし、
# ssh compute-x-y
(省略)
# poweroff
とすればOK。
※root権限を持たないアカウントからsshを使ってシャットダウンすることはできない。
$ shutdown -h now
としても、コマンドが見つからないというエラーメッセージが表示される。

Note 2: コンパイラにifortを使う方法
 MPICH2のデフォルト・コンパイラはgfortranであるが、mpdbootで立ち上げることのできるデーモンの数が限られてしまう。一方、ifortではそのような弊害は生じない。また、マシン環境がインテルである場合、ifortを使う方が望ましいと考えられる。

 ただし、Rocks Clusterにはifortがデフォルトで入っていないため、自分でインストールする必要がある。
  • インストール方法についてはこちらを参照。
  • ただし、インストールするフォルダは /share/apps 以下にする(理由はこちら)。
  • ifortを使ったコンパイルのしかたはこちらを参照。
Note 3: デーモンを停止させる方法
端末で以下の操作を行なう:
$ mpdallexit

Thursday, July 22, 2010

【自作PC】グラフィックカードを追加

CentOSをインストールできない原因はマザーボードにオンボードされているグラフィック機能のドライバがサポートされていないということだった。

その対処として、CentOSによりサポートされているVGAドライバを搭載したグラフィックカードを新しく取り付けた。製品は、ASUSのEN8400GS。対応ポートはPCI Express 2.0 x 16。CentOSがサポートしているNVIDIAのVGAドライバはnv。パーツを購入した秋葉原お店の店員さんが、「CentOSを使うならGeForceは9100番台以降は使わない方がいい」と言っていたが、それは新しい製品だと対応ドライバが3Dアクセラレータ対応のnouveauとなり、nvではもはや正常に動作しなくなってしまうからだろうか。CentOS、したがってRocks Clustersを利用する場合、とにかく新しいパーツをそろえれば良いってものでもないことがはっきりした。

製品パッケージ

マザーボードへ取り付けた状態。PCI Express 2.0 x 16スロット。

ケースの背面。拡張部分は上からASUS EN8400GSグラフィックカード、corega CG-LAPCIEGTR。

Wednesday, July 21, 2010

【CentOS】CentOS 5.4をインストールできない

要約
 先週自作したPCへのRocks Clusters 5.3のインストールがうまくいかないが、それはCentOSとハードとの相性に問題に起因していることがわかった。
 そこで、なぜCentOSをインストールできないか原因を究明する必要がある。

1. 背景
 Rocks Clusters ver.5.3 (Rolled Tacos)のx86_64のjumbo(DVD)のisoイメージをダウンロードし、DVDにDVD Decrypterを使って焼き、CD/DVD-ROMブートでPCを起動。Users Guideの通り、グローバルIPアドレスを入力する画面が出てきて、入力するまではいい。問題は、次の写真のように画面が進んで、

その後下側に

Running anaconda, Rocks (だったと思う) system installer - please wait...
Probing for video card: Intel Corporation Clarkdale Integrated Graphics Controller


と出た後、突然画面が真っ暗になってしまうところ。CPUファンや電源ON/OFFのLEDランプはついてる。しかし、DVDドライブは画面が真っ暗になってまもなく動きを停止。ejectボタンを押しても拒否・無反応。

2. 原因の特定
 原因はOSとマザーボードその他ハードとの相性にありそう。というのも、Ubuntu 10.04 (Alternate版)のインストールは問題なくできたから(DVD-ROMを利用)。さらに、Rocks ClustersがベースとしているCentOSのインストールでは同じ症状が見られた!(ヴァージョンは5.4。ミラーサイトのうち"Direct DVD Downloads"が"YES"になっている日本の"JAIST"からダウンロードすることにし、"HTTP"->"5.4/"->"isos/"->"x86_64/"と進みCentOS-5.4-x86_64-bin-DVD.isoをクリック。なお、インストールが開始する前のmedia testはクリアしている。)画面が真っ暗になる直前のメッセージはRocks Clustersをインストールしたときとほぼ同じで、

このときは最後に

Attempting to start native X server
Waiting for X server to start...log located in /tmp/ramfs/X.log

と表示されていた。X windows systemを立ち上げることに問題があるということか。

2.1 Intel社製のグラフィックに問題あり?
 CentOS 5.4のwikiの4. Known Issuesに次のことが書いてあった:

Many users have experienced a blank or black screen after an upgrade to 5.4, particularly with Intel video. A workaround found on the CentOS forum is to install in text mode and afterward edit /etc/X11/xorg.conf and add the line 'Option "DDC" "false"':

Section "Device"
Identifier "Videocard0"
Driver "intel"
Option "DDC" "false"
EndSection


 実際、CentOS 5.4をテキスト・モードでインストールしてみたら問題なかった!
 ただ、この方法だと一度テキスト・モードでOSをインストール必要があるので、そのようなインストールモードのないRocks Clustersには残念ながら適用できない(少なくともマニュアルにはテキストモードについて言及されていない)。
 ということで、対処の方法としては2通り考えられる:

  • どうようの問題が発生しない古いバージョンのRocks Clustersをインストールする。
    • その際、CentOSのwikiにあるReleaseNotesが参考になる。Known Issues等を参考にすればOK。
  • グラフィックボードにドライバーがX serverやkernelにサポートされているものを選ぶ。
    • Rocksのarchivesにそのような例が報告されている。やはりRocksの場合はテキストモードによるインストールができないことが余計な制約になっている。

 ちなみにち、マザーボードとオンボードの"VGA compatible controller"については以下の通り:
  • マザーボード:ASUS P7H55-M

  • VGAコントローラ:Intel Corporation Ibex Peak HECI Controller (rev 06)


【追記:7/22】
最終的には、GeForce8400GS搭載のグラフィックカードASUS EN8400GNを取り付けることで問題は解決した。

Monday, July 19, 2010

【Rocks】Intel Compilerをどうインストールするか

Rocks Clustersの最新バージョンは5.3。それにはIntel compilerをインストールするRollがない。ということで、自分でインストールしなければならない。方法はどうやら2つあるようだ。

  • スタンフォード大学のRolls Working GroupのRollを利用する。
    • ただしこの場合、必要なRollをインストールする必要がある。Rocks ClustersのRollとの関係が気になるところ。

  • frontendの"share/apps"にコンパイラをLinux PCにインストールする手順でインストールする。
    • computeノードについては、"share/apps"にあるものは自動的に実装されるらしい。
    • 「実装」というより、Network File System (NFS)により、あたかも各computeノードが自身のHDDに実装しているかのように見せかける。つまりは、各computeノードからfrontendノードにEthernetでアクセスすることになる。
    • ということは、あまり頻繁に利用すると計算処理速度に影響が出てくることになる。幸い、コンパイルだけならほとんど問題にならない。
    • というか、そもそも自分の場合、コンパイルはfrontendノードだけで行えればOK。

【自作PC】パーツ選びの際の注意点

目的に合わせて適切にパーツを選択することが大切。目的に適わないパーツを選ぶことは是非とも避けたい。以下に簡単な覚書を書いておく。ちなみに、ここでの目的は科学技術用計算である。Rocks Clustersを使ったPCクラスタの構築を念頭に置き、frontendを除くノードにはPXEブートによりOSをインストールする。
  • マザーボード
    • CPUソケットとチップセットがCPUに対応しているか。
    • BIOSがPXEブートに対応しているか。
    • オンボードのLANはGigabit Ethernet接続に対応しているか。
    • ECC-Registedメモリに対応しているか。

  • メモリ
    • ECC-Registedか。
    • SPD (Serial Presence Detect)に対応しているか。
    • bit構成が64bitか。

  • 電源
    • W数は十分か。
    • 105℃コンデンサを利用しているか。
    • ケースのサイズ(ATXとか)に対応しているか。
    • モジュラーケーブルか。
    • 80PLUS認証か。

  • グラフィックス
    • ドライバ(?)にX windows serverが対応しているか。
      • Rocks ClustersやそれがベースとしているCentOSのいくつかのバージョン(少なくともRocks 5.3, CentOS 5.4)ではドライバが対応していないためにグラフィックモードによるインストールができない。
      • CentOS wikiのHow To Configure a New Video CardはX11(on CentOS)がサポートしているVGAドライバをリストアップしていて参考になる。

  • NIC
    • パブリックネットワーク用とプライベートネットワーク用の両方のNICに当てはまる。
    • 初期設定のままでCentOS上で動作するか。
    • Hardware Compatibility Listの4.7. Network Cardsに記載されているチップセットを選ばないように。CentOSがサポートしていない可能性がある。



なお、Rocks ClustersはCentOSをベースにしているので、CentOS wikiのHardware Compatibility Listが参考になる。

Sunday, July 18, 2010

【Ubuntu】PCを空っぽにする

手元にあるDell Inspiron mini 10vからUbuntuを削除して、空っぽのPCにしたい。

外付けCDドライブを持っている自分としては、そのためにはLive CDを使って起動し(Live CDの作成についてはこちらを参照)、その上でHDDを開放するとうい手順を踏めばよい。

とりあえず、ver.9.10をCDに焼いて、起動を試みる。

CDを入れたままPCを起動。直ぐにF2を押して、BIOSのbootの順番をCD/DVDを一番にする。そして、セーブして終了。するとLive CD起動モードの選択画面が出てくるので、そこで「コンピュータに変更を加えずにUbuntuを使ってみる」を選択する。

すると、次のようなエラーが出た。

stdin: error 0
stdin: error 0
stdin: error 0
stdin: error 0
stdin: error 0
/init: line 1: can't open /dev/sdb: No medium found
/init: line 1: can't open /dev/sdb: No medium found
/init: line 1: can't open /dev/sr0: No medium found
/init: line 1: can't open /dev/sr0: No medium found
stdin: error 0
/init: line 1: can't open /dev/sdb: No medium found
/init: line 1: can't open /dev/sdb: No medium found
/init: line 1: can't open /dev/sr0: No medium found
/init: line 1: can't open /dev/sr0: No medium found
stdin: error 0
/init: line 1: can't open /dev/sdb: No medium found
/init: line 1: can't open /dev/sdb: No medium found
/init: line 1: can't open /dev/sr0: No medium found
/init: line 1: can't open /dev/sr0: No medium found
stdin: error 0
/init: line 1: can't open /dev/sdb: No medium found
/init: line 1: can't open /dev/sdb: No medium found
/init: line 1: can't open /dev/sr0: No medium found
/init: line 1: can't open /dev/sr0: No medium found
stdin: error 0
/init: line 1: can't open /dev/sdb: No medium found
/init: line 1: can't open /dev/sdb: No medium found


BusyBox v1.13.3 (Ubuntu 1:1.13.3-1ubuntu7) built-in shell (ash)
Enter 'help' for a list of built-in commands.

(initramfs) mount: mounting /dev/loop0 on //filesystem.squashfs failed: Input/output error
Can not mount /dev/loop0 (/cdrom/casper/filesystem.squashfs) on //filesystem.squashfs



どうすりゃいいの?これによると、ビデオカードのエラー?

ちなみに、環境は

PC: Dell Inspiron Mini 10v
iso: ローカライズ版 Ubuntu9.10


Alternate版にすれば問題なく起動できましたとさ。
ちなみに、バージョンは10.04。

ということで、以下の手順でHDDを開放(用語の使い方あってるのか?)

  • Live CDで起動。
    • 起動に時間がかかるが、GUIで動かせる。

  • "Terminal"を起動。

  • "GParted"というパーティションを行うためのアプリ?が入っているので、それを起動:

    $ sudo gparted


  • 全てのパーティションを"Delete"して、結果を適用する。

  • Live CDを外して再起動。起動しないことを確認する。次のようなエラーメッセージが出たがこれでOKか?

    GRUB Loading stage1.5.


    GRUB loading, please wait...
    Error22

    ※「GRUB(GRand Unified Bootloader)はGNUの開発した高機能なブートローダである。」@wiki

Friday, July 16, 2010

【Linux】PCIバスに接続されているデバイスを一覧表示

PCIバスに接続されているデバイスを調べるには、

$ lspci

と入力すればよい。

自分の場合、Dell Inspiron mini 10vのNICがPXEブートに対応しているかどうかを調べるために使用した。

Thursday, July 15, 2010

【ネットワーク】IPアドレス


  • IPアドレスとは、パケットを送受信する機器を判別するための、ドット付き10進数記法で表された番号のこと。

    • 4byte長すなわち32bit長のアドレスを使うIPv4と16byte長すなわち128bit長のアドレスを使うIPv6の2つのバージョンがある。

    • インターネットなど外部との通信に使われるものをグローバルIPアドレス(もしくはパブリックIPアドレス)、ローカルエリアで使われるものをプライベートIPアドレスと呼ぶ。

  • ネットマスクとは、IPアドレスの先頭から何bit目までがネットワークアドレスかを指定する、ドット付き10進数記法で示されるアドレス。

    • ネットワークアドレスとは、IPアドレスのうちネットワーク内で固定された部分のことをいう。それ以外の部分をホスト・アドレスと呼ぶ。

    • 例えば、"255.255.255.0"で、これはクラスCと呼ばれるネットマスク。

  • PCクラスタを組む場合、インターネットへはfrontend node(ホスト)を経由してアクセスする。さらに、このfrontend nodeはルーターを経由してネットへアクセスすることになる。この場合のルーターをGatewayと呼び、これにもIPアドレスが割り当てられる。

【Rocks】既存ノートPCと自作PCでPCクラスタを組みたい

今、手元には
がある。

この2つを使って、PCクラスタを組むことはできないだろうか?

というのも、本格的にPCクラスタを組む前に、PCの自作とRocks Clustersディストリビューションを使ったPCクラスタ構築の実験をしておきたいからね。

ノートPCのEthernetポートが1つしかないことを考えると、これをcompute nodeにし、自作PCをfrontend nodeにすべきだ。さらに、Core i7 950が64bit、Atom N270が32bitであるheterogeneousなクラスタを組む、Cross Kickstartingとなる。

できなくはなさそうだ。

とにかく予算は掛けたくない。こんな実験にIntel Core i7を使ってしまうのはもったいないのは間違いないけど、ECC対応してなくて科学技術計算用としては使えない代物だし、それにただでもらったものだから構わない。

とりあえず調べないといけないことをリストアップしておこう。

  • そもそも上記のheterogeneousなクラスタがRocks Clustersで組めるのか?

  • ノートPCからUbuntu 9.10をアンインストールするには?

  • 自作PCの構成をどうするか?

Wednesday, July 14, 2010

【Ubuntu】シェル、root権限

Ubuntuのデフォルトのシェルはbash。

Ubuntuの場合、OSインストール時にはrootのパスワードを設定しない。そのため、root権限でログインするためには、以下のコマンドを入力する必要がある。

$ sudo su -
# passwd

ここで、パスワード(passwd)はログイン中のアカウントのパスワードを入力する。

【Ubuntu】ver9.10へのアップグレード

Ubuntuを9.10へアップグレードしたら、インテルコンパイラが使えなくなった。

$ ifort filename.f90

と入力すると、次のようなエラーメッセージが表示される:

/opt/intel/Compiler/11.1/069/bin/ia32/fortcom: error while loading shared libraries: libstdc++.so.5: cannot open shared object file: No such file or directory
ifort: error #10273: /opt/intel/Compiler/11.1/069/bin/ia32/fortcom の致命的なエラー、0x7f で終了しました。


ここを参考に、以下の作業を行って問題が解決した。


$ wget http://mirrors.kernel.org/ubuntu/pool/universe/g/gcc-3.3/libstdc++5_3.3.6-17ubuntu1_i386.deb
$ sudo dpkg -i libstdc++5_3.3.6-17ubuntu1_i386.deb

【MPI】MPICH2をUbuntuノートPCにインストール

UbuntuノートPCのCPUがIntel AtomでデュアルコアでMPIが使える。ということで、MPICH2をインストールする。

Step1. まずはmpich2-1.2.1p1.tar.gzをtmpフォルダにダウンロードし、解凍する。

$ cd /tmp
$ wget http://www.mcs.anl.gov/research/projects/mpich2/downloads/tarballs/1.2.1p1/mpich2-1.2.1p1.tar.gz
$ tar xfz mpich2-1.2.1p1.tar.gz

ここでは、/etc/apt/sources.listを修正することでUbuntuのサイトからパッケージをaptitude等で自動インストールすることができるとあるが、その場合、自分の好きなフォルダにインストールできないので直接インストールすることとした。

Step2. 次に、mpich2をインストールするフォルダを作成する。今回は、"/opt/mpich2/"にインストールする。

$ mkdir /opt/mpich2



Step3. mpich2の設定を行う。FortranコードはIntel Fortran Compiler ("ifort")を使いたいので、.bashrcを開いて、

$ cd $HOME
$ emacs .bashrc

以下を入力する。ついでに、PATHを通しておく。(※既にIntel Fortran Compilerをインストールしていることを前提。インストールについては、こちらを参照)

export FC=/opt/intel/Compiler/11.1/069/bin/ia32/ifort
export F77=/opt/intel/Compiler/11.1/069/bin/ia32/ifort
export F90=/opt/intel/Compiler/11.1/069/bin/ia32/ifort

export PATH*/opt/mpich2/bin:$PATH

※どのようなコンパイラが使われるかの確認は、インストールが完全に終わった後に、

$ mpich2version

で確認できる。

Step4. mpich2-1.2.1p1.tar.gzの解凍先のフォルダに移動し、次の設定を行い、makeし、root権限でmake installする。

$ cd /tmp/mpich2-1.2.1p1
$ ./configure --prefix=/opt/mpich2 --enable-f77 --enable-f90 --enable-debuginfo
$ make
$ sudo su -
# passwd
# make install



Step5. ホームディレクトリに".mpd.conf"を作成し、

$ cd $HOME
$ touch .mpd.conf
$ chmod 600 .mpd.conf

以下の一行を書き加える。

secretword=xxxxxx

ここで"xxxxxx"は自分の好きなワード。

Note1. Fortranソースコードのコンパイルの仕方は

$ mpif90 filename.f90

で"a.out"が作成される。

Note2. "a.out"の実行は、例えば

$ mpiexec -n 2 ./a.out

でできる。"-n 2"はプロセス数を指定。実行ファイルの前の"./"はマニュアルに書いてないが必要。

Note3. "include 'mpif.h'"をメインファイル"main.f90"ではなく、モジュールファイル"module.f90"に含みたいとき、コンパイル&リンクが必要。コンパイル・リンクを同時に行い、nprocsのプロセス数で実行するには次のように入力する。

$ mpif90 -o filename.out module.f90 main.f90
$ mpiexec -n nprocs filename.out

Sunday, June 6, 2010

Several Styles of Research

There are several styles of research. The following lists them:

  1. Build intuition. This is a theoretical research, which uses a very simple model. The purpose is to get some intuitive ideas. When conducting this type of research, we must be careful to avoid only playing mathematics.

  2. Quantify theoretical implications. This is a theoretical and empirical study, which uses a little bit elaborated model to quantify existing hypothesises. The reason why an elaborated model is used is that we need a set of realistic parameter values. The model is elaborated, but the estimation procedure for parameters is less elaborated. This is because the focus is not on obtaining much accurate numbers but on drawing intuitions from results.

  3. Change the previous assumptions. This is a theoretical research, which changes the assumptions made in the previous literature to check the robustness of the previous results.

  4. Overcome the previous limits using new estimation techniques. This is an empirical study, which could be conducted after the emergence of new estimation techniques.

  5. Sophisticate the estimation procedure. This is an empirical study, which uses a more sophisticated method to obtain numbers than past. This should be distinguished from the research-2. above.

  6. Apply the previous method to new data set. This is an empirical study, which uses new data set available to investigate the robustness of the previous studies.

At this moment, I prefer the 2nd approach. It is both theoretical and empirical. To be more precise, I like the 2nd one, the focus of which is mainly on theoretical topics but which also has a little bit of emprical flavor. I don't want to commit my life to any particular institution to obtain very detailed micro data usually unofficial and unavailable from outside.

Sunday, April 25, 2010

【Ubuntu】AucTexをインストール

UbuntuノートPCでTeXを使いたいので、ここを参考にしてAucTexというのをインストールする。


$ sudo apt-get install auctex



次の環境設定をしておく。

"~/.emacs"(".emacs.el"がある場合はそちらに)の最後に以下を書き加える:

;===================================
; AUCTeX
;===================================
(autoload 'japanese-latex-mode "tex-site" "tex-site" t)
(require 'tex-site)
(add-to-list 'auto-mode-alist '("\\.tex\\'" . japanese-latex-mode))
(setq TeX-default-mode ' japanese-latex-mode)
(add-hock 'TeX-mode-hook (function (lambda () (outline-minor-mode t))))


【音楽】ハーモニカ特訓その1

自分が練習しないといけないハーモニカの曲のキーはA。ということで、

音階は A(ラ)、B(シ)、C#(ド#)、D(レ)、E(ミ)、F#(ファ#)、G#(ソ#)、A(ラ)

となる。

このとき、キーがAのハーモニカの音の配列は、
12345678910
吹くA(ラ)C#(ド#)E(ミ)A(ラ)C#(ド#)E(ミ)A(ラ)C#(ド#)E(ミ)A(ラ)
吸うB(シ)E(ミ)G#(ソ#)B(シ)D(レ)F#(ファ#)G#(ソ#)B(シ)D(レ)F#(ファ#)
第1オクターブ第2オクターブ第3オクターブ

となる。

楽譜上での位置関係は

Saturday, April 24, 2010

【CSS】枠を作る


<div style="border:1px dashed gray; background-color:#FFE3E3">

</div>



これまでに何度かソースコードを枠で囲って記事を書いたことがある。その場合、機能によって文字を色分けしていた(例えば、''call''ってサブルーチンの場合は青色にするとか)。これは、ソースコードをSciTEで開いて、html出力して、ソースコードを貼り付けただけ。

【MPI】CとFortranとのインターフェイスの違い

 C言語とFortranではインターフェイスに違いが見られる。

サブルーチン
○C言語の場合

ierr = MPI_Xxxx(...);

○Fortranの場合

call mpi_xxxx(....,ierr)

システム用の配列
○C言語の場合

MPI_Status istatus;

○Fortranの場合

integer istatus(mpi_status_size)

データ型の指定
○C言語の場合
文字:MPI_CHAR
整数:MPI_INT
実数:MPI_FLOAT
倍精度実数:MPI_DOUBLE


○Fortranの場合
文字:MPI_CHARACTER
整数:MPI_INTEGER
実数:MPI_REAL
倍精度実数:MPI_DOUBLE_PRECISION
複素数:MPI_COMPLEX

Friday, April 23, 2010

ユークリッド空間をcountableな形に分解

 ユークリッド空間R^nがあるとする。このとき、

R^nはseparableである。

ちなみに、metric space Xがseparableであるとは、Xがcountable dense subset Bを含むということ。さらに、Xの部分集合Bがdenseであるとは、topological closure(Bを含む全ての閉集合のintersection)がXに等しくなること。

□DEFINITION (Berge1997 p.93)
A fundamental family for a topological space X is a family of open sets A={A_i:i∈I} such that, given any non-empty set G there exists a subset J of I for which

  G = ∪_{i∈J}A_i.

□THEOREM (Berge1997 p.93)
A metric space is separable if and only if it possesses a countable fundamental famility.

以上のことから、次のようなことが言える:

X⊆R^nとする。さらに、h:R^2→Rという関数があると、

 {y:sup_{x∈X}h(x,y) > b} = ∪_{i∈J}{y:sup_{x∈X_i}h(x,y) > b}.

ここで、Jはcountable set.

つまり、coutableな形に分解できるというメリットがある。テクニカルなところでこういう性質を使う場合があるかもしれない。

Thursday, April 22, 2010

ベイズ統計学のメモ2

 標本数が無限大のとき、すなわち大標本のとき、最尤法とベイズの事後分布の関係について。

 最尤法は、サンプルを所与として、likelihoodが最大になるようなパラメータを求める。そのとき、推定量の分布(母数=真のパラメータは定数であって、推定量が確率変数なだけ)は正規分布で近似できる。

 一方で、ベイズの事後分布はというと、まだ理解してない。ただ、最尤法との関係性についていうと、最尤法はlikehoodの頂点だけに着目しているのに対して、ベイズは全体を扱っている。つまり、最尤法は頂点(と頂点=推定量の分布)を見ているのに対して、ベイズは分布(の変化)を見ている。

 また、古典論では推定量の分布を扱っている。大標本になれば、一致性から真のパラメータに収束する。

 一方、ベイズ統計では、大標本になると母数の分布がある分布に収束する(はず)。この場合、パラメータは確率変数であって、ベイズは大標本だとその分布が収束すると言っているに過ぎない。つまり、ある特定の定数に収束するとは言ってない。

 ここに、両者の本質的な違いがある。

 ここから一つステップを踏んで、「では、ベイズ統計で得られたパラメータの事後分布の平均が、最尤法における推定量に一致するか?」というquestionを立ててみる。

 おそらく、一般的にはNOだろう。事後分布が正規分布となっていれば、頂点は平均に等しいのだから一致する。でも、そうじゃない場合、必ずしも頂点と平均が一致するとは限らない。

 だとしたら、より一般的なベイズの方が妥当じゃないかって思ってしまうのだが、まだ確信を持てないのでひとまず保留にしておこう。

 てか、混乱していて、全く理解できてないな(笑)

 一つの評価方法として考えられるのは、まず、仮定として「真のパラメータ(定数)が存在する」を設ける。そのとき、最尤法を使えば、必ず(適当な仮定の下で)真のパラメータに収束する。このとき、「じゃあベイズさんはどうなりますか?事後分布の期待値が真のパラメータにちゃんと収束しますか?」という問を立てればOK。

 これは古典論をまず基準として評価する方法。でも、そもそも、古典論の「母数は定数」であるって仮定がおかしい!という哲学的な立場があるとすれば、この評価方法はあまりのもバイアスがかかっている。じゃあ、これとは逆方向から評価する方法を考えるとすればどうなるか。それは、一般にはない。そもそも確率変数と定数を比較することができない。では、「古典論の推定量がベイズの事後分布の期待値に一致するか?」という問を立てるのはどうか。でもこの場合、だから何なの?ってなる。

 ようは、まずは母数が定数であるか確率変数であるか、という立場を明確にする必要がある。仮に、定数であるとする。この場合、ベイズの事後分布は分析者の予想を表しているに過ぎない。


【追記】
仮に母数が定数であるというのが真だとする。この場合、明らかに古典論は頑健。一致性などを示せているならば。

Sunday, April 18, 2010

Intel Fortran Compiler for Linuxを利用する

●利用するときは、

<コンパイラがインストールされているフォルダ> ./bin/ifortvars.sh ia32

と端末で入力。''ia32''の部分はアーキテクチャによって変更する。ただし、これによると、ログアウトするまで有効になるだけで、ログイン時は毎回この設定を行う必要がある。それが面倒な場合は、ホームディレクトリにある''.bashrc''ファイルの一番最後の行に

. /opt/intel/Compiler/11.1/069/bin/ifortvars.sh ia32

を書き加えればOK。


●ソース・コードのコンパイル方法は

$ ifort filename.f90

となる。いろいろとオプションをつけることができるが、それは勉強しよう。

 上のようにコンパイルすると、''a.out''という実行ファイルが作成される。これを実行するには端末で

$ ./a.out

と入力すればよい。

Saturday, April 17, 2010

Dell Inspiron mini 10v: Ubuntuを8.04から9.04にアップグレード


 Dell Inspiron mini 10vが届いた。注文してから約1週間。

 Intel Fortran Compiler 11.1をインストールしようとしたら、Ubuntu 8.04では対応してないとエラーが出た。サポートしているのはUbuntu 9.04。ということで、Ubuntu 9.04をインストール必要が出てきた。

 そこで、ここを参考にしてUSBブートのインストールをしようと思う。

●Intel Fortran Compilerをダウンロード。これを参考にしてインストールを進めていたが、次のようなエラーメッセージが表示される:

ステップ: 4 / 7 | インストール設定 - 重要な必要条件の不足
--------------------------------------------------------------------------------
1 つまたは複数の重大な未解決問題が原因でインストールを続行できません。
インストールを終了せずに、問題を解決して再度チェックすることができます。
インストールを終了して問題を解決し、再度インストールを実行することもできます。
--------------------------------------------------------------------------------
重要な必要条件の不足
-- 不明なシステムコマンド
--------------------------------------------------------------------------------
1. 問題の詳細情報を表示する [デフォルト]
2. 必要条件を再度チェックする

h. ヘルプ
b. 前のメニューに戻る
q. 中止
--------------------------------------------------------------------------------
オプションを選択するか、Enter を押してデフォルトを選択してください。 [1]:


●そこで、こんなのを発見。

$ sudo apt-get install libstdc++5 g++ binutils sun-java6-jre

で''libstdc++5'',''g++'',''binutils'',''sun-java6-jre''というパッケージをインストールしたら、上記の問題は解決。

非線形方程式の解法:特殊なケース

 今、次のような2変数の非線形方程式を数値計算で解くことを考えているとする:

 f_1(x_1, x_2) = 0
 f_2(x_1, x_2) = 0.

さらに、変数がとりうる値の範囲が次のようになっているとする:

 l_1 ≦ x_1 ≦ u_1
 l_2 ≦ x_2 ≦ u_2.

 内点解が保証され、かつf_1とf_2が連続微分可能であれば、Newton-Raphson法を修正して問題を解くことができるはず。

 では、もし、微分可能性が満たされない場合はどうだろうか。この場合はSecant methodを使うことが考えられる。さらに、特殊な場合として、区間[l_2,u_2]が非常に小さいとする。
 このとき、2変数のシステムにsecant methodを適用するのではなく、x_1についてだけSecant methodを適用し、x_2については単純に加重平均でアップデートするという方法が考えられる。f_1とf_2が連続であれば、根の付近においてはそのような近似が利用できると考えられる。

非線形方程式を解く場合は次元を下げて

 ''f(x) = 0''を満たすようなn次元ユークリッド空間内の点xを求める方法について、Newton-Raphson methodやMultivariate Secant methodなどの方法がある。
 次元nが大きくなればなるほど、計算時間が掛かるだけでなく、iterationが収束しにくいということが予想される。後者について、システムの均衡条件を使えば実は次元が2になるのに、それに気が付かずに次元が4のままで計算してしまうということもあったりする。特に、次元が大きいままでは収束しなかったものが、次元を低くすれば収束したというような場合ではかなり大きな違いが出てくる。均衡の条件を使うことでより効率的に数値計算を行うことができる可能性が示唆される。

Thursday, April 15, 2010

Intel Visual FortranでLAPACKを使う方法

 Intel Visual FortranでMKLのFortran95インターフェイス仕様のLAPACKを使う方法についてメモしておく。マニュアルを見ただけではなかなかうまくいかず、結構試行錯誤した(汗)

 次の簡単な線形連立方程式をIntel MKL LAPACK95のdriver routineである"gesv"を使って解く:

[2 1][x_1] = [4]
[3 1][x_2] = [2]
⇔ Ax = B

(※行列による表現です。わざわざGoogle Mathematical Formulasを使うのは面倒なので。)

 次のコードは、この連立方程式をIntel MKL LAPACK95のdriver routineである"gesv"を使って解くためのコード。
program sample
use mkl95_lapack
use mkl95_precision
implicit none
real, dimension(2,2) :: A
real, dimension(2,1) :: B

a(1,:)=(/2.0, 1.0/)
a(2,:)=(/3.0, 1.0/)
b(:,1)=(/4.0, 2.0/)

call gesv( A, B )

print *, 'solution:'
print *, B(1,1)
print *, B(2,1)

end program sample


 なお、driver routineとはLU分解等を行うcomputational routineを組み合わせたもので、直接解を出力できる。driver routineを使わない場合、いくつかのcomputational routineを自前で接続しないといけない。


(注意点)
・プロジェクトの「ソースファイル」フォルダを右クリックし、「追加」->「既存の項目」を選択。"...\Intel\Compiler\11.1\048\mkl\include"から"lapack.f90"を選び、追加する。

・ソースコードの"implicit none"の前に、"use mkl95_lapack"と"mkl95_precision"(もしくは、"use lapack95"と"use f95_precision")を書き加える。

・「プロジェクト」タブの「プロパティ」を選択。「リンカー」->「入力」と進み、「追加の依存ファイル」に、アーキテクチャがia32の場合、"mkl_lapack95.lib"を書き加える(アーキテクチャがia64の場合、"mkl_lapack95_ilp64"と"mkl_lapack95_lp64"。ただ、こちらの場合は試していないのでこれは予想)。"mkl_lapack95.lib"にIntelがLAPACKを修正したものが格納されていて、企業秘密ということになっている。コンパイラー利用者はコンパイル時にそのブラックボックスにリンクすることでIntel MKL版のLAPACKを利用する。なお、"mkl_lapack95.lib"は"...\Intel\Compiler\11.1\048\mkl\ia32\lib"にある。

・同じく「プロジェクト」->「プロパティ」->「Fortran」->「ライブラリー」->「インテル(R)マス・カーネル・ライブラリーを使用する」の部分を、「並列」か「シーケンシャル」を選ぶ(「クラスター」はおそらくPCクラスター向け)。

連立方程式を解く

 連立方程式を数値計算で解く方法にはいくつかある。写像が(連続)微分可能か否かで分類することができる。

 ○微分可能な場合
 ・Newton-Raphson method

 ○微分可能でない場合(※もちろん、微分可能な場合にも適用できる)
 ・Bisection search
 ・Secant method

いずれも一変数である場合は利用は単純。ただ、変数が複数ある場合、Bisection searchはよくわからん。Secant methodは複数あるときでも何らかの仮定の下では比較的簡単に実践できると思われる。Newton-Raphson methodについてとにかく偏微分してしまえばいいので、特に複雑なことをするわけでもない。

ベイズ統計学のメモ

 ほとんど勉強したことないから、ベイズ統計学の考え方がよくわかってない。覚書をいくつか。

(1)ベイズ統計学では母数(パラメータ)が定数である必要はない。確率変数でもOK。

(2)事前確率密度と尤度から事後確率密度を計算する。解釈としては、パラメータの分布をアップデートする。事前・事後確率密度の両者はパラメータの分布についての分析者の主観的な予想と解釈することができる。

(3)小標本においても柔軟に統計的推論ができるという点でベイズ統計学にはメリットがある。例えば、パラメータについて、どんな値をとりそうか全くわからないし、偏見も何もないという状況にあるとしたら、十分大きな閉区間上の一様分布を事前確率密度として与えるとか。

(4)重要な論点として、標本が大きくなるにつれて、ベイズ的な推論の下で真の分布に収束するのかということがある。ちゃんと真の分布に収束するなら、ベイズ統計学は古典的統計学を一般化させたものと考えることができる。一方で、収束しないなら、思想的選択を迫られる?パラメータが定数だと考えるなら古典的な統計学を使えばよい。じゃあ、その場合のベイズ的な推論って何なの?この辺が理解できていない。

Thursday, April 8, 2010

Rをインストール

 講義に使うかもしれないので、統計解析向けのプログラミング言語のRをインストール。versionは2.10.1。windows版だからexeファイルをクリックするだけでらくちんインストール。いちおう、Matlabと同じような使い方ができるフリーソフト。インタプリタ言語で遅いのでは?と思われるが、C/C++やFortranと連携することができるらしい。詳しい方法はわからないが。

Wednesday, April 7, 2010

Fortran: 変数のデフォルト値

 Fortranでは、実数(スカラーで、配列ではないもの)のデフォルト値はわけのわからん数値になってしまうので、注意する必要がある。
 その他の実数の配列とスカラーとしての整数、整数の配列についてはデフォルト値は0になっている。

Tuesday, April 6, 2010

Ubuntu搭載ノートPC

 だいぶ前からDellがLinux OS搭載のノートPCを販売していた。現時点では、Inspiron Mini 10vというバージョンで、これにはUbuntu 8.04がインストールされているらしい。とっても安いし、UNIXの練習用としてこれを買ってみようかな。

Thursday, April 1, 2010

MPIを使った並列化の実践(その1)

 某所でMPI(Message Passing Interface)の講習を受けてきた。話を聞いていたら、自分の目的を達成するには、ほんとに基本的な構文だけ知っていればOKのような気がした。

 少なくとも今の俺には、次の問題が解ければいい:


ここで、gは非負の関数とする。さらに、Θはコンパクト。具体例としては、非線形最小二乗法。

 この場合、最上層において、つまりθについてMPIを使って仕事を振り分けることが望ましい(もちろん、g(θ)の計算時間が莫大であることを前提とする)。完全に並列化可能で、ほぼ分散処理となる。
 具体的なコードを次のように書いてみた:

module INCMPI
implicit none
include 'mpif.h'
integer istatus(mpi_status_size)
integer nprocs, myrank, ista, iend, ierror
end
-----------------------------------------------------------------
program MPI
use INCMPI
implicit none
integer, parameter :: N=900
real, dimension(N) :: Theta
real, dimension(:), allocatable :: Objv
real, parameter :: theta_l=0.5, theta_u=1.0
real c, d, obj, int_r
integer i, arg, dummy, int_i

! the space of parameter
Theta(1)=theta_l
Theta(N)=theta_u
c=(theta_u-theta_l)/(N-1)
do i=2,N-1
    Theta(i)=Theta(i-1)+c
enddo

! multi-processing through MPI
call mpi_init(ierror)
call mpi_comm_size(mpi_comm_world,nprocs,ierror)
call mpi_comm_rank(mpi_comm_world,myrank,ierror)

allocate(Objv(nprocs))
int_r=N/nprocs
int_i=floor(int_r)
if (myrank+1<nprocs) then
    ista=int_i*myrank+1
    iend=int_i*(myrank+1)
else
    ista=int_i*myrank+1
    iend=int_i*(myrank+1)+mod(N,nprocs)
endif

! minimization
obj=99999
do i=ista, iend
    call f(Theta(i),d)
    if (d<=min) then
        obj=d
        arg=i
    endif
enddo
Objv(myrank)=obj

! communication
call mpi_allgather(mpi_in_place, dummy, dummy, Objv, 1, mpi_real, mpi_comm_world, ierror)

! summarizing the result
if (obj==min(Objv)) then
    print *, 'The optimal parameter is', Theta(arg),'.'
    print *, 'The minimized value of the objective function is', obj,'.'
endif

deallocate(Objv)
call mpi_finalize(ierror)

end program MPI

-----------------------------------------------------------------
subroutine f(theta,d)
real theta, d
d = g(theta)
end subroutine f
-----------------------------------------------------------------
real, function g(theta)
real theta
g = ... ! nonnegative real number
end function g


ただし、このコードはまだデバッグしてない。まだMPIを使える環境にないため、こんなコードでよかろうに、という想像の世界でございます。

なお、''mpi_in_place''を使っているので、MPI-2に対応している必要がある。

Thursday, March 18, 2010

最適解の連続性(その1)

 今、が連続で、xについて厳密に凹なnumerical functionであるとする。なお、で、S、Θはコンパクト集合とする。
 このとき、次の問題を考える:

 

ここで、は連続で、任意のsとθに対して空ではないコンパクトになる対応とする。
 Maximum Theoremを用いれば、最適解上の連続な関数であることがわかる。

 では、次のような問題についてはどうだろうか。ここでは、最適化にあたって、measurable functionを選択するという問題を考えている:

 

ここで、は確率変数で、μはそれに対応する確率測度。Eは全集合。fはについても連続であるとする。は、s,θを所与として、各が実現したとき、制約が必ず満たされるmeasurable functionの集合を現す。については、上記の問題と同様の仮定をする。

 このとき、解が一意のmeasurable functionで、かつそれがについて連続となるにはどういう仮定が必要だろうか?今このことについて、時間があるときに考えております。

目的関数のarugmentの数と最適化処理速度向上

 今、コンパクト集合があって、が連続で、(y,z)に関して厳密に凹な関数であるとする。このとき、次の問題を空間の分割(discretization)を使って、各xについて最適化を行う解を求めたいという状況にあるとする:

 

 さらに、何らかの事情で、この問題を次のように分解して解かなければならないとする:

 

凸計画問題の分解」と同じ議論を展開すれば、カッコの中はyの厳密な凹関数であることがいえる。

 まず、yの最適化についてはBinary Searchを使えば良いことがわかる。
 では、他にできることはあるだろうか。例えば、xとfの何らかの関係性が仮定されているとしたらどうだろうか。もし、zのargumentがなくてfがxの厳密な増加関数であるなら、は厳密な増加関数であることがいえ、この単調性を使って、関数fの評価の回数を減らすことが可能。しかし、今はzというargumentがあるため、このような単調性を保証するには、さらに何らかの仮定が必要になる。一般論として、fのargumentが増えるほど単調性を導出することが難しくなる。したがって、数値計算がそれだけbrute forceなやり方に近づいてしまうことになる。

Wednesday, March 17, 2010

凸計画問題の分解

 を連続で厳密な凹関数であるとする。また、をコンパクトな凸集合とする。以下の目的のため、のxについてのsectionをと表記する。すなわち、

 

仮定より、G(x)が空集合とならない任意のxについて、G(x)はコンパクトな凸集合となる。

 このとき、



で定義されるは連続で厳密な凹関数となるだろうか。

 答えは、"YES"。連続性についてはMaximum Theoremを使えば一発。厳密に凹であることを示すには、まずi=1,2について、のときのargmaxというペアとして定義する。このとき、任意のに対して、

 
 

で定義されるペアについて、Gが凸集合なので、が成立する。このとき、

 

n次元ユークリッド空間への拡張は容易に行えるはず。