From 3d425594d8f798b3cb6913622951e9e87e99c17d Mon Sep 17 00:00:00 2001 From: Hartmut Kaiser Date: Tue, 25 Feb 2025 19:54:41 -0600 Subject: [PATCH] Fixing MPI parcel port issue exposed by #6623 --- .../parcelport_mpi/receiver_connection.hpp | 4 - .../hpx/parcelport_mpi/sender_connection.hpp | 8 +- .../tests/regressions/CMakeLists.txt | 29 ++--- .../tests/regressions/nested_vectors_6623.cpp | 108 ++++++++++++++++++ 4 files changed, 121 insertions(+), 28 deletions(-) create mode 100644 libs/full/parcelset/tests/regressions/nested_vectors_6623.cpp diff --git a/libs/full/parcelport_mpi/include/hpx/parcelport_mpi/receiver_connection.hpp b/libs/full/parcelport_mpi/include/hpx/parcelport_mpi/receiver_connection.hpp index 0bbdeb00a18..0778c63c716 100644 --- a/libs/full/parcelport_mpi/include/hpx/parcelport_mpi/receiver_connection.hpp +++ b/libs/full/parcelport_mpi/include/hpx/parcelport_mpi/receiver_connection.hpp @@ -161,8 +161,6 @@ namespace hpx::parcelset::policies::mpi { { if (need_recv_tchunks) { - util::mpi_environment::scoped_lock l; - request_ = util::mpi_environment::irecv( buffer_.transmission_chunks_.data(), buffer_.transmission_chunks_.size() * @@ -200,8 +198,6 @@ namespace hpx::parcelset::policies::mpi { HPX_ASSERT(request_ptr_ == nullptr); { - util::mpi_environment::scoped_lock l; - ack_ = static_cast( connection_state::acked_transmission_chunks); request_ = util::mpi_environment::isend( diff --git a/libs/full/parcelport_mpi/include/hpx/parcelport_mpi/sender_connection.hpp b/libs/full/parcelport_mpi/include/hpx/parcelport_mpi/sender_connection.hpp index 42cfb4419b3..07c3996f9f3 100644 --- a/libs/full/parcelport_mpi/include/hpx/parcelport_mpi/sender_connection.hpp +++ b/libs/full/parcelport_mpi/include/hpx/parcelport_mpi/sender_connection.hpp @@ -198,9 +198,7 @@ namespace hpx::parcelset::policies::mpi { auto const& chunks = buffer_.transmission_chunks_; if (!chunks.empty() && !header_.piggy_back_tchunk()) { - request_ = util::mpi_environment::isend( - const_cast( - reinterpret_cast(chunks.data())), + request_ = util::mpi_environment::isend(chunks.data(), chunks.size() * sizeof(parcel_buffer_type::transmission_chunk_type), dst_, tag_); @@ -263,8 +261,6 @@ namespace hpx::parcelset::policies::mpi { if (!header_.piggy_back_data()) { - util::mpi_environment::scoped_lock l; - request_ = util::mpi_environment::isend( buffer_.data_.data(), buffer_.data_.size(), dst_, tag_); request_ptr_ = &request_; @@ -325,7 +321,7 @@ namespace hpx::parcelset::policies::mpi { } HPX_ASSERT(request_ptr_ == nullptr); request_ = util::mpi_environment::isend( - const_cast(c.data()), c.size(), dst_, tag_); + c.data(), c.size(), dst_, tag_); request_ptr_ = &request_; } diff --git a/libs/full/parcelset/tests/regressions/CMakeLists.txt b/libs/full/parcelset/tests/regressions/CMakeLists.txt index b0a7ef5d7ea..3efcf5a7eeb 100644 --- a/libs/full/parcelset/tests/regressions/CMakeLists.txt +++ b/libs/full/parcelset/tests/regressions/CMakeLists.txt @@ -4,14 +4,9 @@ # Distributed under the Boost Software License, Version 1.0. (See accompanying # file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -# Copyright (c) 2024 Hartmut Kaiser -# -# SPDX-License-Identifier: BSL-1.0 Distributed under the Boost Software License, -# Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -# http://www.boost.org/LICENSE_1_0.txt) - if(HPX_WITH_NETWORKING) - set(tests ${tests} very_big_parcel) + set(tests ${tests} nested_vectors_6623 very_big_parcel) + set(nested_vectors_6623_PARAMETERS LOCALITIES 2) set(very_big_parcel_PARAMETERS LOCALITIES 2) endif() @@ -29,19 +24,17 @@ foreach(test ${tests}) FOLDER "Tests/Regressions/Modules/Full/Parcelset" ) - # Disable the test due to limited CircleCI resources - - # add_hpx_regression_test( "modules.parcelset" ${test} ${${test}_PARAMETERS} - # TIMEOUT 900 ) - + add_hpx_regression_test( + "modules.parcelset" ${test} ${${test}_PARAMETERS} TIMEOUT 900 + ) endforeach() if(HPX_WITH_NETWORKING) - # Disable the test due to limited CircleCI resources - # very_big_parcel with one additional configurations - - # add_hpx_regression_test( "modules.parcelset" very_big_parcel_int_max_plus_1 - # EXECUTABLE very_big_parcel TIMEOUT 900 PSEUDO_DEPS_NAME very_big_parcel - # ${very_big_parcel_PARAMETERS} --nbytes-add=1 ) + add_hpx_regression_test( + "modules.parcelset" very_big_parcel_int_max_plus_1 + EXECUTABLE very_big_parcel TIMEOUT 900 + PSEUDO_DEPS_NAME very_big_parcel ${very_big_parcel_PARAMETERS} + --nbytes-add=1 + ) endif() diff --git a/libs/full/parcelset/tests/regressions/nested_vectors_6623.cpp b/libs/full/parcelset/tests/regressions/nested_vectors_6623.cpp new file mode 100644 index 00000000000..a2fd4860d01 --- /dev/null +++ b/libs/full/parcelset/tests/regressions/nested_vectors_6623.cpp @@ -0,0 +1,108 @@ +// Copyright (c) 2025 Marco Diers +// +// SPDX-License-Identifier: BSL-1.0 +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +class Data +{ +public: + Data() = default; + + Data(std::size_t x, std::size_t y, std::size_t z) + : _data(x, std::vector>(y, std::vector(z))) + { + } + + auto size() const + { + return _data.size() * _data.begin()->size() * + _data.begin()->begin()->size(); + } + + template + friend auto serialize(Archive& archive, Data& object, unsigned int version) + { + // clang-format off + archive & object._data; + // clang-format on + return; + } + +private: + std::vector>> _data{}; +}; + +class Component : public hpx::components::component_base +{ +public: + Component() = default; + + auto call(Data data) -> void + { + std::cout << "Data size: " << data.size() << '\n'; + return; + } + + HPX_DEFINE_COMPONENT_ACTION(Component, call); +}; + +HPX_REGISTER_COMPONENT(hpx::components::component, Component); +HPX_REGISTER_ACTION(Component::call_action); + +class ComponentClient + : public hpx::components::client_base +{ + using BaseType = hpx::components::client_base; + +public: + template + ComponentClient(Arguments... arguments) + : BaseType(std::move(arguments)...) + { + } + + template + auto call(Arguments... arguments) + { + return hpx::async( + this->get_id(), std::move(arguments)...); + } +}; + +int hpx_main() +{ + std::vector clients; + auto localities(hpx::find_all_localities()); + std::transform(std::begin(localities), std::end(localities), + std::back_inserter(clients), + [](auto& loc) { return hpx::new_(loc); }); + Data data(3173, 1379, 277); + std::vector calls; + for (auto& client : clients) + { + calls.emplace_back(client.call(data)); + } + hpx::wait_all(calls); + + return hpx::finalize(); +} + +int main(int argc, char* argv[]) +{ + return hpx::init(argc, argv); +}