Distributed SPMD model
Refer to Developer Guide: SPMD.
Programming interface
All types and functions in this section are declared in the
oneapi::dal::spmd::preview
namespace and are available via inclusion of the
header file from specified backend.SPMD distributed model consists of the following components:
- Additionaltrain,infer, andcomputemethods that acceptcommunicatorobject as the first parameter. Those methods are expected to be called on all ranks to start distributed simulations.
- The communicator class that contains methods to perform collective operations among all ranks.
- Free functions to create a communicator using a specified communicator backend. Available backends arecclandmpi.
Usage example
The following listings provide a brief introduction on how to create a particular communicator.
MPI backend
#ifndef ONEDAL_DATA_PARALLEL
#define ONEDAL_DATA_PARALLEL
#endif
#include "oneapi/dal/algo/kmeans.hpp"
#include "oneapi/dal/spmd/mpi/communicator.hpp"
kmeans::model<> run_training(const table& data,
const table& initial_centroids) {
const auto kmeans_desc = kmeans::descriptor<float>{}
.set_cluster_count(10)
.set_max_iteration_count(50)
.set_accuracy_threshold(1e-4);
auto comm = dal::preview::spmd::make_communicator<dal::preview::spmd::backend::mpi>(queue);
auto rank_id = comm.get_rank();
const auto result_train = dal::preview::train(comm, kmeans_desc, local_input);
if(rank_id == 0) {
print_table("centroids", result.get_model().get_centroids());
print_value("objective", result.get_objective_function_value());
}
return result.get_model();
}
CCL backend
#ifndef ONEDAL_DATA_PARALLEL
#define ONEDAL_DATA_PARALLEL
#endif
#include "oneapi/dal/algo/kmeans.hpp"
#include "oneapi/dal/spmd/ccl/communicator.hpp"
kmeans::model<> run_training(const table& data,
const table& initial_centroids) {
const auto kmeans_desc = kmeans::descriptor<float>{}
.set_cluster_count(10)
.set_max_iteration_count(50)
.set_accuracy_threshold(1e-4);
auto comm = dal::preview::spmd::make_communicator<dal::preview::spmd::backend::ccl>(queue);
auto rank_id = comm.get_rank();
const auto result_train = dal::preview::train(comm, kmeans_desc, local_input);
if(rank_id == 0) {
print_table("centroids", result.get_model().get_centroids());
print_value("objective", result.get_objective_function_value());
}
return result.get_model();
}