예제 #1
0
파일: uts_cilk.c 프로젝트: Agobin/chapel
// 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);
}
예제 #3
0
// 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);
}