コード例 #1
0
ファイル: pqsort.c プロジェクト: codenet/pqsort
int *pqsort(int* input, int num_elements, int num_threads)
{
	if(num_threads*num_threads*CACHE_LINE_SIZE > num_elements){
		num_threads = (int)(sqrt(num_elements/CACHE_LINE_SIZE));
	}
	int power_of=1;
	while(power_of < num_threads){
		power_of *= 2;
	}
	num_threads = power_of;
	if(num_threads == 1){
		qsort(input , num_elements, sizeof(int), compare);
		return input;
	}

	// YOUR CODE GOES HERE
	long i;
	sort_data *sort_data_array = (sort_data*)malloc(num_threads*sizeof(sort_data));
	pthread_t *thread_id = (pthread_t*)malloc(num_threads*sizeof(pthread_t));

	all_pivot_data = (pivot_data*)aligned_malloc(num_threads*sizeof(pivot_data));
	//all_pivot_data = (pivot_data*)malloc(num_threads*sizeof(pivot_data));

	/* MAX_THREADS = 1;
	while( MAX_THREADS < num_threads ){
		MAX_THREADS = MAX_THREADS << 1;
	}
	printf("MAX_THREADS %d\n", MAX_THREADS);*/
	//barr = (barrier_node*)malloc(MAX_THREADS*sizeof(barrier_node));
	//barr = (barrier_node*)aligned_malloc(num_threads*sizeof(barrier_node));

	barr = (barrier_node*)malloc(num_threads*sizeof(barrier_node));
	ps = (prefix_sum_node*)aligned_malloc(num_threads*sizeof(prefix_sum_node));
	mylib_init_prefix_sum(ps, num_threads, all_lengths);

	final_pivots = (int*)malloc((num_threads-1)*sizeof(int));
	partitions = (partition_data*)aligned_malloc(num_threads*sizeof(partition_data));
	for(i=0; i<num_threads; i++){
		partitions[i].id = i;
	}

	mylib_init_barrier (barr, num_threads);
	output = (int*)aligned_malloc(num_elements*sizeof(int));

	// Divide input into num_threads chunks
	divide(input, num_elements, num_threads, sort_data_array);

	// create threads for locally sorting the partitions
	for(i=0; i<num_threads; i++){
		pthread_create(&thread_id[i], NULL, run_threads, sort_data_array+i);
		//printf("i %ld\n", thread_id[i]);
	}

	for(i=0; i<num_threads; i++){
		pthread_join(thread_id[i], NULL);
	}

	return output; //return appropriately
}
コード例 #2
0
/* ========== MAIN ========== */
int main(int argc, char* argv[]) {
	/* Print out starting time */
	double start = when();
	printf("Starting time: %f\n", start);

	/* Create thread count */
	int nthreads = atoi(argv[1]);

	/* Create plate */
	main_plate = createPlate();
	main_prev_plate = createPlate();
	main_locked_cells = createCharPlate(); // bool array of locked cells

	/* Init barriers and mutex */
	pthread_mutex_init(&finished_count, NULL);
	barr = (barrier_node*)malloc(sizeof(barrier_node));
	mylib_init_barrier(barr, nthreads);

	/* Init main plate and make a duplicate copy */
	initPlate(main_plate, main_prev_plate);

	/* Start updating */
	startUpdate(nthreads);//, barr);

	/* Report time and cleanup */
	double end = when();
	printf("\nEnding time: %f\n", end);
	printf("Total execution time: %f\n", end - start);
	printf("Number of iterations: %d\n\n", iterations);

	/* Destroy mutex and barriers */
	pthread_mutex_destroy(&finished_count);
	mylib_destroy_barrier(barr);

	/* free memory */
	printf("Cleanup\n");
	free(barr);
	cleanupFloat(main_plate);
	cleanupFloat(main_prev_plate);
	cleanupChar(main_locked_cells);

	return EXIT_SUCCESS;
}