WindowsPCで簡単に高速な並列処理を行う方法
簡単にWindowsで高速な並列演算を行う方法


                     書いた日  2007 3.27
                     このようなプログラムを書いたとき 2001−


当初はPVMやMPIを使うつもりであったのであるが、Linuxを使用したことが無いのでわからない、
GNU CもFortranも使ったことが無いのでこのように成った。
Visual C++は使っている人口が多いので使いやすく?安定でありOptimizeが強力であり、整数演算では最適化に速度を選択すると3−5倍くらいの
速度になる。
しかし、浮動少数では速度は上がらないのでGNUも同じであると思われる。

特徴としてはどのような言語でも使用できる。
子機のプログラムはどれも同じ物を書いておく。
LANで共有ファイルが使えれば、CPUも言語はどんなものでも良い。
しかし、親機は子機の結果を集めるので一番遅い子機の速度に影響される。

頻繁に通信を行えば速度はどこまでも低下する。
まとめて送るようにすれば一つあたりのPCの効率は簡単に90%以上になる。

PCのモニターとキーボード切り替え機が4台までのものを使っていたので、5台目以降は「VNC」というソフトを使っていた。
VNCは背景などを簡略化しないと動作が重い。

最近のDual coreのものでは一つのPCで二つのプログラムを走らせることが考えられる。


以下は私の作ったプログラムの一部を切り抜いて流れを書いたものである。


子機の流れ

int para_jitukou(void){

// 使用するファイル
// meirei.dat
// joutai.dat
// rx_data.dat
// tx_data.dat


printf("\nPCの番号の入力");


// 状態をReadyに変更

// コマンドの受け取り

// コマンド消去

// 親機からデータの受け取り

// 状態をbusyに変更

// コマンドの実行

if(meirei[0]=='s'){     

// 終了したら状態をReadyに変更


if(meirei[0]=='k'){

// 終了したら状態をReadyに変更





//  親機の実行

// PCの数を入力

PCの数までloop
// 状態の確認 joutai.dat
// 親機からデータの送信 tx_data.dat
//Readyでコマンドの送信
loop end


PCの数までloop
// 状態の確認 joutai.dat
// 子機からデータの受信 rx_data.dat
loop end


状態確認で
if(NULL==(fp1=fopen(file_a1,"r"))){goto tag_para_;}
if(joutai[0]=='b'){goto tag_para_;}
のようにしているので子機が共有ファイルに書いているときや、
Busyのときにはもう一度fopenへ戻るので、
少しインターバルタイマを入れないと状態確認が激しくて子機が書き込めなくなり
速度が極端に低下する。
LANのハブで4台くらいまでは何とも無いが、ハブのバッファを超えると極端に速度低下が起きる。
適当にインターバルタイマーで時間稼ぎを入れて調節する必要がある。






写真はAthlon1000MHz 768MB 当時では最新だった。最近はDual Xeon 3.8GHz Core Duoなど色々、