投稿

12月, 2008の投稿を表示しています

やっぱり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を使うのがよいように思う.

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)となっていればエラ…

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付きの場合は古いものが消去されるので楽である.

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が楽なのではないだろうか.

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を使えば自分でベクトルや行列及びその演算を定義しなくても演算や様…

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/en…