Exemplo n.º 1
0
// 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);
}
Exemplo n.º 3
0
// 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;
}