« September 2007 | Main | November 2007 »

October 21, 2007

仮想化

結局、この週末もパソコンをいじっていた。
Debian Linux の Xen 上での Windows XP に上手く行かなかったので、KVM を試してた。KVM と言っても JAVA の仮想マシンでは無く、LINUX のカーネルレベルで、Xen の完全仮想化と同じ機能を持つと言うもの。
KVM のためには、新しいカーネルが必要で、Debian Linux etch のカーネルでは古くてダメ。
で、testing (etch の次のシステム)から、カーネルと KVM 関連のパッケージだけインストールする。
残念ながら、この新しいカーネルでは、無線LANと nvidia のドライバーが使えない。

で、KVM 上に Windows XP をインストールしたのだが、今度は上手く行った。
さすがにハードウェアで完全仮想化しているだけあって、速い。ハードウェアによる完全仮想化でもパフォーマンスは半分程度に落ちているはずなのだが、実用上まったく問題無いほど速い。

KVMが使えるカーネルは、Debian Linux 用としては安定しているとは言いがたいし、先にも述べた通り無線LANと nvidia のドライバーが使えないので、今後、メインで使うかどうかわからない。Debian Linux のリリース版のカーネルが新しくなるのは、2年位かかるのだろうなあ。
それまで、危険覚悟で新しいカーネルを入れるか、完全仮想化が私のコンピュータで動く事が判った事に満足して、しばらく止めるか。悩みどころである。

もうちょっと、大きなメモリーを買っておけば良かったかな?

| | Comments (0) | TrackBack (0)

October 15, 2007

時間の無駄

新しいパソコンを買って色々試して居るのだが、そろそろ時間を無駄にしているような気がして来た。

まず、デュアルコア対応プログラミングだが、OpenMP を使うと偏微分方程式の数値計算が速くできると思ったら大間違いで、シングルコアの時より遅くなって居る。たぶん私の使い方が間違って居るのだろうが、原因は調査中だ。

仮想化については、VMware Player を使って、Windows XP 上で、Debian Linux etch を動かす事には成功して居る。
逆に、Xen を使って、Debian Linux etch 上で、Windows XP を動かす事には成功して居ない。
Fedora 7 だと仮想化が簡単に使えると聞いたので、ハードディスクの空き容量に Fedora 7 を入れようと思うと入らない。今まで、考えなしに OS をインストールしたので、XP や Debian (32bit と 64 ビット)とスワップ領域で、基本パーティションの上限4つを使い切って居たので、ハードディスクに空きがあっても使えなかったのだ。
拡張パーティションに作り替えて・・など画策もしたが、結局、Debian の2つは色々と試してゴチャゴチャしてきたので、いっそ消してインストールし直すことにした。

計画的にパーティションを作れば、XP と Debian (32bit と 64 ビット)、Fedra 7 の4つを入れることは可能だ。
だが、結局、Fedora 7 で、Xen を試したが、Windows XP をインストールできなかった。
エラーメッセージの出方は違ったが、結局は、Debian の Xen と同じ原因だと思われる。完全仮想化された Windows XP からハードディスク(仮想化されている)をアクセスするとエラーが出るのだ。高い頻度でエラーが出る訳ではないようだが、XP のインストール を途中で止めてしまう。
準仮想化された Linux からのハードディスクアクセスでは問題が出なかったから、完全仮想化だけの問題と思われる。
これほど明確な不具合なら、私のところ以外でも問題になっていそうなものだが、ネット上では見つからなかった。私の使って居るシステム(Athlon64X2 CPU や nVidia のチップセット、SATA2のHDD)に特有な相性の問題なのだろうか?

Xen はあきらめて、Debian を使える状態に戻そうとすると、今度は、64ビット環境で nvidia のグラフィックドライバーが正常に動作しない。以前上手く行かなかった32ビット 環境での nvidia のグラフィックドライバーが上手く行くのに、今度は何度試しても64ビット環境で上手く行かない。

とまあ、こんな風に、せっかくの週末を潰してしまった。苦労した割りには何の進歩も無い。逆に使える状態だった Debian Linux 64 ビット環境での nvidia のグラフィックド ライバーが使えなくなったくらいだ。

ああ、時間を無駄にした。
こんな事なら、小惑星ネタのコンテンツでも書けば良かった。

| | Comments (2) | TrackBack (1)

October 01, 2007

デュアルコア対応プログラミング OpenMP 編

先日、「デュアルコア対応プログラミング」のコンテンツを書き込んだ時は、Cなどのコンパイル言語でのデュアルコア対応プログラミングは未完成であった。
今回は、ちゃんとコンパイル言語でデュアルコアに対応し、高速で計算するプログラムを作ることに成功したので、報告する。
課題は、先日と同じく円周率を求める計算だが、デュアルコアを有効に使って計算するプログラムは下のようになった。

