From: Wolfgang Bangerth Date: Thu, 30 Jul 2015 19:59:14 +0000 (-0500) Subject: Parallelize MappingQ::get_*_data(). X-Git-Tag: v8.4.0-rc2~698^2 X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8cdab1eb64b434feceadbe3824091802ab74a964;p=dealii.git Parallelize MappingQ::get_*_data(). In MappingQ, get_*_data() creates both a data object for a Q_p mapping as well as for a Q_1 mapping (for interior cells). This can be done in parallel. Do so here. --- diff --git a/source/fe/mapping_q.cc b/source/fe/mapping_q.cc index f3bcb5394f..48e6fc9281 100644 --- a/source/fe/mapping_q.cc +++ b/source/fe/mapping_q.cc @@ -199,11 +199,26 @@ MappingQ::get_data (const UpdateFlags update_flags, const Quadrature &quadrature) const { InternalData *data = new InternalData(n_shape_functions); - this->compute_data (update_flags, quadrature, - quadrature.size(), *data); + + // fill the data of both the Q_p and the Q_1 objects in parallel + Threads::TaskGroup<> tasks; + tasks += Threads::new_task (std_cxx11::function + (std_cxx11::bind(&MappingQ::compute_data, + this, + update_flags, + std_cxx11::cref(quadrature), + quadrature.size(), + std_cxx11::ref(*data)))); if (!use_mapping_q_on_all_cells) - this->compute_data (update_flags, quadrature, - quadrature.size(), data->mapping_q1_data); + tasks += Threads::new_task (std_cxx11::function + (std_cxx11::bind(&MappingQ::compute_data, + this, + update_flags, + std_cxx11::cref(quadrature), + quadrature.size(), + std_cxx11::ref(data->mapping_q1_data)))); + tasks.join_all (); + return data; } @@ -216,12 +231,26 @@ MappingQ::get_face_data (const UpdateFlags update_flags, { InternalData *data = new InternalData(n_shape_functions); const Quadrature q (QProjector::project_to_all_faces(quadrature)); - this->compute_face_data (update_flags, q, - quadrature.size(), *data); + + // fill the data of both the Q_p and the Q_1 objects in parallel + Threads::TaskGroup<> tasks; + tasks += Threads::new_task (std_cxx11::function + (std_cxx11::bind(&MappingQ::compute_face_data, + this, + update_flags, + std_cxx11::cref(q), + quadrature.size(), + std_cxx11::ref(*data)))); if (!use_mapping_q_on_all_cells) - this->compute_face_data (update_flags, q, - quadrature.size(), - data->mapping_q1_data); + tasks += Threads::new_task (std_cxx11::function + (std_cxx11::bind(&MappingQ::compute_face_data, + this, + update_flags, + std_cxx11::cref(q), + quadrature.size(), + std_cxx11::ref(data->mapping_q1_data)))); + tasks.join_all (); + return data; } @@ -234,12 +263,26 @@ MappingQ::get_subface_data (const UpdateFlags update_flags, { InternalData *data = new InternalData(n_shape_functions); const Quadrature q (QProjector::project_to_all_subfaces(quadrature)); - this->compute_face_data (update_flags, q, - quadrature.size(), *data); + + // fill the data of both the Q_p and the Q_1 objects in parallel + Threads::TaskGroup<> tasks; + tasks += Threads::new_task (std_cxx11::function + (std_cxx11::bind(&MappingQ::compute_face_data, + this, + update_flags, + std_cxx11::cref(q), + quadrature.size(), + std_cxx11::ref(*data)))); if (!use_mapping_q_on_all_cells) - this->compute_face_data (update_flags, q, - quadrature.size(), - data->mapping_q1_data); + tasks += Threads::new_task (std_cxx11::function + (std_cxx11::bind(&MappingQ::compute_face_data, + this, + update_flags, + std_cxx11::cref(q), + quadrature.size(), + std_cxx11::ref(data->mapping_q1_data)))); + tasks.join_all (); + return data; }