diff --git a/python/src/fit.hpp b/python/src/fit.hpp index 26c32d3a..2205829e 100644 --- a/python/src/fit.hpp +++ b/python/src/fit.hpp @@ -211,9 +211,12 @@ fit_dispatch(const aare::FitModel &model, new NDArray({y.shape(0), y.shape(1), npar}, 0.0); auto y_view_err = make_view_3d(y_err); - aare::fit_3d(model, x_view, y_view, y_view_err, - par_out->view(), err_out->view(), - chi2_out->view(), n_threads); + { + py::gil_scoped_release release; // release GIL for parallel loop + aare::fit_3d(model, x_view, y_view, y_view_err, + par_out->view(), err_out->view(), + chi2_out->view(), n_threads); + } if (model.compute_errors()) { return py::dict("par"_a = return_image_data(par_out), @@ -229,9 +232,12 @@ fit_dispatch(const aare::FitModel &model, NDView dummy_err{}; NDView dummy_err_out{}; - aare::fit_3d(model, x_view, y_view, dummy_err, - par_out->view(), dummy_err_out, - chi2_out->view(), n_threads); + { + py::gil_scoped_release release; // release GIL for parallel loop + aare::fit_3d(model, x_view, y_view, dummy_err, + par_out->view(), dummy_err_out, + chi2_out->view(), n_threads); + } return py::dict("par"_a = return_image_data(par_out), "chi2"_a = return_image_data(chi2_out)); @@ -253,9 +259,17 @@ fit_dispatch(const aare::FitModel &model, } auto y_view_err = make_view_1d(y_err); - result = aare::fit_pixel(model, x_view, y_view, y_view_err); + { + py::gil_scoped_release release; // release GIL for parallel loop + result = + aare::fit_pixel(model, x_view, y_view, y_view_err); + } } else { - result = aare::fit_pixel(model, x_view, y_view); + { + py::gil_scoped_release + release; // release GIL for parallel loop} + result = aare::fit_pixel(model, x_view, y_view); + } } return pack_1d_result_dict(result, model.compute_errors());