Esempio n. 1
0
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
		}
	}
}
Esempio n. 2
0
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);
	}
}
Esempio n. 3
0
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;
}