2008年12月23日火曜日

やっぱりFortran

HIMに触発されて,C言語を数値計算に使えないかしばらく考えていた.

C言語の文法をおさらい.さまざまな入門書があり,それとは別にポインタの解説が売られている.代入やら繰り返し,変数のような基礎概念を解説しなければならないので,ポインタについては簡単に済ますしかないのかもしれないが,肝心なところをごまかして,2冊目を売ろうというしているのではないかとも思える.プログラミングの基礎は,スクリプト言語でしておくとよいかもしれない.やはり,K&Rのプログラミング言語C ANSI規格準拠が要領よくまとまっているように思える.Cの基本的な文法自体は難しくなくい.むしろBetter CとされるC++やJavaの方が覚えることが多い.

現在のFortranプログラミングで重要なのは,モジュールと行列.Cはこのあたりが弱い.Cは大域変数の名前空間は基本的にひとつ.ヘッダファイルにマクロ定義をしたり,函数を定義したりして,必要なときにインクルードするというスタイルになる.Fortranだと,useのように陽に指定できる.配列については,多重配列は配列の配列しかないし,添字は0からに限られ,行列式での代入のような便利な機能はない.ポインタとの関係や値渡しの引数には注意が必要.スパコンのコンパイラでは,ポインタは最適化を阻害する要因になりうる.

UNIXワークステーションによる科学技術計算ハンドブック―基礎篇C言語版のような数値計算の本は,数値計算のアルゴリズムが中心に解説されている.それはそれでよいのだが,よくできているものはライブラリを使うのが普通で,データをいかに処理するかが数値計算の中心.配列のことやモジュール化をどうするか,I/Oについてもっとページを割くべきであるように思う.

Cは簡単な函数を書くにはよさそうだ.Octaveなどで時間がかかる部分を高速化するのに役立つ.グラフィックやシステムの機能を使うプログラムにもよいだろう.しかし,HIMのような大きなものを書くにはCに慣れておかしなことをしないように注意しないといけない.通常は,文法がやさしく,数値計算,データ処理に便利な機能がそろっているFortranを使うのがよいように思う.

2008年12月21日日曜日

Xcodeでmkoctfile

XcodeのビルドシステムはGNU Makeではないが,少しカスタマイズすれば,任意のコンパイラやスクリプトを実行することが可能である.ここでは,Octaveのライブラリにリンクするスタンドアロンのバイナリを作成してみる.

まず,Xcodeを起動しプロジェクトを作成する.プロジェクトの種類が並んでいる左側からCommand Line Utilityを選ぶ.右側からStandard Toolを選ぶ.プロジェクト名はhellooとして適当な場所に保存する.プロジェクト名と同じ名前のディレクトリが自動的に作成されて,プロジェクトファイルhelloo.xcodeprojやサンプルソースがこのディレクトリに作成される.

main.cやhelloo.1は不要なので,プロジェクトのウィンドウで選択して削除する.ファイルメニューから新規ファイルを選択してhelloo.ccというファイルを作成する.テンプレートはその他から空のファイルを選ぶ.このファイルにOctaveのマニュアルにあるをコピーして保存.この例にはバグがあるのだが,ここではそのままにしておく.



プロジェクトウィンドウ左側のターゲット,さらにhellooも開く.3段階のフェーズのうち,ソースのコンパイル以外は不要なので削除する.次に,ソースのコンパイルをカスタマイズしてmkoctfileを呼ぶようにする.ターゲット>hellooを選択した状態でボタンバーの情報をクリック.Command+iでもよい.ルールタブをクリックして表示したら,左下の+ボタンをクリックしてルールを追加する.プロセスは同名のファイルとして,*.ccと入力する.使用はカスタムスクリプトとし
/opt/local/bin/mkoctfile --link-stand-alone ${INPUT_FILE_DIR}/${INPUT_FILE_NAME} -o ${TARGET_BUILD_DIR}/${INPUT_FILE_BASE}
と入力する.出力ファイルを追加し
${TARGET_BUILD_DIR}/${INPUT_FILE_BASE}
と入力する.ここで用いた環境変数は,右下のボタン?をクリックして表示されるマニュアルに説明されている.

ビルドをクリックしてビルドしてみる.二重forループの中に
a_matrix(row,column)
となっていればエラー箇所として指摘されているはずである.row, columnは定義されておらず,おそらくi, jの誤りだろう.ここを修正すればコンパイルが通るはずである.

