@@ -43,7 +43,10 @@ template <typename vertex_t, typename edge_t>
4343rmm::device_uvector<edge_t > compute_major_degrees (
4444 raft::handle_t const & handle,
4545 std::vector<edge_t const *> const & adj_matrix_partition_offsets,
46- partition_t <vertex_t > const & partition)
46+ std::optional<std::vector<vertex_t const *>> const & adj_matrix_partition_dcs_nzd_vertices,
47+ std::optional<std::vector<vertex_t >> const & adj_matrix_partition_dcs_nzd_vertex_counts,
48+ partition_t <vertex_t > const & partition,
49+ std::optional<std::vector<vertex_t >> const & adj_matrix_partition_segment_offsets)
4750{
4851 auto & row_comm = handle.get_subcomm (cugraph::partition_2d::key_naming_t ().row_name ());
4952 auto const row_comm_rank = row_comm.get_rank ();
@@ -52,6 +55,8 @@ rmm::device_uvector<edge_t> compute_major_degrees(
5255 auto const col_comm_rank = col_comm.get_rank ();
5356 auto const col_comm_size = col_comm.get_size ();
5457
58+ auto use_dcs = adj_matrix_partition_dcs_nzd_vertices.has_value ();
59+
5560 rmm::device_uvector<edge_t > local_degrees (0 , handle.get_stream ());
5661 rmm::device_uvector<edge_t > degrees (0 , handle.get_stream ());
5762
@@ -69,11 +74,37 @@ rmm::device_uvector<edge_t> compute_major_degrees(
6974 vertex_t major_last{};
7075 std::tie (major_first, major_last) = partition.get_vertex_partition_range (vertex_partition_idx);
7176 auto p_offsets = adj_matrix_partition_offsets[i];
77+ auto major_hypersparse_first =
78+ use_dcs ? major_first + (*adj_matrix_partition_segment_offsets)
79+ [(detail::num_sparse_segments_per_vertex_partition + 2 ) * i +
80+ detail::num_sparse_segments_per_vertex_partition]
81+ : major_last;
7282 thrust::transform (rmm::exec_policy (handle.get_stream ())->on (handle.get_stream ()),
7383 thrust::make_counting_iterator (vertex_t {0 }),
74- thrust::make_counting_iterator (major_last - major_first),
75- local_degrees.data (),
84+ thrust::make_counting_iterator (major_hypersparse_first - major_first),
85+ local_degrees.begin (),
7686 [p_offsets] __device__ (auto i) { return p_offsets[i + 1 ] - p_offsets[i]; });
87+ if (use_dcs) {
88+ auto p_dcs_nzd_vertices = (*adj_matrix_partition_dcs_nzd_vertices)[i];
89+ auto dcs_nzd_vertex_count = (*adj_matrix_partition_dcs_nzd_vertex_counts)[i];
90+ thrust::fill (rmm::exec_policy (handle.get_stream ())->on (handle.get_stream ()),
91+ local_degrees.begin () + (major_hypersparse_first - major_first),
92+ local_degrees.begin () + (major_last - major_first),
93+ edge_t {0 });
94+ thrust::for_each (rmm::exec_policy (handle.get_stream ())->on (handle.get_stream ()),
95+ thrust::make_counting_iterator (vertex_t {0 }),
96+ thrust::make_counting_iterator (dcs_nzd_vertex_count),
97+ [p_offsets,
98+ p_dcs_nzd_vertices,
99+ major_first,
100+ major_hypersparse_first,
101+ local_degrees = local_degrees.data ()] __device__ (auto i) {
102+ auto d = p_offsets[(major_hypersparse_first - major_first) + i + 1 ] -
103+ p_offsets[(major_hypersparse_first - major_first) + i];
104+ auto v = p_dcs_nzd_vertices[i];
105+ local_degrees[v - major_first] = d;
106+ });
107+ }
77108 col_comm.reduce (local_degrees.data (),
78109 i == col_comm_rank ? degrees.data () : static_cast <edge_t *>(nullptr ),
79110 static_cast <size_t >(major_last - major_first),
@@ -85,23 +116,6 @@ rmm::device_uvector<edge_t> compute_major_degrees(
85116 return degrees;
86117}
87118
88- // compute the numbers of nonzeros in rows (of the graph adjacency matrix, if store_transposed =
89- // false) or columns (of the graph adjacency matrix, if store_transposed = true)
90- template <typename vertex_t , typename edge_t >
91- rmm::device_uvector<edge_t > compute_major_degrees (
92- raft::handle_t const & handle,
93- std::vector<rmm::device_uvector<edge_t >> const & adj_matrix_partition_offsets,
94- partition_t <vertex_t > const & partition)
95- {
96- // we can avoid creating this temporary with "if constexpr" supported from C++17
97- std::vector<edge_t const *> tmp_offsets (adj_matrix_partition_offsets.size (), nullptr );
98- std::transform (adj_matrix_partition_offsets.begin (),
99- adj_matrix_partition_offsets.end (),
100- tmp_offsets.begin (),
101- [](auto const & offsets) { return offsets.data (); });
102- return compute_major_degrees (handle, tmp_offsets, partition);
103- }
104-
105119// compute the numbers of nonzeros in rows (of the graph adjacency matrix, if store_transposed =
106120// false) or columns (of the graph adjacency matrix, if store_transposed = true)
107121template <typename vertex_t , typename edge_t >
@@ -117,13 +131,6 @@ rmm::device_uvector<edge_t> compute_major_degrees(raft::handle_t const& handle,
117131 return degrees;
118132}
119133
120- template <typename vertex_t , typename edge_t >
121- struct degree_from_offsets_t {
122- edge_t const * offsets{nullptr };
123-
124- __device__ edge_t operator ()(vertex_t v) { return offsets[v + 1 ] - offsets[v]; }
125- };
126-
127134template <typename vertex_t >
128135struct compute_gpu_id_from_vertex_t {
129136 int comm_size{0 };
0 commit comments