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

Method ForEachEdgeWarp

grape/cuda/parallel/parallel_engine.h:1276–1307  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1274 template <typename FRAG_T, typename WORK_SOURCE_T, typename ASSIGN_OP,
1275 typename EDGE_OP, EdgeDirection ed>
1276 inline void ForEachEdgeWarp(const Stream& stream, const FRAG_T& dev_frag,
1277 const WORK_SOURCE_T& ws, ASSIGN_OP assign_op,
1278 EDGE_OP op) {
1279 int grid_size, block_size;
1280 auto size = ws.size();
1281 if (size == 0) {
1282 return;
1283 }
1284 auto calc_shmem_size = [] DEV_HOST(int block_size) -> int {
1285 using vid_t = typename FRAG_T::vid_t;
1286 using vertex_t = typename FRAG_T::vertex_t;
1287 using nbr_t = typename FRAG_T::nbr_t;
1288 using metadata_t = typename std::result_of<ASSIGN_OP&(vertex_t&)>::type;
1289
1290 int warp_size = 32;
1291 auto n_warp = (block_size + warp_size - 1) / warp_size;
1292
1293 auto smem_size = block_size * (sizeof(VertexMetadata<vid_t, metadata_t>) +
1294 sizeof(const nbr_t*)) +
1295 n_warp * warp_size * sizeof(vid_t);
1296 return smem_size;
1297 };
1298
1299 auto lb_wrapper = [=] __device__() {
1300 LBWARP<FRAG_T, WORK_SOURCE_T, ASSIGN_OP, EDGE_OP, ed>(dev_frag, ws,
1301 assign_op, op);
1302 }; // NOLINT
1303
1304 KernelSizing(grid_size, block_size, size);
1305 KernelWrapper<<<grid_size, block_size, calc_shmem_size(block_size),
1306 stream.cuda_stream()>>>(lb_wrapper);
1307 }
1308
1309 template <typename FRAG_T, typename WORK_SOURCE_T, typename ASSIGN_OP,
1310 typename EDGE_OP, EdgeDirection ed>

Callers

nothing calls this directly

Calls 3

KernelSizingFunction · 0.85
cuda_streamMethod · 0.80
sizeMethod · 0.45

Tested by

no test coverage detected