ビルドして実行ボタンをクリックしても,コマンドラインツールなので,何も表示されない.結果はツールからコンソールを選べば表示できる.プロジェクトウィンドウのProductの下に表示されるhellooをダブルクリックするとターミナルが開いてバイナリが実行される.

mkoctfileは,シェルスクリプトで,コンパイルにはg++が呼ばれている.Xcodeでは,g++のエラーメッセージを解釈して,エディタに該当箇所を表示できるので,効率的な開発役立ちそうである.MPIやOpenGLのプログラムは,同様な方法でmpiccやglccを呼べばよさそうである.シェルスクリプトが面倒を見てくれるので,ヘッダやライブラリをプロジェクトに追加する手間が不要だ.C, C++のラッパ以外でも同様の方法で良い.ただし,g95, gfortranだと,エラーメッセージは正しく解釈されない.エラーメッセージは,ソースの上に表示される.

MacPortsの大掃除

MacPortsのパッケージは,コミッタ,パッケージ管理者そしてユーザ有志の努力により,絶えず更新が続いている.インストールされているものがパッケージよりも古くなったものの一覧は
port outdated
とすると表示される.

MacPortsのパッケージを更新するときのコマンドはport upgradeである.特定のパッケージfooを更新するには,
sudo port upgrade foo
とする.すべてを更新するには,
sudo port upgrade outdated
とする.upgradeをする前に
sudo port sync
をして,ソースツリーを更新しておく.

更新したパッケージやそれに依存するパッケージなど旧バージョンはdeactivateされ消されずに残る.更新をするたびに「ごみ」がたまっていく.既定で古いものを残すようにしているのは,新しいパッケージが動くことを確認してから古いものを消せばよいからである.
port -u uninstall
とすると「ごみ」をすべて清掃してくれる.古いものを残す必要がないときは,
port -u upgrade foo
とすると旧バージョンは消去される.更新対象のfooは,最上位に位置する「大物」だと依存するライブラリも更新され,-u付きの場合は古いものが消去されるので楽である.

2008年12月20日土曜日

ACML


Athlon X2 5400+を載せた自作PCのベンチマークを改善しようと,AMD Core Math Libraryをインストールし,Octaveをコンパイルしてみた.Linux用でgfortranでコンパイルしたものは,intが32-bitのものと,64-bitのものの2種類あった.どちらも取得してインストールした.取得には登録が必要だった.インストールは添付のシェルスクリプトで行う.OpenMPに対応したライブラリが含まれている.

PowerPC G4のMac mini以下の性能だったが,atlas-3gf-baseを使うと3.5Gflopsくらい出た.ACMLはもう少し性能がよく5Gflopsでたこともあった.CFLAGSやCXXFLAGSに-fopenmpを指定し,マルチプロセッサ用のライブラリとリンクしてみたが,Mac mini以下に逆戻りしてしまった.gccのOpenMPのできが問題なのだろうか.Athlon X2 5400+は,2コア使うとPowerPC G5やCore Duoと勝負できそうだが,クロックの近いCore 2 Duoには劣る.

OctaveをMacPortsから普通に入れてもLeopard添付のAccelerate.frameworkはスレッドを立ち上げてコアをすべて使ってくれているようである.手軽に性能を出すならMac Proが楽なのではないだろうか.

2008年12月14日日曜日

HIM

C言語で書かれた海洋モデルHIMを試してみたところ,3つの例をうまく動かすことができた.アメリカ気象学会のページで検索してみたところ,100を超える引用がある.鉛直座標に密度を用いているisopycnalモデルだけあって,とくに浮力により生ずる流れに関する研究に使われている.Park and Bryan (2001)は密度座標のモデルと高度座標とを比較して,亜寒帯ジャイアに差異が見られ,大気モデルと結合した場合に大気海洋相互作用に影響が表れることが示唆されると述べている.

Mac OS Xではnetcdfさえインストールすれば,LeopardのOpen MPIを使って並列計算をすることができる.LeopardのOpen MPIはFortranに対応していないので,Fortranでかかれたプログラムの場合は,MacPortsなどからOpen MPIをインストールする必要がある.OSのOpen MPIは32/64ビットの両方,PPC/Intelの両方,計4つのアーキテクチャに対応し,universalである.

