// 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); }
// Creates a trace local variable tlv_id create_trace_local(trace_initializer initializer) { if (global_table.next_id == -1) { fprintf(stderr, "Error: No more room for another trace local variable\n"); exit(1); } pthread_mutex_lock(&global_table.lock); tlv_id retval = global_table.next_id; global_table.gtrace_info[retval].occupied = true; do { global_table.next_id = (global_table.next_id + 1) % MAX_TL_VARS; if (!global_table.gtrace_info[global_table.next_id].occupied) { break; } } while (retval != global_table.next_id); if (retval == global_table.next_id) { global_table.next_id = -1; } trace_collection_reducer r = CILK_C_INIT_REDUCER(trace_collection, tc_reduce, tc_identity, tc_destroy, {0}/*(trace_collection) { .head = NULL, .tail = NULL, .length = 0}*/); CILK_C_REGISTER_REDUCER(r); global_table.gtrace_info[retval].reducer = r; global_table.gtrace_info[retval].initializer = initializer; pthread_mutex_unlock(&global_table.lock); return retval; }