Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add sparse matrix usage to example #13

Merged
merged 8 commits into from
Jan 20, 2025
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions resources/example.mtx
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
%%MatrixMarket matrix coordinate real general
25 25 49
1 1 1.000e+00
2 2 2.000e+00
3 3 3.000e+00
4 4 4.000e+00
5 5 5.000e+00
6 6 6.000e+00
7 7 7.000e+00
8 8 8.000e+00
9 9 9.000e+00
10 10 1.000e+01
11 11 2.000e+01
12 12 3.000e+01
13 13 4.000e+01
14 14 5.000e+01
15 15 6.000e+01
16 16 7.000e+01
17 17 8.000e+01
18 18 8.000e+01
19 19 9.000e+01
20 20 1.000e+02
21 21 2.000e+02
22 22 2.000e+02
23 23 3.000e+02
24 24 4.000e+02
25 25 5.000e+02
1 2 1.000e+00
2 3 2.000e+00
3 4 3.000e+00
4 5 4.000e+00
5 6 5.000e+00
6 7 6.000e+00
7 8 7.000e+00
8 9 8.000e+00
9 10 9.000e+00
10 11 1.000e+01
11 12 2.000e+01
12 13 3.000e+01
13 14 4.000e+01
14 15 5.000e+01
15 16 6.000e+01
16 17 7.000e+01
17 18 8.000e+01
18 19 9.000e+01
19 20 1.000e+01
20 21 2.000e+01
21 22 3.000e+01
22 23 4.000e+01
23 24 5.000e+01
24 25 6.000e+01
2 changes: 2 additions & 0 deletions scripts/build_run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,5 @@ mpirun -n 3 ./build/src/example3
mpirun -n 3 ./build/src/example4
mpirun -n 3 ./build/src/example5
mpirun -n 3 ./build/src/example6
mpirun -n 3 ./build/src/example7
mpirun -n 3 ./build/src/example8
10 changes: 10 additions & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,13 @@ add_executable(example6 example6.cpp)

target_compile_definitions(example6 INTERFACE DR_FORMAT)
target_link_libraries(example6 DR::mpi fmt::fmt)

add_executable(example7 example7.cpp)

target_compile_definitions(example7 INTERFACE DR_FORMAT)
target_link_libraries(example7 DR::mpi fmt::fmt)

add_executable(example8 example8.cpp)

target_compile_definitions(example8 INTERFACE DR_FORMAT)
target_link_libraries(example8 DR::mpi fmt::fmt)
56 changes: 56 additions & 0 deletions src/example7.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
// SPDX-FileCopyrightText: Intel Corporation
//
// SPDX-License-Identifier: BSD-3-Clause

#include <dr/mp.hpp>
#include <fmt/core.h>

/* Sparse band matrix vector multiplication */
int main() {
dr::mp::init(sycl::default_selector_v);
using I = long;
using V = double;

dr::views::csr_matrix_view<V, I> local_data;
auto root = 0;
if (root == dr::mp::rank()) {
auto source = "./resources/example.mtx";
local_data = dr::read_csr<double, long>(source);
}

dr::mp::distributed_sparse_matrix<
V, I, dr::mp::MpiBackend,
dr::mp::csr_eq_distribution<V, I, dr::mp::MpiBackend>>
matrix(local_data, root);

std::vector<double> b;
b.reserve(matrix.shape().second);
std::vector<double> res(matrix.shape().first);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please move "res" declaration just before its first usage (calling gemv)

for (auto i = 0; i < matrix.shape().second; i++) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can we use std::iota?

b.push_back(i);
}

dr::mp::broadcasted_vector<double> broadcasted_b;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In lines 26-31 all ranks already computed their vector B

What is the step with "broadcasted_vector" for?

broadcasted_b.broadcast_data(matrix.shape().second, 0, b,
dr::mp::default_comm());

gemv(root, res, matrix, broadcasted_b);

if (root == dr::mp::rank()) {
fmt::print("Matrix imported from {}\n", "./resources/example.mtx");
fmt::print("Input: ");
for (auto x : b) {
fmt::print("{} ", x);
}
fmt::print("\n");
fmt::print("Matrix vector multiplication res: ");
for (auto x : res) {
fmt::print("{} ", x);
}
fmt::print("\n");
}

dr::mp::finalize();

return 0;
}
79 changes: 79 additions & 0 deletions src/example8.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
// SPDX-FileCopyrightText: Intel Corporation
//
// SPDX-License-Identifier: BSD-3-Clause

#include <dr/mp.hpp>
#include <fmt/core.h>
#include <random>

/* Sparse band matrix vector multiplication */
int main() {
dr::mp::init(sycl::default_selector_v);
using I = long;
using V = double;
dr::views::csr_matrix_view<V, I> local_data;
auto root = 0;
if (root == dr::mp::rank()) {
auto size = 10;
auto nnz = 20;
auto colInd = new I[nnz];
auto rowInd = new I[size + 1];
auto values = new V[nnz];
std::uniform_real_distribution<double> unif(0, 1);
std::default_random_engine re;
for (auto i = 0; i <= size; i++) {
rowInd[i] = i * 2; // two elements per row
}
for (auto i = 0; i < nnz; i++) {
colInd[i] =
(i % 2) * (std::max(i / 2, 1)); // column on 0 and diagonal (with
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can we draw that matrix in a comment?
something like this (not sure if this is your matrix shape, just an example)

// X X X ...     X
// 0 X 0 ...     0
// 0 0 X 0 ... 0
// 0 0 ...       X

// additional entry in first row)
values[i] = unif(re);
}

local_data = dr::views::csr_matrix_view<V, I>(values, rowInd, colInd,
{size, size}, nnz, root);
}

dr::mp::distributed_sparse_matrix<
V, I, dr::mp::MpiBackend,
dr::mp::csr_eq_distribution<V, I, dr::mp::MpiBackend>>
matrix(local_data, root);

std::vector<double> b;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same comments an in the first example in this code

b.reserve(matrix.shape().second);
std::vector<double> res(matrix.shape().first);
for (auto i = 0; i < matrix.shape().second; i++) {
b.push_back(i);
}

dr::mp::broadcasted_vector<double> broadcasted_b;
broadcasted_b.broadcast_data(matrix.shape().second, 0, b,
dr::mp::default_comm());

gemv(root, res, matrix, broadcasted_b);

if (root == dr::mp::rank()) {
fmt::print("Matrix with {} x {} and number of non-zero entries equal to {} "
"and entries:\n",
matrix.shape().first, matrix.shape().second, matrix.size());
for (auto [i, v] : matrix) {
auto [n, m] = i;
fmt::print("Matrix entry <{}, {}, {}>\n", n, m, v);
}
fmt::print("Input: ");
for (auto x : b) {
fmt::print("{} ", x);
}
fmt::print("\n");
fmt::print("Matrix vector multiplication res: ");
for (auto x : res) {
fmt::print("{} ", x);
}
fmt::print("\n");
}

dr::mp::finalize();

return 0;
}
Loading