Esempio n. 1
0
static int reduce_partitions(Job* job, CrosspointsFile* crosspoints) {
    /*int i0, j0, i1, j1, start_type, prev_type, prev_score;

    int partition_id = 0;
    i1 = job->crosspoints[partition_id].i;
    j1 = job->crosspoints[partition_id].j;
    prev_type = job->crosspoints[partition_id].type;
    prev_score = job->crosspoints[partition_id].score;*/

    static pthread_t thread[NUM_THREADS];
    static split_args_t args[NUM_THREADS];
    crosspoint_t *new_partitions = (crosspoint_t *)malloc(crosspoints->size()*sizeof(crosspoint_t));

    int num_threads = NUM_THREADS;
    if (num_threads >= crosspoints->size()-1) {
    	num_threads = crosspoints->size()-1;
    }

    for (int i=0; i<num_threads; i++) {
        args[i].job = job;
        args[i].crosspoints = crosspoints;
        args[i].out_pos = new_partitions;
        args[i].partition1 = (crosspoints->size()-1)*(i+1)/num_threads;
        if (i==0) {
            args[0].partition0 = 0;
        } else {
            args[i].partition0 = args[i-1].partition1;
        }
        printf("Thread %d [%d..%d] (%d)\n", i, args[i].partition0, args[i].partition1, crosspoints->size());
    }
    //args[num_threads-1].partition1 = crosspoints->size()-1;

    for (int i=0; i<num_threads; i++) {
        //printf("%d: %d-%d  (%d)\n", i, args[i].partition0, args[i].partition1, job->partitions_count);
        create_split_thread(&args[i], &thread[i]);
    }
    for (int i=0; i<num_threads; i++) {
        int rc = pthread_join(thread[i], NULL);
        if (rc) {
            printf("ERROR; return code from pthread_join() is %d\n", rc);
            exit(-1);
        }
    }
    int has_new_partitions = merge_partitions(crosspoints, new_partitions);
    free(new_partitions);
    return has_new_partitions;
}
Esempio n. 2
0
double_struct *amerge(cog *c, long low, long high) {
  double_struct *ret;
  if(c->type == COG_CONCAT) {
    return merge_partitions(c, low, high);
  } else if(c->type == COG_BTREE) {
    if(high <= c->data.btree.sep) {
      ret = amerge(c->data.btree.lhs, low, high);
      if(ret->cog != c->data.btree.lhs) {
        ret->cog = make_btree(ret->cog, c->data.btree.rhs, c->data.btree.sep);
      } else {
        ret->cog = c;
      }
    } else if(low >= c->data.btree.sep) {
      ret = amerge(c->data.btree.rhs, low, high);
      if(ret->cog != c->data.btree.rhs) {
        ret->cog = make_btree(c->data.btree.lhs, ret->cog, c->data.btree.sep);
      } else {
        ret->cog = c;
      }
    } else {
      ret = amerge(c->data.btree.lhs, low, c->data.btree.sep);
      double_struct *ret2 =  amerge(c->data.btree.rhs, c->data.btree.sep, high);
      if(ret->cog != c->data.btree.lhs || ret2->cog != c->data.btree.rhs) {
        ret->cog = make_btree(ret->cog, ret2->cog, c->data.btree.sep);
      } else {
        ret->cog = c;
      }
      ret->iter = iter_concat(ret->iter, ret2->iter);
      free(ret2);
    }
   
    if(c->type == COG_BTREE) {
      if(c != ret->cog)
        free(c);
    } 
    return ret;
  } else if(c->type == COG_SORTEDARRAY) {
    ret = create_double_struct();
    ret->iter = scan(c, low, high);
    ret->cog = c;
    return ret;
  } else {
    return amerge(partition_cog(c), low, high);
  }
}