void qsort_parallel(int l,int r){ if(r>l){ int pivot=a[r],tmp; int less=l-1,more; for(more=l;more<=r;more++){ if(a[more]<=pivot){ less++; tmp=a[less]; a[less]=a[more]; a[more]=tmp; } } if((r-l)<1000){ qsort_serial(l,less-1); qsort_serial(less+1,r); } else{ #pragma omp task qsort_parallel(l,less-1); #pragma omp task qsort_parallel(less+1,r); #pragma omp taskwait } } }
void qsort_serial(int l,int r){ if(r>l){ int pivot=a[r],tmp; int less=l-1,more; for(more=l;more<=r;more++){ if(a[more]<=pivot){ less++; tmp=a[less]; a[less]=a[more]; a[more]=tmp; } } qsort_serial(l,less-1); qsort_serial(less+1,r); } }
int main(int argc, char **argv) { if (argc != 4) { fprintf(stderr, "%s <n> <input_type> <alg_type>\n", argv[0]); fprintf(stderr, "input_type 0: uniform random\n"); fprintf(stderr, " 1: already sorted\n"); fprintf(stderr, " 2: almost sorted\n"); fprintf(stderr, " 3: single unique value\n"); fprintf(stderr, " 4: sorted in reverse\n"); fprintf(stderr, "alg_type 0: use C qsort\n"); fprintf(stderr, " 1: use inline qsort\n"); exit(1); } int n; n = atoi(argv[1]); assert(n > 0); assert(n <= 1000000000); float *A; A = (float *) malloc(n * sizeof(float)); assert(A != 0); int input_type = atoi(argv[2]); assert(input_type >= 0); assert(input_type <= 4); gen_input(A, n, input_type); int alg_type = atoi(argv[3]); int num_iterations = 10; assert((alg_type == 0) || (alg_type == 1)); if (alg_type == 0) { qsort_serial(A, n, num_iterations); } else if (alg_type == 1) { inline_qsort_serial(A, n, num_iterations); } free(A); return 0; }