netcdfを64ビットでインストールし,HIMをコンパイルするときのオプションに-m64をつければ64ビットの実行ファイルができる.64ビットなら,4GBを超えるメモリを必要とする場合でも動作するはずである.MacPortsを64-bitでコンパイルする方法はここに書いてある.MacPorts 1.6まではuniversalとはi386とppcを差していたが,MacPorts 1.7からはi386, x86_64, ppc, ppc64のいずれをユーザが指定するのだそうである.MPIを使うときは,CC=/usr/bin/mpiccをMakefileに書く.Mac Proで8コアをフルに使うと,シングルでは少し待った計算がすぐに終わり,並列計算の威力を体感できた.

C言語で実用になるモデルがあることに感心した.数値計算の分野,とくにスパコンではFortranが有利だと言われているが,パソコンではCの方が便利かもしれない.最近はg95やgfortranがでてきているが,可視化など数値計算以外のものとのリンクはCの方が便利である.数値計算のライブラリについても,GSLやFFTWはCで書かれている.Octaveを使えば自分でベクトルや行列及びその演算を定義しなくても演算や様々な函数が使える.

Octaveのライブラリを使ってスタンドアロンのプログラムを作る方法は,ドキュメントに書いてあるが,サンプルプログラム中a_matrix(row,column)はa_matrix(i,j)の誤りであるようだ.C++のためか,Octaveの初期化のためか,起動のオーバヘッドがあるように感じた.Octaveから使える函数を書く方法も簡単であるようだ.

しばらく,CやOctaveのライブラリを使ったプログラムで遊んでみてもいいかもしれない.

uptex

JISで行われている内部処理をUTF-8にしたuptexを試してみた.JISのmapファイルはインストールしていないが,UTF-8のテキストはuptex/uplatexとdvpidmxでうまくタイプセットできているようだ.まだ自信はない.以下インストール時のメモ.
  • cbfonts.zip のディレクトリ構造が変わった.
  • ptetex3-cmapをインストールする必要がある.
  • my_option中export CFLAGS="-O2 -DSTDC_HEADERS"とする必要があった.
--- uptex-0.24/patch/0uptex.sh    2008-10-17 21:29:24.000000000 +0900
+++ ptetex3-20080616/0uptex.sh 2008-12-14 11:45:49.000000000 +0900
@@ -114,20 +114,20 @@
FONT_DIR=$UPTEX_TEXMF_DIR/fonts
unzip $SRC_DIR/cbfonts.zip -d $PTETEX_TMP
$MKDIR $FONT_DIR/type1/cbfonts
- mv $PTETEX_TMP/cbfonts/type1/*.pfb $FONT_DIR/type1/cbfonts
+ mv $PTETEX_TMP/cbfonts/fonts/type1/cbgreek/*.pfb $FONT_DIR/type1/cbfonts
$MKDIR $FONT_DIR/tfm/cbfonts
- mv $PTETEX_TMP/cbfonts/tfm/*.tfm $FONT_DIR/tfm/cbfonts
+ mv $PTETEX_TMP/cbfonts/fonts/tfm/cbgreek/*.tfm $FONT_DIR/tfm/cbfonts
$MKDIR $FONT_DIR/source/cbfonts
- mv $PTETEX_TMP/cbfonts/mf/*.mf $FONT_DIR/source/cbfonts
+ mv $PTETEX_TMP/cbfonts/fonts/source/cbgreek/*.mf $FONT_DIR/source/cbfonts
$MKDIR $FONT_DIR/enc/cbfonts
- mv $PTETEX_TMP/cbfonts/encodings/*.enc $FONT_DIR/enc/cbfonts
+ mv $PTETEX_TMP/cbfonts/fonts/enc/*.enc $FONT_DIR/enc/cbfonts
$MKDIR $FONT_DIR/map/dvips/cbfonts
- mv $PTETEX_TMP/cbfonts/dvips/*.map $FONT_DIR/map/dvips/cbfonts
+ mv $PTETEX_TMP/cbfonts/fonts/map/*.map $FONT_DIR/map/dvips/cbfonts/
$RM -r $PTETEX_TMP/cbfonts
cat $TMP_PREFIX/share/texmf/web2c/updmap.cfg || exit

# cbfonts
-MixedMap cbgreek.map
+MixedMap cbgreek-full.map
EOF
fi