PARDS
をする。read(), readcdr(), writecdr()に対して、timedread(), timedreadcdr(), timedwritecdr()を作成。ブロックした際に、指定されたタイムアウト時間でブロックから戻る。timedwritecdr()はSyncQueue用。後、同様にtimedcreate(), timedrelease()も作成…
という本を買ってみた(というかAmazonから届いた)。Windowsでforkを実現する方法が書いてあるので。 中身はひたすら一般には公開されていない「Native API」のリファレンス。というか、Windowsで一度もプログラム書いたことが無い人が買う本じゃ無いな、こ…
よく考えたら、Sync a; とかだけで駄目じゃん。たとえ他のプロセスと共有しているリストにつなぐにしても、その直前にキャンセルされたらリーク。むぅう。 ちなみにpthread_cancelについての記事:pthread のキャンセル、UNIX上でのC++ソフトウェア設計の定…
キャンセルされる側のプロセスで共有リソースの解放をしないといけない場合は困るかも。共有リソースでなければプロセス終了とともに解放されるからいいんだけど。まぁ、共有リソースということは、別プロセスとの通信につかっているはずで、そちらで解放す…
もう少し考えてみた。例えば、キャンセル(KILL)したいプロセスにシグナルを送るとしよう。 シグナルのコールバックは、通常は単純に_exit()するものとする。で、共有メモリの確保中に_exit()するとまずい、という話だったんだけど、例えば共有メモリ確保関…
サンプルの説明まで完了。これでおおむねわかるとは思う。英訳は時間よりもやる気がなぁ…
色々考えてはいるものの、難しい問題が多い… GTK+のようなツールキットを使うと、たいてい「何とかmain」のようなシステムが提供するイベント待ちループを実行する。で、並行に仕事を行うため何かをforkしたとして、その完了を知るためには、イベント待ちル…
将来はやりたいと思っているんだけど、そのための問題としてfork()とSystem V IPCがあります。 まずfork()ですが、Windows系OSが直接fork()をサポートしないことは良く知られています。が、色々調べてみると、内部的には該当するAPIがあるので、実装できるら…
SIGALARMでできそうな気がしてきた。System V IPCのセマフォはシグナルを受けると抜けるので。SIGALARMと併用することはできないが、あまり問題にはならないだろう、多分。必要なら、別プロセスを使えばいいし。
pthreadを使って実装したものがあるのでhttp://compression.ca/pbzip2/、軽く性能を比較してみたのですが、ほとんど変わりませんね。というかPARDS版の方が速いくらい。ただ、比較条件を完全に合わせたわけではないので本当かどうかはわかりませんが。まぁ、…
完了しました。サイトのマニュアルも更新しました。
ユーザとインタラクションするプログラムを考えると、 ノンブロックで、Sync系変数に値が入っているか確認するメソッド read/readcdrしてブロックした際、一定時間でタイムアウトするメソッド なんかが、まず候補になりそう。値が入っているかどうか確認する…
もともとPARDSはマルチプロセッサを使って処理速度を向上させる(並列処理)のを目的に作成したライブラリですが、機能を追加することで、並行処理をサポートできないか考え中。ここで並行処理とは、速度向上が目的ではなく、同時並行に動作するプログラムを…
少し寝かせてリリース予定。週末かな?
というWarningが gcc 4系を使ってWorkPoolを使って-Wallをつけると出ます。これ、終端で値を入れない場合なので、実際に初期化していないのですが、どうしたものか。値が無いので初期化しようが無いし。 放置するしか無いかなぁ。ググってみると、Linuxのカ…
は間違いでした。orz というか、正確には測定条件をそろえていなかった。WorkPool版の方のキューサイズが従来版の倍になっていました。キューのサイズをそろえると、ちょっと速い程度。逆に従来版でもキューサイズを倍にすると、同じ程度に速くなりました。 …
ちょっとだけ速くなった。(遅くなる場合もあった。) HP-UXで、逐次14.76sec -> 並列(前版)8.96 sec -> WorkPool版7.77 secと結構速くなったのが意外。HP-UX位だとスケジューリングなんかは良くできているので、あんまり影響が無いのでは思ったが。ハード…
SPMDで並列化して嬉しいアプリを探し中。要は数値計算系アプリなので、いくらでもころがってそうだが、なかなか手ごろな大きさのものが見つからない。ちょっと大き目のものを頑張ってやってみるか… でもSPMD機能は本流じゃないし、そんなに凝ってもなぁ…
先日の2007-01-06 - t-arakiの日記で書いた予想はうそだったみたい。http://eaglet.rain.com/rick/linux/staircase/scase-vs-noscase.htmlによると、暇なCPUが居るときは、常時load_balanceが呼ばれるそう。 When the processor is idle, load_balance() can…
マニュアルを更新、SPMD用コードを整理してコミット。
手元にSMPマシンが無いのでWorkPool版のbzip2の速度が試せないのだが、もしこちらの方が速いとすると、スケジューラのせいかも知れない。色々ググっていると、少なくともLinuxではプロセッサ間の負荷分散は200msごとに行われるそうな(IBM Developer 日本語…
WorkPoolの部分のマニュアルを追記しているのだが、進まない… やはりコーディングの方が楽しいねぇ…(^^;
バリア同期を実装。これで一応は使える状態にはなった。実際にプログラムを並列化してみないとうまく動くかどうかはわからないが… # バリアの実装にセマフォ2つとカウンタ変数が必要だったのだが、もっといい方法はあるんだろうか?
基本的な所は軽く書いてみた。今後どうしようか考え中。 方針は、MPIのようなSPMDプログラムのサポート。具体的には、parallel_begin()でfork, parallel_end()でjoin, 各プロセスに0スタートのプロセスIDを与える。ただforkするだけなので、全プロセスが同じ…
今のPARDSは、数値演算系プログラムの並列化にはあまり向きません。数値演算系は歴史も長いし、OpenMPのような既存のツールを使った方がうまく書けるとは思います。しかし、データフロー同期と数値演算系のループ並列化を混在させたいこともあるかも知れませ…
昨日書いたクラスの件、結局コミットしてみた(昨日)。マニュアルを更新して、並列機でチェックしてみて、良さそうだったらリリースするか。意外と性能いいかも知れんし。でも、遅かったらどうするかなぁ。
2006-12-25 - t-arakiの日記で書いたように、PoolからWorkerが仕事を取りに行くのをサポートするクラスを作成してみた(まだ要修正のところがあるので、未コミット)。このクラス(WorkPool)は、仕事のリスト(SyncList)と、仕事をした結果を出力するリスト(Sy…
これまで、デストラクタでの資源の解放は行っていませんでした。これは、スタック上に確保したSync系変数が、ブロックから抜けることでデストラクタを呼び、資源を開放すると、それを共有しているかも知れない他のプロセスが動作しなくなるためです。(newで…
言及されてるー(Matzにっき(2006-12-21))。ありがたいことです。 Rubyみたいな言語で、処理系に手を入れずにライブラリ層で実現するにはどうすればいいんだろう?今のPARDSでは共有メモリ領域にnewしたオブジェクトをおくことでプロセス間通信をしています…
SyncListの説明まで追加。手間がかかります。