Windowsの最大ウィンドウサイズ

VisualStudio2005で、MDIを使ってディスプレイより大きなウィンドウを作ろうとしたら、サイズがおかしい…。どうやらディスプレイのサイズより大きなウィンドウを作れないようです。

別のアプリケーションでも試してみたら、ウィンドウを広げてみてもディスプレイのサイズで止まります。これはもしやWindowsの仕様なのか。

dish -- 分散シェル

make -j オプションでは、ローカルマシンで並列実行してくれるだけでしたが、dishというsh互換のコマンドを使えば、自動でリモートマシンで実行してくれるようです。

makeのSHELL変数を設定すれば、shの代わりにこれでコマンドを実行できるので、便利そうです。

make -j 10 SHELL="dish host1 2 host2 host3 4"

のように使えるみたいです。まだ使ってないので、これから使ってみたいと思います。

makeで並列処理

並列処理を行うように作っていないプログラムは、マルチCPUのマシンで動かしてもCPU1個しか使いません。並列処理を行うようにプログラムを書くのは大変ですが、一番簡単にマルチCPUの恩恵を受ける方法は複数のプログラムを同時に動かすことです。もちろん、片方の結果をもう片方が使うようなプログラムはダメですが。

makeはデフォルトでは逐次的にプログラムを実行しますが、-jオプションをつけると、依存関係を元にして、依存していないプログラムを並列に実行してくれます。make -j 2 のように数字を指定すると、最大のプロセス数を指定できます。デフォルトは-j 1ってことですね。数字を指定しないと、制限なしです。基本的にはCPUの数くらいがいいと思います。

MPIで並列処理

だいぶ前にもMPIでの高速化にちょっと興味を持って触ってみたのですが、この度並列処理しないと時間が足りなさそうな事態になったので必要に迫られてMPIを使ってみました。前にちょっと使ったので簡単にいけるだろー、と思ってたのですが、意外とはまりました。はまったとこだけ書くので、詳しい使い方は書きません。解説というより自分用メモです。

LAMとMPICH

MPIとは単なる仕様で、実装としては代表的なものにLAMというのとMPICHというのがあるようです。ソースレベルでは(ほぼ)互換性があるようです。基本はUNIX互換OS用みたいですが、MPICHはWindows用もあるみたいです。LinuxWindows両方使う僕には興味ありますが、Fedoraにデフォルトで入っているLAMを使うことにします。

とりあえず入門用にリンクです。詳しい使い方はMPIで検索すればすぐ見つかりますが。

LAMのバージョン

LAMは、マシンごとのバージョンが違うとうまく動きません。メジャーバージョン(?)(7.x.xと6.x.xとか)が違うとまず絶望的です。2桁目も違うとちょっとまずそうです。(7.0.xではライブラリを静的リンクしてるのに、7.1.xでは動的リンクしてて7.1.xでコンパイルしたプログラムは7.0.xのマシンで動かないとか)。バージョンが下のマシンから上のマシンにつなぐ分には問題ない…んでしょうか(?)

ディストリビューション&バージョンの違い

研究室には、計算してなさそうなマシンは何台もありますが、VineRedhatFedora、しかも違うバージョンが混在してるので、そのまま使うのは難しいです。Fedoraみたいな新しいのはgccの新しいバージョン使ってるので、FedoraコンパイルしたのをVineで実行すると「〜〜.soがないぞ!」って怒られます。とりあえず、gccとLAMのバージョンが一番古そうなVineコンパイルしたら(今回は)うまくいきました。

あと、Vineにはapt-getで入れたのですが、lambootはデフォルトでrshを使うようになってます。いまどきrshもないと思うんですが。で、つながらないぞって言われるので、環境変数 LAMRSH を "ssh -x" にしてやればsshを使えます。詳しくは以下で。

sshで入るときに毎度パスワードの入力を求められるので、公開鍵暗号+エージェントもしくは公開鍵暗号パスフレーズなしを使ってパスワード入力を省略しないとめんどくさすぎるので注意。

lamhosts

ホストの設定ファイルです。どうせ指定しないといけないので名前は何でもいいようですが。CPUが複数あるとき(マルチCPUやHyper Threading)は、ホスト名を複数回指定するかcpu=2のように指定すればいいようです。

blinky
blinky
blinky
blinky
pinky cpu=2

あと、ホスト名を名前解決してIPアドレスにしたときに127.0.0.1になるとダメみたいです。Fedoraなんかはデフォルトで、自分のマシン名は127.0.0.1になるように /etc/hosts に設定されてるので注意です。

  • /etc/hosts を設定して、ホスト名のアドレスを(ループバックでない)外向きのアドレスに指定する。
  • ホスト名でなくIPアドレスを指定する。

のどちらかをする必要がありそうです。( http://www.lam-mpi.org/faq/category4.php3#question11 )

プログラム中の入出力

  • コマンドライン引数は、全プロセスでargc, argvに入ってます。
  • 標準出力、標準エラー出力は全プロセスmpirunした端末に出ます。
  • 標準入力は1プロセスだけ。入力データの複製はされません。データの入力が必要ならnfs等を使ってファイル、もしくはMPIの関数で通信で。

Sambaでフォルダリダイレクト(追記)

id:ke-k:20061022#p2(Sambaでフォルダリダイレクト)に追記です。

おそらくSambaだけでなくWindowsドメイン一般ですが、フォルダリダイレクトの対象とするディレクトリは、移動プロファイルと別のところに置いておかないとダメです。移動プロファイルの下のディレクトリの一部をフォルダリダイレクトに設定するといろいろ不具合でます。これでちょっとはまりました。移動プロファイルとフォルダリダイレクトに関する理解が足りなかったのが原因ですが。

現在移動プロファイルで運用している場合、フォルダリダイレクトに移行するときにここにはまりそうな気がします。システムポリシーとSambaの設定を使ってトリッキーなことをすれば、そのままの構成でできないこともないですが、素直に分けましょう。

3軸搭載:DS Motion Card

Panyawoさんのブログから。

DSで開発している人向けの面白デバイスが登場。
3軸の加速度センサーと1軸のジャイロを搭載しているとのこと。

だそうです。これは面白そうです。

欲しい!!って思ったんですが、海外のサイトから通販で買うのって簡単にできるんですかねぇ。国内の通販すらほとんど使わない人なので、かなり抵抗あります…。