ソフトウェア/Igor のバックアップ(No.6)

更新


公開メモ

Igor とは

測定したデータの解析に Wave Metrics 社の Igor Pro を頻繁に使っています。

なかなか癖のあるソフトですが、 Igor 上でプログラムを組むことでかなり複雑なデータ解析も自動化できていろいろ捗ります。

ここには使い回しの効きそうなコード例を上げていこうと思います。

公式のオンラインヘルプはこちらです。
http://www.hulinks.co.jp/support/igor/programming/index.html

分野別記事へのリンク

Igor のマルチスレッド対応

Igor Pro 6.1 から、マルチスレッド対応が強化されたそうです。

LANG:Igor
wave0 = any_expression(x)

のような代入文で時間がかかっている場合、

LANG:Igor
MultiThread wave0 = any_expression(x)

とするだけで、個々の座標値に対する計算を異なるスレッドで行ってくれます。

当然、wave の個々の座標の値の間に依存関係がある場合にはうまくいきませんが、 独立に計算できる場合にはこれだけでかなり速度が上がります。

より高度なマルチスレッド

もっと複雑なことをしたい場合には、 ThreadGroupCreate / ThreadStart / ThreadGroupPutDF / ThreadGroupGetDF / ThreadGroupWait / ThreadGroupRelease といった関数を使うことで、きめ細やかなマルチスレッド制御を行えます。

実際やってみると、メモリ確保などに時間がかかっていることも多いようで、 単純にスレッド数倍もの速度向上は望めませんが、シングルスレッド比で 2倍くらいの速度は簡単に出せるようでした。

例えば、Intel Core i7-3520M @ 2.9GHz + Windows 7 (64bit) で 1024 本のスペクトルに対して解析を行った結果、

  • シングルスレッド = 11.0 秒
  • マルチスレッド = 4.3秒

という結果が得られました。

注意点

このようにマルチスレッドで使う関数、例えば SomeMutiThreadableFunction(x) には ThreadSafe というキーワードを付けて定義する必要があります。

LANG:Igor
ThreadSafe function SomeMutiThreadableFunction(x)

    // マルチスレッド対応コード

end

このような ThreadSafe な関数からは、同じく ThreadSafe とマークされた関数以外を呼び出せません。

やってみるとすぐ分かるのですが、現在のところ ThreadSafe とマークした関数には デバッガ機能が働かず、ブレークやステップ実行ができません。

シングルスレッドで十分にテストしてからマルチスレッドに移行しないと、 うまく動かないときに面倒なことになります。


Counter: 11263 (from 2010/06/03), today: 1, yesterday: 0