// Notes: // - Each task receives distinct copy of parent // - Copy of child is shallow, be careful with `state` member static long visit(node_t parent) { node_t child; uint64_t *child_descendants = calloc(sizeof(long), parent.num_children); CILK_C_REDUCER_OPADD(num_descendants, ulong, 0); uint64_t tmp; // Spawn children, if any for (int i = 0; i < parent.num_children; i++) { child.height = parent.height + 1; for (int j = 0; j < num_samples; j++) { rng_spawn(parent.state.state, child.state.state, i); } child.num_children = calc_num_children(&child); child_descendants[i] = _Cilk_spawn visit(child); } _Cilk_sync; CILK_C_REGISTER_REDUCER(num_descendants); _Cilk_for(int i = 0; i < parent.num_children; i++) { REDUCER_VIEW(num_descendants) += child_descendants[i]; } tmp = 1 + REDUCER_VIEW(num_descendants); CILK_C_UNREGISTER_REDUCER(num_descendants); return tmp; }
/////////////////////////////////////////////////////////////////////// // Update the lines in the collision world void CollisionWorld_updateLines(CollisionWorld* collisionWorld) { CILK_C_REDUCER_OPADD(numCollisionsReducer, int, 0); CILK_C_REGISTER_REDUCER(numCollisionsReducer); CollisionWorld_detectIntersection(collisionWorld, &numCollisionsReducer); CollisionWorld_updatePosition(collisionWorld); CollisionWorld_lineWallCollision(collisionWorld, &numCollisionsReducer); CILK_C_UNREGISTER_REDUCER(numCollisionsReducer); }
// Removes a trace local variable so we don't have to keep track of it anymore void delete_trace_local(tlv_id id) { pthread_mutex_lock(&global_table.lock); CILK_C_UNREGISTER_REDUCER(global_table.gtrace_info[id].reducer); global_table.gtrace_info[id].occupied = false; pthread_mutex_unlock(&global_table.lock); }