MCPcopy Create free account
hub / github.com/alibaba/libgrape-lite / ForEachEdgeCM

Method ForEachEdgeCM

grape/cuda/parallel/parallel_engine.h:1186–1220  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1184 template <typename FRAG_T, typename WORK_SOURCE_T, typename ASSIGN_OP,
1185 typename EDGE_OP, EdgeDirection ed>
1186 inline void ForEachEdgeCM(const Stream& stream, const FRAG_T& dev_frag,
1187 const WORK_SOURCE_T& ws, ASSIGN_OP assign_op,
1188 EDGE_OP op) {
1189 using vid_t = typename FRAG_T::vid_t;
1190 using vertex_t = typename FRAG_T::vertex_t;
1191
1192 int grid_size, block_size;
1193 size_t size = ws.size();
1194 if (size == 0) {
1195 return;
1196 }
1197
1198 __calc_prefix_sum__<FRAG_T, WORK_SOURCE_T, ed>(stream, dev_frag, ws);
1199
1200 auto calc_shmem_size = [] DEV_HOST(int block_size) -> int {
1201 using vid_t = typename FRAG_T::vid_t;
1202 using vertex_t = typename FRAG_T::vertex_t;
1203 using nbr_t = typename FRAG_T::nbr_t;
1204 using metadata_t = typename std::result_of<ASSIGN_OP&(vertex_t&)>::type;
1205
1206 return block_size * (sizeof(VertexMetadata<vid_t, metadata_t>) +
1207 sizeof(const nbr_t*) + sizeof(vid_t));
1208 };
1209 ArrayView<size_t> row_offset_view(
1210 thrust::raw_pointer_cast(prefix_sum_.data()), size);
1211
1212 auto lb_wrapper = [=] __device__() {
1213 LBCM<FRAG_T, WORK_SOURCE_T, ASSIGN_OP, EDGE_OP, ed>(
1214 dev_frag, ws, row_offset_view, assign_op, op);
1215 }; // NOLINT
1216
1217 KernelSizing(grid_size, block_size, ws.size());
1218 KernelWrapper<<<grid_size, block_size, calc_shmem_size(block_size),
1219 stream.cuda_stream()>>>(lb_wrapper);
1220 }
1221
1222 template <typename FRAG_T, typename WORK_SOURCE_T, typename ASSIGN_OP,
1223 typename EDGE_OP, EdgeDirection ed>

Callers

nothing calls this directly

Calls 4

KernelSizingFunction · 0.85
cuda_streamMethod · 0.80
sizeMethod · 0.45
dataMethod · 0.45

Tested by

no test coverage detected