ソフトウェア/Igor の履歴(No.7)
更新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 とマークした関数には デバッガ機能が働かず、ブレークやステップ実行ができません。
シングルスレッドで十分にテストしてからマルチスレッドに移行しないと、 うまく動かないときに面倒なことになります。
デバッグ環境設定のようなところで「Multithread 機能をオフにして、 すべてをシングルスレッド(ノンプリエンプティブマルチスレッド)で動作させる」 なんていうのを選べると、デバッグが楽になって良いんですけどね・・・
幸い、print や printf は ThreadSafe 関数からも呼べるので、 デバッグにはこれらを使って頑張るしか今のところ手はないようです?