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。
    • 後で参照しやすくするため、一ヶ所でまとめて宣言する方が良いに決まってる。