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; }
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); } }