- 
                Notifications
    
You must be signed in to change notification settings  - Fork 2.5k
 
Deadlock with multiprocessing (using fork) and OpenMP
        AlexZakIntel edited this page Jan 27, 2022 
        ·
        3 revisions
      
    To reproduce the problem, please use this code:
import open3d as o3d
import numpy as np
from multiprocessing import Process, set_start_method
def test():
    all_pts = np.array([[108.46383020247207, 350.5646727751972, 116.3624462382868],
                     [112.25361397099844, 347.0114607994641, 116.26706010755152],
                     [113.18366122221072, 361.2549821304686, 116.27959668822587],
                     [111.91097601143456, 360.8370105069897, 116.30449797399342]])
    point_cloud = o3d.geometry.PointCloud()
    point_cloud.points = o3d.utility.Vector3dVector(all_pts)
    print("before")
    point_cloud.estimate_normals(o3d.geometry.KDTreeSearchParamHybrid(radius=100, max_nn=22))
    print("after")
if __name__ == '__main__':
    print('open3d version:', o3d.__version__)
    # set_start_method('spawn') # spawn, fork (default on Unix), forkserver
    process = Process(target=test, args=())
    process.start()
    process.join()
    test()
    process = Process(target=test, args=())
    process.start()
    process.join()Output on unix:
open3d version: 0.9.0.0
before
after
before
after
before
(hangs there)
If uncomment set_start_method('spawn'), it will finish properly.
Related issue: Deadlock with multiprocessing (using fork) and OpenMP / PyTorch should warn after OMP and fork that multithreading may be broken #17199
It's caused by GNU OpenMP. Maybe compile againt Intel OpenMP?
This seems to be a common issue with fork. The advice for Python multiprocessing is to use forkserver for multithreaded programs on Linux.
https://docs.python.org/3/library/multiprocessing.html#contexts-and-start-methods
For more detailed information, please see our Issues page at: https://github.com/isl-org/Open3D/issues/1552#issuecomment-1009478420