2010年1月29日金曜日

IDL でマルチコアを使い切る

方針的な物がわかりました。たぶん。

IDL では FORK は使えなくて、 Thread はユーザーが見えない範囲で一部の関数の計算に使用されています。

まぁでも特定関数に対する Thread の利用はそんなに効率があがらないっぽいので(少なくとも FFT の場合)、もうちょっと荒粒度でマルチコアを使う機能がないかなぁと思っていました。最悪IDLを二つ立ち上げてもいいんですが、ライセンスの問題をその分消費するはずです。

IDL_IDLBridge が Fork に一番近いんですが、FORKというよりは IDL を複数立ち上げるのに近くて、それぞれのプロセスに関して別途初期化が必要、とのことでした。しかもカレントディレクトリすら引き継がないし。

というわけでそれらを解決する方法。

  1. fork したい直前で SAVE, /all, FILENAME=’なんとか’
  2. p2 = OBJ_NEW(‘IDL_IDLBRIDGE’) で新しいプロセスを作成
  3. p2->Execute, ‘CD, “’ + GETENV(‘PWD’) + ‘”’ でカレントディレクトリに写る
  4. p2->Execute, ‘RESTORE, FILENAME=”なんたら”’ で子プロセスのメモリの内容をまとめる
  5. p2->Execute, ‘なんたら’, /NOWAIT で子プロセスに仕事をさせる。

うーん綺麗じゃないですね。子プロセスの生成コストとしては一般的なプログラミングにおける fork よりも相当悪い(copy on write じゃないし、というかそれ以前の問題で)ですが、新規 IDL(SSWIdl)を立ち上げるよりはよい、ぐらいです。

一応起動した後はパラメーター渡して色々みたいなこともできるので、まぁ使いようが無いわけではない、ぐらいで。

0 件のコメント:

コメントを投稿

この投稿へのリンク:

リンクを作成

<< ホーム