AISTCollisionDetectorのマルチスレッド対応干渉チェックについて

お世話になります。

AISTCollisionDetectorに用意されているマルチスレッド対応のdetectCollisions(std::function<void(const CollisionPair& collisionPair)> callback)についてご教示ください。
(Pluginでパスプランニング等を実行する際の干渉判定処理を高速化する目的で本APIを使用したいと考えております。)

  • こちらのマルチスレッド対応APIを使用することで、CPUマルチコア対応されるという認識で正しいでしょうか(初学的な質問で恐縮ですが)。マルチコア対応させるためにCPUコアの割り当てのための明示的な設定が必要などありますでしょうか。
  • 本APIを使用した実装例(サンプルコード等)ございましたらご教示頂けますでしょうか。
  • その他使用上の制約等、何かございましたらご教示ください。

<使用環境>

  • Windows10 64bit
  • Choreonoid-1.7(Visual Studio 2017にてビルド)

よろしくお願いいたします。

そちらひっそりと実験的に記述しておりましたが、ソースをご覧になって気づかれたということですね。いちおうこちら概要を説明しておくと、AISTCollisionDetectorでsetNumThreadsに指定した数のスレッドを使ってマルチスレッドで干渉チェックを行うというものです。

はい、その認識で正しいです。
CPUコアの割り当ての機能はありません。こちらstd::threadsを素直に使っていて、あまり難しいことはしておりません。

申し訳ないのですが、現状ではサンプルとなるものがありません。この機能、Gitのログで確認したところ2016年7月に私が追加したようで、何かの理由で実験的に実装したということは覚えているのですが、具体的なところをあまり思い出せずにいます。もちろん干渉チェックを高速化しようとして実装したことは間違いありません。

実装当時に実際に試したところ、あまり速くならなかったように記憶しています。ただしその時に試したモデルの特性にもよることですし、だいぶ前の記憶になりますので、これで実際にどの程度速くなるかについて正確なところは今のところ分からないというか、再度試してみる必要があるというのが正直なところです。

アルゴリズム的には、まずAISTCollisionDetectorは元々全ての干渉ペアをループでまわして順次干渉チェックしていくようになっており、そのループで回す部分を単純にスレッドごとに分割して並列化したものです。ただし各ペアにかかる計算時間は実際に干渉が生じるかどうかによっても大きく変わってくるところがあり、そこまで考慮してスレッドへの振り分けを行わないと速くならないところはあるかと思います。その部分はまだちゃんと考慮できていないのが現状です。振り分けをなるべく分散させたらよいかと思ってランダムに振り分けを行うコードなども入れてみましたが、その程度の思いつきの実装ではあまり変化がなかったようです。

そのような次第でまだ実験的なものではありますが、とりあえず試していただいて、もし可能でしたら結果もご報告いただけると有り難いです。

また干渉チェックの並列化について何かよい方法をご存知の方がいらっしゃいましたら、それを教えていただけるか、さらに実装して試して頂けたりすると、大変有り難く思います。

ご回答頂き、ありがとうございます。
当機能が実験的に実装されたものであること、承知いたしました。
まずは試してみることにいたします。