#include 

main()
{
int i;
int n = 1000000000;
double s = 0.0;
system("date");
#pragma omp parallel for reduction(+:s)
for (i = 0;i < n;i++)
s += (4.0 / (4 * i + 1) - 4.0 / (4 * i + 3));
printf("%lf\n",s);
system("date");
}


「えっ、これだけ!?」
そう思うだろう。
ごく普通の C プログラムだ。ただ、「#」で始まる一行のみが、普通の C ではない。
たった一行でデュアルコアどころかクワッドコア、オクタコアの様なマルチコアに対応したプログラムになる。
意外なほど、簡単にマルチコア対応のプログラミングは可能なのだ。その秘密は OpenMP だ。


先日の「デュアルコア対応プログラミング」をアップした後、私なりに高速の計算をデュアルコアで行う方法を探して居た。
前回、C++ でのスレッド(pthread)を使って、プログラミングしたところ、シングルコアでの計算よりも時間がかかった。調べてみたところ、「マルチコアCPUのための並列プログラミング」(秀和システム ISBN:4-7980-1462-1)と言う本に pthread を使った「デュアルコア対応プログラミング」が詳しく載っている。ところが、この本を書店でパラパラとめくってみたところ、これは大変な手間だと言うことが判った。とりあえず、その場は買わずに保留とした。

その後、ネット上で調べてみると、OpenMP と言う機能を使うと、比較的簡単にマルチコアでの並列計算ができると言うことが判った。しかし、OpenMP と言う機能は、コンパイラが対応して居なければならない。マイクロソフトやインテル製コンパイラで対応して居るようだが、高価だったり、Linux では使えなかったり、AMD の CPU に対応して居なかったら嫌だな・・と思って居たら、ごく最近 gcc でも OpenMP に対応したようである。

今年の5月にリリースされた gcc 4.2 から、OpenMP に正式対応したらしい。残念ながら今年4月にリリースされた Debian Linux etch の gcc は 4.1 である。
そこで、まず、最新の gcc をインストールするところから始める。非安定板の sid には、gcc 4.2 のパッケージがあるようだが、不安なので、ソースから構築することにした。

なお、32ビット環境の Debian にはインストールできたが、64ビット環境だとエラーが出て構築できなかった。従って、以降の話は 32ビット環境での話である。

まず、GCCソースコードの在処から、gcc-4.2.1.tar.bz2 をダウンロード。

$ cd ~/work
$ tar jxvf gcc-4.2.1.tar.bz2
$ cd gcc-4.2.1/
$ mkdir dist;cd dist
$ CONFIG_SHELL=/bin/bash; export CONFIG_SHELL
$ ../configure --prefix=/usr/openmp --enable-languages="c,c++"
$ make
$ su
# mkdir /usr/openmp
# make install
# cd /usr/openmp/bin/
# mv c++ c++-4.2.1
# mv cpp cpp-4.2.1
# mv g++ g++-4.2.1
# mv gcc gcc-4.2.1
# mv gccbug gccbug-4.2.1
# mv gcov gcov-4.2.1

残念ながら、構築に成功したのは、32ビット環境だけだ。64ビット環境だと、libc.a libc.so が無いと言ってエラーで止まる。あるのだが。

/etc/ld.so.conf に下記の一行を追加する。

/usr/openmp/lib

その後、次のコマンドでライブラリーを設定する。

# /sbin/ldconfig

~/.bashrc に下記の一行を追加する。

export PATH=/usr/openmp/bin:$PATH

上記のような方法だと、gcc 4.2 は、/usr/openmp/  の中にインストールされる。アンインストールする時は、/usr/openmp/ ごと消してしまい、PATH や ld の設定を戻すこと。

・サンプルプログラム その4:testDualCore04.c

コンパイルは簡単で、次のようにオプション「-fopenmp」を付けるだけだ。

$ gcc-4.2.1 -fopenmp -o testDualCore04 testDualCore04.c
$ ./testDualCore04.c
2007年 10月 1日 月曜日 19:34:48 JST
3.141593
2007年 10月 1日 月曜日 19:34:58 JST

システムモニターで見ながら、プログラムを走らせると、面白いように2つの CPU の使用負荷が上がる。もちろん、無駄に CPU が使われて居る訳ではなく、シングル CPU での計算の2倍の速度だ。

先のプログラムの「#」で始まる一行は、続く「for 文」を複数の CPU コアに処理を振り分ける事を意味する。

今回の円周率の計算は、極めて並列計算に合った特殊な例かもしれない。しかし、OpenMP を使うと意外に簡単にマルチコアを有効に使った並列計算プログラムが作れることが判ったことが大きな収穫だ。

| | Comments (2) | TrackBack (0)

« September 2007 | Main | November 2007 »