[openrtm-users 00511] Re: onWrite コールバック

Yoshiji Yasu Yoshiji.Yasu @ kek.jp
2008年 7月 9日 (水) 10:33:34 JST


KEKの安です。onWriteコールバックを使って動かしてみました。
実は私たちのOpenRTM-aist.0.4.2は改造されていまして、コンポーネント間の
データ転送は同期を取りながらデータを落とさずに行われます。ですからバッ
ファのempty/full時にはデータは流れずブロックされます。このような条件で
コールバックを使っています。コンポーネントは3つあり、proc1/proc2/proc3
です。proc1は単にTimedLongSeqである単位のデータをシーケンス番号を付けて
送ります。 proc2はそのデータを受けとりシーケンスをチェックし、問題がなけ
ればproc3へ送ります。proc3は同様にシーケンスをチェックし問題なければ捨て
ます。転送時にはTimeOutが発生する可能性がありますのでそれをwrite/read時
のステータスとして受けてTimeOutならシーケンス番号をインクリメントせず再
送したり再読み込みを行います。
さてこのような環境で、proc2に安藤さんのPipeの機能を実装させました。とこ
ろが、問題がありました。確かに、RingBufferをデフォルトのものを使用する限
り、データのシーケンスは保障されなかったりデータがオーバーライトされたり
同じものを読んだりしますが、正常に動作します。しかし、私たちのところは
proc2のInPortでバッファがいっぱいになり、proc1はタイムアウトを発生させて
動作しなくなりました。当然ですが、 proc2でMyRingBufferからデータを読んで
あげないといけないわけですが、proc2のメインスレッドでは何もしていないの
で、読み飛ばす必要があります。とりあえずメインスレッドで読み捨てをしまし
て動作させました。
性能の面ではたぶん読み飛ばしの余計な処理のためかとは思いますが、若干落ち
てしまいました。
40kBのTimedLongSeqで、proc1->proc2->proc3とデータをベストエフォートで渡
して、平均スループットは 16MB/sec(1つのPC上で3つのコンポーネントを
走らせました)で、onWriteコールバックを使わない場合の18MB/secより若干悪
くなっています。PCのCPU使用率は4coreですが、数パーセントです。ちな
みにonWriteコールバックを使わない場合で2MBの TimedLongSeqでは80MB/sec程
度でした。すべてのcoreで約50%のCPU使用率でした。

-- 
Yoshiji Yasu @ Online group, Institute of Particle and Nuclear Studies,
High Energy Accelerator Research Organization ( KEK ),
E-mail : Yoshiji.YASU @ kek.jp




openrtm-users メーリングリストの案内