| 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> |
nothing calls this directly
no test coverage detected