Esempio n. 1
0
int main(int ac, char** av)
{
	int		print = 0;
	int		n = 2000000;
	int		i;
	double*		a;
	double		start, end;

	if (ac > 1)
		sscanf(av[1], "%d", &n);

	srand(getpid());

	a = malloc(n * sizeof (double));
	for (i = 0; i < n; i++)		
		a[i] = rand() % n;

	start = sec();

#ifdef PARALLEL
	double *p1, *p2, *p3;
	partial_sort(a, &p2, n);
	partial_sort(a, &p1, (p2 - a));
	partial_sort(p2, &p3, (a + n - p2));

	double dn = (double) n;
	double s1 = 100 * (p1 - a) / dn, s2 = 100 * (p2 - p1) / dn,
		s3 = 100 * (p3 - p2) / dn, s4 = 100 * (a + n - p3) / dn;
	printf("Load:\ts1: %1.2lf%%, s2: %1.2lf%%, s3: %1.2lf%%, s4: %1.2lf%%.\n",
		s1, s2, s3, s4);

	pthread_t* threads = malloc(NUM_THREADS * sizeof (pthread_t));
	data_t* args = malloc(NUM_THREADS * sizeof (data_t));
/*	
	print_array(a, p1 - a);
	print_array(p1, p2 - p1);
	print_array(p2, p3 - p2);
	print_array(p3, a + n - p3);
*/
	par_sort(&threads[0], &args[0], a, p1 - a, sizeof (double), cmp, 0);		// a -> p2
	par_sort(&threads[1], &args[1], p1, p2 - p1, sizeof(double), cmp, 1);		// p2 -> p1
	par_sort(&threads[2], &args[2], p2, p3 - p2, sizeof (double), cmp, 2);		// p1 -> p3
	par_sort(&threads[3], &args[3], p3, a + n - p3, sizeof (double), cmp, 3);	// p3 -> &a[n - 1]

	for (i = 0; i < NUM_THREADS; ++i)
		pthread_join(threads[i], NULL);
#else
	qsort(a, n, sizeof a[0], cmp);
#endif
	for (i = 0; i < n - 1; ++i)
		assert(a[i] <= a[i + 1]);

	end = sec();

	printf("%1.2f ms\n", end - start);

	free(a);

	return 0;
}
Esempio n. 2
0
void sorting(TYPE* buffer, int size) {
  sort_data_t* buf = (sort_data_t*) malloc(sizeof(sort_data_t)); 
  buf->buffer = buffer;
  buf->left = 0;
  buf->right = size - 1; 
  par_sort(buf);
}
Esempio n. 3
0
void par_sort(
	void*		base,	// Array to sort.
	size_t		n,	// Number of elements in base.
	size_t		s,	// Size of each element
	int		(*cmp)(const void*, const void*)) // Behaves like strcmp
{

	int split = 0;
	//lock and handle mutex stuff

	pthread_mutex_lock(&thread_sum);
	//change n in if to higher number to potentially  decrease load balancing problem
	if(n_thread<NBR_THREADS && n > 1 ){
		split = 1;
		n_thread++;
	}
	//do stuff with mutex
	//unlock mutex stuff
	pthread_mutex_unlock(&thread_sum);


	if(split){

		pthread_t t;
		size_t left_size = partition(base, n);
		size_t right_size  = n - left_size;
		void* new_base = ((double*)(base)) + ((left_size));
		arg_struct_t arg = {new_base,right_size,s,cmp};
		pthread_create(&t,NULL,thread_sort,&arg);
		par_sort(base,left_size,s,cmp);
		pthread_join(t,NULL);

	}

	/*pthread_t t1,t2;
	if(i+2<NBR_THREADS)
	{
		arg_struct_t arg1 = {base, n/2, s, i+1, cmp};
		pthread_create(&t1,NULL,thread_sort,&arg1);
		arg_struct_t arg2 = {(char*)(base)+(s*(n/2)), n/2, s, i+2,cmp};
		pthread_create(&t2,NULL,thread_sort,&arg2);
		pthread_join(t1,NULL);
		pthread_join(t2,NULL);
//fixa ihop delarna
	}else	if(i+1<NBR_THREADS)
	{
		arg_struct_t arg1 = {base, n/2, s, i+1, cmp};
		pthread_create(&t1,NULL,thread_sort,&arg1);
		pthread_join(t1,NULL);
		qsort((char*)(base)+(s*(n/2)), n/2, s,cmp);
		//fixa ihop delarna
	}*/ else{
		printf("workload %zu\n", n);
		qsort(base,n,s,cmp);

	}


}
Esempio n. 4
0
void* par_sort( void* args )
{
	arg_struct arg1 = *(arg_struct*) args;
	void* base 	= 	arg1.base; 	// base pointer
	size_t n 	=	arg1.n;  	// number of elements in base
	size_t s 	= 	arg1.s; 	// size of each element
	compare cmp_func 	= arg1.cmp_func;

	int split 	= 0; //get from mutex
	pthread_mutex_lock (&thread_sum);
   	if(n_thread < limit){
   		split = 1;
   		n_thread+=1;
   	}
   	pthread_mutex_unlock (&thread_sum);

	if(split && n > 5){
		pthread_t thread;
		size_t middle = partition(base,n);
		if(middle == 0){
			arg_struct arg0 = { ((double*) base) + 1, n-1, s, cmp_func};
			par_sort(&arg0);
			return NULL;
		}
		printf("middle index is %zu of %zu ,percentage %1.2f\n", middle,n,middle*1.0 /n);

		arg_struct arg0 = { base, middle, s, cmp_func};
		arg_struct arg1 = {	((double*) base) + middle + 1 , n - middle - 1 , s, cmp_func };

		if( pthread_create( &thread, NULL, par_sort,&arg1 ) ) {
			fprintf(stderr,"Error creating thread\n");
		}
		par_sort(&arg0);
		// end thread run with pthread_join
		if( pthread_join(thread,NULL) ){
			fprintf(stderr,"Error joining thread\n");
		}
		//merge result
	}else{
		printf("i sort this %zu\n",n);
		qsort(base,n,s,cmp_func);
	}

	return NULL;
}
Esempio n. 5
0
static void pragma147_omp_task_hclib_async(void *____arg) {
    pragma147_omp_task *ctx = (pragma147_omp_task *)____arg;
    hclib_start_finish();
{
              par_sort((*(ctx->buf_ptr)));
          } ;     ; hclib_end_finish();

    free(____arg);
}
Esempio n. 6
0
int main(int ac, char** av)
{
	int		n = 20000;
	int		i;
	double*		a;
#ifdef ASSERT
	double* 	b;
#endif
	double		start, end;

	if (ac > 1)
		sscanf(av[1], "%d", &n);

	srand(getpid());
	a = malloc(n * sizeof a[0]);
#ifdef ASSERT
	b = malloc(n * sizeof a[0]);
#endif
	for (i = 0; i < n; i++){
		a[i] = rand();
#ifdef ASSERT
		b[i] = a[i];
#endif
	}

	pthread_mutex_init(&thread_sum, NULL);

	arg_struct arg = {a,n,sizeof a[0],cmp};
	start = sec();

//	print(a,n);
	par_sort(&arg);

	printf("par: %1.5f s\n", (sec() - start) );
	start = sec();
#ifdef ASSERT
	qsort(b, n, sizeof a[0] , cmp);
#endif
	printf("seq: %1.5f s\n", (sec() - start) );

#ifdef ASSERT
	for(i = 0; i < n ; i++){
		if(a[i] != b[i]){
			printf("%d \n %1.2f  ",i, a[i]);
			printf("%1.2f  \n",b[i]);
		}
	}
#endif
	free(a);
	pthread_mutex_destroy(&thread_sum);
	pthread_exit(NULL);
#ifdef ASSERT
	free(b);
#endif
	return 0;
}
Esempio n. 7
0
int main(int ac, char** av)
{
	int		n = 2000000;
	int		i;
	double*		a;
	double*		b;
	double		start, end;

	pthread_mutex_init(&thread_sum, NULL);

	if (ac > 1)
		sscanf(av[1], "%d", &n);

	srand(getpid());


	a = malloc(n * sizeof a[0]);
	b = malloc(n* sizeof a[0]);
	for (i = 0; i < n; i++){
		a[i] = rand();
		b[i] = a[i];
	}

	start = sec();

	printf("runing parallell..\n");
	par_sort(a, n, sizeof a[0], cmp);


	end = sec();
	double par_time = end - start;
	start = sec();

printf("running qsort..\n");
	qsort(b,n,sizeof a[0], cmp);

	end = sec();

	printf("running assert...\n");
	for(i = 0; i<n;i++){
			assert(a[i] == b[i]);
	}

	printf("seq: %1.2f s\n", end - start);
	printf("par: %1.2f s\n",par_time);


	free(a);
	pthread_mutex_destroy(&thread_sum);
	pthread_exit(NULL);
	free(b);

	return 0;
}
Esempio n. 8
0
void par_sort(void* arg) {
  sort_data_t *in = (sort_data_t*) arg;
  TYPE* data = in->buffer;
  int left = in->left; 
  int right = in->right;

  if (right - left + 1 > HC_GRANULARITY) {
    int index = partition(data, left, right);
#pragma omp parallel 
{
#pragma omp single nowait
{
        if (left < index - 1) {
          sort_data_t* buf = (sort_data_t*) malloc(sizeof(sort_data_t)); 
          buf->buffer = data;
          buf->left = left;
          buf->right = index - 1; 
#pragma omp task 
{
              par_sort(buf);
          }
        }
        if (index < right) {
          sort_data_t* buf = (sort_data_t*) malloc(sizeof(sort_data_t)); 
          buf->buffer = data;
          buf->left = index;
          buf->right = right; 
#pragma omp task 
{
              par_sort(buf);
          }
        }
        }
    }
  }
  else {
    //  quicksort in C library
    qsort(data+left, right - left + 1, sizeof(TYPE), compare);
  }
  free(arg);
}
Esempio n. 9
0
int main(int ac, char** av)
{
	int		n = 2000000;
	int		i;
	double*		a;
	double		start, end;

	if (ac > 1)
		sscanf(av[1], "%d", &n);

	srand(getpid());

	a = malloc(n * sizeof a[0]);
	for (i = 0; i < n; i++)
		a[i] = rand();

	start = sec();

#ifdef PARALLEL
	par_sort(a, n, sizeof a[0], cmp);
#else
	qsort(a, n, sizeof a[0], cmp);
#endif

	end = sec();

	printf("%1.2f s\n", (end - start));
	for (i = 1; i < n; ++i)
	{
		if(a[i-1]>a[i])
			printf("err result\n");
	}

	free(a);

	return 0;
}
Esempio n. 10
0
void thread_sort(void *args)
{
	arg_struct_t* t = (arg_struct_t*)args;
	par_sort(t->base,t->n,t->s,t->cmp);
}