Introduction

見事な罠にはまったので。

マルチスレッドだと速度が出ないから、とマルチプロセスにしたら全体的なパフォーマンスは上がったのに、なぜか動かなくなったのが Open3D の DBSCAN によるクラスタリング。

What’s wrong?

実は Issue が上がっている。
Deadlock with multiprocessing (using fork) and OpenMP #1552 。

とはいえ、ちょっと探すのに苦労はした。
問題の Issue では、KDTreeSearchParamHybrid を使っていたため検索で cluster_dbscan を必死で検索していても何も出ないわけです。

POSIX 環境における folk が問題なようで、プロセス生成のコンテキストを spawn から folkserver に変えると解決する。

自宅でも検証した。
また、C++ でも同様にデッドロックをするように見える。

C++ では spawnfolkserver にすることはできても、ワーカーのコードをスクリプトとして実行する必要があるみたいなので、デッドロックを解除する版は未検証。