From f97bfbcbab61434192309ce3b01ae95315ed93e7 Mon Sep 17 00:00:00 2001 From: Khalil Asadzade Date: Mon, 9 Feb 2026 13:50:27 -0800 Subject: [PATCH 1/4] feat: cpu spmd ridge --- .../dal/algo/linear_regression/test/spmd.cpp | 9 +++ samples/oneapi/cpp/ccl/onedal_lnx.lst | 2 +- .../sources/ridge_regression_distr_ccl.cpp | 81 +++++++++++++++++++ samples/oneapi/cpp/mpi/onedal_lnx.lst | 2 +- .../sources/ridge_regression_distr_mpi.cpp | 80 ++++++++++++++++++ 5 files changed, 172 insertions(+), 2 deletions(-) create mode 100644 samples/oneapi/cpp/ccl/sources/ridge_regression_distr_ccl.cpp create mode 100644 samples/oneapi/cpp/mpi/sources/ridge_regression_distr_mpi.cpp diff --git a/cpp/oneapi/dal/algo/linear_regression/test/spmd.cpp b/cpp/oneapi/dal/algo/linear_regression/test/spmd.cpp index f220de2e19e..51262cca9db 100644 --- a/cpp/oneapi/dal/algo/linear_regression/test/spmd.cpp +++ b/cpp/oneapi/dal/algo/linear_regression/test/spmd.cpp @@ -27,4 +27,13 @@ TEMPLATE_LIST_TEST_M(lr_spmd_test, "LR common flow", "[lr][spmd]", lr_types) { this->run_and_check_linear(); } +TEMPLATE_LIST_TEST_M(lr_spmd_test, "RR common flow", "[rr][spmd]", lr_types) { + SKIP_IF(this->not_float64_friendly()); + + this->generate(777); + this->set_rank_count(GENERATE(2, 3)); + + this->run_and_check_ridge(); +} + } // namespace oneapi::dal::linear_regression::test diff --git a/samples/oneapi/cpp/ccl/onedal_lnx.lst b/samples/oneapi/cpp/ccl/onedal_lnx.lst index 5e6ca7ee65e..db23acace03 100644 --- a/samples/oneapi/cpp/ccl/onedal_lnx.lst +++ b/samples/oneapi/cpp/ccl/onedal_lnx.lst @@ -18,5 +18,5 @@ ## oneAPI Data Analytics Library samples list ##****************************************************************************** -MPI = linear_regression_distr_ccl +MPI = linear_regression_distr_ccl ridge_regression_distr_ccl diff --git a/samples/oneapi/cpp/ccl/sources/ridge_regression_distr_ccl.cpp b/samples/oneapi/cpp/ccl/sources/ridge_regression_distr_ccl.cpp new file mode 100644 index 00000000000..8c5ea14a09f --- /dev/null +++ b/samples/oneapi/cpp/ccl/sources/ridge_regression_distr_ccl.cpp @@ -0,0 +1,81 @@ +/******************************************************************************* +* Copyright contributors to the oneDAL project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*******************************************************************************/ + +#include +#include + +#include "oneapi/dal/algo/linear_regression.hpp" +#include "oneapi/dal/io/csv.hpp" +#include "oneapi/dal/spmd/ccl/communicator.hpp" + +#include "utils.hpp" + +namespace dal = oneapi::dal; +namespace lr = dal::linear_regression; + +void run() { + const auto train_data_file_name = get_data_path("linear_regression_train_data.csv"); + const auto train_response_file_name = get_data_path("linear_regression_train_responses.csv"); + const auto test_data_file_name = get_data_path("linear_regression_test_data.csv"); + const auto test_response_file_name = get_data_path("linear_regression_test_responses.csv"); + + const auto x_train = dal::read(dal::csv::data_source{ train_data_file_name }); + const auto y_train = dal::read(dal::csv::data_source{ train_response_file_name }); + const auto x_test = dal::read(dal::csv::data_source{ test_data_file_name }); + const auto y_test = dal::read(dal::csv::data_source{ test_response_file_name }); + + auto comm = dal::preview::spmd::make_communicator(); + auto rank_id = comm.get_rank(); + auto rank_count = comm.get_rank_count(); + + auto x_train_vec = split_table_by_rows(x_train, rank_count); + auto y_train_vec = split_table_by_rows(y_train, rank_count); + auto x_test_vec = split_table_by_rows(x_test, rank_count); + auto y_test_vec = split_table_by_rows(y_test, rank_count); + + const double alpha = 1.0; + const auto rr_desc = lr::descriptor{ true, alpha }; + + const auto result_train = + dal::preview::train(comm, rr_desc, x_train_vec.at(rank_id), y_train_vec.at(rank_id)); + + const auto result_infer = + dal::preview::infer(comm, rr_desc, x_test_vec.at(rank_id), result_train.get_model()); + + if (comm.get_rank() == 0) { + std::cout << "Ridge regression alpha: " << alpha << std::endl; + + std::cout << "Prediction results:\n" << result_infer.get_responses() << std::endl; + + std::cout << "Ground truth:\n" << y_test_vec.at(rank_id) << std::endl; + } +} + +int main(int argc, char const *argv[]) { + ccl::init(); + int status = MPI_Init(nullptr, nullptr); + if (status != MPI_SUCCESS) { + throw std::runtime_error{ "Problem occurred during MPI init" }; + } + + run(); + + status = MPI_Finalize(); + if (status != MPI_SUCCESS) { + throw std::runtime_error{ "Problem occurred during MPI finalize" }; + } + return 0; +} diff --git a/samples/oneapi/cpp/mpi/onedal_lnx.lst b/samples/oneapi/cpp/mpi/onedal_lnx.lst index 24801909251..e35d48110fa 100644 --- a/samples/oneapi/cpp/mpi/onedal_lnx.lst +++ b/samples/oneapi/cpp/mpi/onedal_lnx.lst @@ -18,4 +18,4 @@ ## oneAPI Data Analytics Library samples list ##****************************************************************************** -MPI = linear_regression_distr_mpi +MPI = linear_regression_distr_mpi ridge_regression_distr_mpi diff --git a/samples/oneapi/cpp/mpi/sources/ridge_regression_distr_mpi.cpp b/samples/oneapi/cpp/mpi/sources/ridge_regression_distr_mpi.cpp new file mode 100644 index 00000000000..67bc552c946 --- /dev/null +++ b/samples/oneapi/cpp/mpi/sources/ridge_regression_distr_mpi.cpp @@ -0,0 +1,80 @@ +/******************************************************************************* +* Copyright contributors to the oneDAL project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*******************************************************************************/ + +#include +#include + +#include "oneapi/dal/algo/linear_regression.hpp" +#include "oneapi/dal/io/csv.hpp" +#include "oneapi/dal/spmd/mpi/communicator.hpp" + +#include "utils.hpp" + +namespace dal = oneapi::dal; +namespace lr = dal::linear_regression; + +void run() { + const auto train_data_file_name = get_data_path("linear_regression_train_data.csv"); + const auto train_response_file_name = get_data_path("linear_regression_train_responses.csv"); + const auto test_data_file_name = get_data_path("linear_regression_test_data.csv"); + const auto test_response_file_name = get_data_path("linear_regression_test_responses.csv"); + + const auto x_train = dal::read(dal::csv::data_source{ train_data_file_name }); + const auto y_train = dal::read(dal::csv::data_source{ train_response_file_name }); + const auto x_test = dal::read(dal::csv::data_source{ test_data_file_name }); + const auto y_test = dal::read(dal::csv::data_source{ test_response_file_name }); + + auto comm = dal::preview::spmd::make_communicator(); + auto rank_id = comm.get_rank(); + auto rank_count = comm.get_rank_count(); + + auto x_train_vec = split_table_by_rows(x_train, rank_count); + auto y_train_vec = split_table_by_rows(y_train, rank_count); + auto x_test_vec = split_table_by_rows(x_test, rank_count); + auto y_test_vec = split_table_by_rows(y_test, rank_count); + + const double alpha = 1.0; + const auto rr_desc = lr::descriptor{ true, alpha }; + + const auto result_train = + dal::preview::train(comm, rr_desc, x_train_vec.at(rank_id), y_train_vec.at(rank_id)); + + const auto result_infer = + dal::preview::infer(comm, rr_desc, x_test_vec.at(rank_id), result_train.get_model()); + + if (comm.get_rank() == 0) { + std::cout << "Ridge regression alpha: " << alpha << std::endl; + + std::cout << "Prediction results:\n" << result_infer.get_responses() << std::endl; + + std::cout << "Ground truth:\n" << y_test_vec.at(rank_id) << std::endl; + } +} + +int main(int argc, char const *argv[]) { + int status = MPI_Init(nullptr, nullptr); + if (status != MPI_SUCCESS) { + throw std::runtime_error{ "Problem occurred during MPI init" }; + } + + run(); + + status = MPI_Finalize(); + if (status != MPI_SUCCESS) { + throw std::runtime_error{ "Problem occurred during MPI finalize" }; + } + return 0; +} From 5ec7f3641fd2fa62be6d1c231f9841a239b55ea3 Mon Sep 17 00:00:00 2001 From: Khalil Asadzade Date: Wed, 11 Feb 2026 01:57:28 -0800 Subject: [PATCH 2/4] refactor: minor stylistic updates --- samples/oneapi/cpp/ccl/onedal_lnx.lst | 3 ++- samples/oneapi/cpp/mpi/onedal_lnx.lst | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/samples/oneapi/cpp/ccl/onedal_lnx.lst b/samples/oneapi/cpp/ccl/onedal_lnx.lst index db23acace03..f3b3559cf79 100644 --- a/samples/oneapi/cpp/ccl/onedal_lnx.lst +++ b/samples/oneapi/cpp/ccl/onedal_lnx.lst @@ -18,5 +18,6 @@ ## oneAPI Data Analytics Library samples list ##****************************************************************************** -MPI = linear_regression_distr_ccl ridge_regression_distr_ccl +MPI = linear_regression_distr_ccl \ + ridge_regression_distr_ccl diff --git a/samples/oneapi/cpp/mpi/onedal_lnx.lst b/samples/oneapi/cpp/mpi/onedal_lnx.lst index e35d48110fa..2cefe8c6de8 100644 --- a/samples/oneapi/cpp/mpi/onedal_lnx.lst +++ b/samples/oneapi/cpp/mpi/onedal_lnx.lst @@ -18,4 +18,5 @@ ## oneAPI Data Analytics Library samples list ##****************************************************************************** -MPI = linear_regression_distr_mpi ridge_regression_distr_mpi +MPI = linear_regression_distr_mpi \ + ridge_regression_distr_mpi From 1e006704beabd2bf9e8fc16df9277d349732b4f1 Mon Sep 17 00:00:00 2001 From: Khalil Asadzade Date: Sun, 29 Mar 2026 05:10:56 -0700 Subject: [PATCH 3/4] merge with main cleanup --- .../oneapi/cpp/ccl/sources/ridge_regression_distr_ccl.cpp | 8 ++++---- .../oneapi/cpp/mpi/sources/ridge_regression_distr_mpi.cpp | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/samples/oneapi/cpp/ccl/sources/ridge_regression_distr_ccl.cpp b/samples/oneapi/cpp/ccl/sources/ridge_regression_distr_ccl.cpp index 8c5ea14a09f..7e65c75e1c9 100644 --- a/samples/oneapi/cpp/ccl/sources/ridge_regression_distr_ccl.cpp +++ b/samples/oneapi/cpp/ccl/sources/ridge_regression_distr_ccl.cpp @@ -27,10 +27,10 @@ namespace dal = oneapi::dal; namespace lr = dal::linear_regression; void run() { - const auto train_data_file_name = get_data_path("linear_regression_train_data.csv"); - const auto train_response_file_name = get_data_path("linear_regression_train_responses.csv"); - const auto test_data_file_name = get_data_path("linear_regression_test_data.csv"); - const auto test_response_file_name = get_data_path("linear_regression_test_responses.csv"); + const auto train_data_file_name = get_data_path("data/linear_regression_train_data.csv"); + const auto train_response_file_name = get_data_path("data/linear_regression_train_responses.csv"); + const auto test_data_file_name = get_data_path("data/linear_regression_test_data.csv"); + const auto test_response_file_name = get_data_path("data/linear_regression_test_responses.csv"); const auto x_train = dal::read(dal::csv::data_source{ train_data_file_name }); const auto y_train = dal::read(dal::csv::data_source{ train_response_file_name }); diff --git a/samples/oneapi/cpp/mpi/sources/ridge_regression_distr_mpi.cpp b/samples/oneapi/cpp/mpi/sources/ridge_regression_distr_mpi.cpp index 67bc552c946..d20cc917d8a 100644 --- a/samples/oneapi/cpp/mpi/sources/ridge_regression_distr_mpi.cpp +++ b/samples/oneapi/cpp/mpi/sources/ridge_regression_distr_mpi.cpp @@ -27,10 +27,10 @@ namespace dal = oneapi::dal; namespace lr = dal::linear_regression; void run() { - const auto train_data_file_name = get_data_path("linear_regression_train_data.csv"); - const auto train_response_file_name = get_data_path("linear_regression_train_responses.csv"); - const auto test_data_file_name = get_data_path("linear_regression_test_data.csv"); - const auto test_response_file_name = get_data_path("linear_regression_test_responses.csv"); + const auto train_data_file_name = get_data_path("data/linear_regression_train_data.csv"); + const auto train_response_file_name = get_data_path("data/linear_regression_train_responses.csv"); + const auto test_data_file_name = get_data_path("data/linear_regression_test_data.csv"); + const auto test_response_file_name = get_data_path("data/linear_regression_test_responses.csv"); const auto x_train = dal::read(dal::csv::data_source{ train_data_file_name }); const auto y_train = dal::read(dal::csv::data_source{ train_response_file_name }); From e786cba0e9a04abd2a2e090d1578f78a436dbe59 Mon Sep 17 00:00:00 2001 From: Khalil Asadzade Date: Sun, 29 Mar 2026 05:29:55 -0700 Subject: [PATCH 4/4] refactor: clang format --- samples/oneapi/cpp/ccl/sources/ridge_regression_distr_ccl.cpp | 3 ++- samples/oneapi/cpp/mpi/sources/ridge_regression_distr_mpi.cpp | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/samples/oneapi/cpp/ccl/sources/ridge_regression_distr_ccl.cpp b/samples/oneapi/cpp/ccl/sources/ridge_regression_distr_ccl.cpp index 7e65c75e1c9..f950c2caf15 100644 --- a/samples/oneapi/cpp/ccl/sources/ridge_regression_distr_ccl.cpp +++ b/samples/oneapi/cpp/ccl/sources/ridge_regression_distr_ccl.cpp @@ -28,7 +28,8 @@ namespace lr = dal::linear_regression; void run() { const auto train_data_file_name = get_data_path("data/linear_regression_train_data.csv"); - const auto train_response_file_name = get_data_path("data/linear_regression_train_responses.csv"); + const auto train_response_file_name = + get_data_path("data/linear_regression_train_responses.csv"); const auto test_data_file_name = get_data_path("data/linear_regression_test_data.csv"); const auto test_response_file_name = get_data_path("data/linear_regression_test_responses.csv"); diff --git a/samples/oneapi/cpp/mpi/sources/ridge_regression_distr_mpi.cpp b/samples/oneapi/cpp/mpi/sources/ridge_regression_distr_mpi.cpp index d20cc917d8a..9a1bb95031f 100644 --- a/samples/oneapi/cpp/mpi/sources/ridge_regression_distr_mpi.cpp +++ b/samples/oneapi/cpp/mpi/sources/ridge_regression_distr_mpi.cpp @@ -28,7 +28,8 @@ namespace lr = dal::linear_regression; void run() { const auto train_data_file_name = get_data_path("data/linear_regression_train_data.csv"); - const auto train_response_file_name = get_data_path("data/linear_regression_train_responses.csv"); + const auto train_response_file_name = + get_data_path("data/linear_regression_train_responses.csv"); const auto test_data_file_name = get_data_path("data/linear_regression_test_data.csv"); const auto test_response_file_name = get_data_path("data/linear_regression_test_responses.csv");