Esempio n. 1
0
int run_sequential( char *dataset_file, pltb_config_t *config, model_space_t *model_space )
{
	FILE *out = DEBUG_PROCESS_STATISTICS_OPEN_OUTPUT;
	pltb_model_stat_t stats[model_space->matrix_count];

	TIME_STRUCT_INIT(timer);

	fprint_eval_header(out);

	pllAlignmentData *data = read_alignment_data(dataset_file);

	pltb_result_t result;

	for(unsigned i = 0; i < IC_MAX; i++) {
		result.ic[i] = FLT_MAX;
	}

	while (next_model(model_space)) {
		partitionList *parts = init_partitions(data, config->base_freq_kind);
		pllInstance *inst = setup_instance(model_space->matrix_repr, &config->attr_model_eval, data, parts);

		pltb_model_stat_t *stat = &stats[model_space->matrix_index];
		stat->matrix_index = model_space->matrix_index;
		TIME_START(timer);

		optimize_model_parameters(inst, parts);

		TIME_END(timer);
		stat->time_cpu  = TIME_CPU(timer);
		stat->time_real = TIME_REAL(timer);

		stat->likelihood = inst->likelihood;
		calculate_model_ICs(stat, data, inst, model_space->free_parameter_count, config);
		merge_into_result(&result, stat, model_space->matrix_index);

		fprint_eval_row(out, model_space, stat);

		pllPartitionsDestroy(inst, &parts);
		pllDestroyInstance(inst);
	}
	fprint_eval_summary(out, model_space, &stats, &result);
	DEBUG_PROCESS_STATISTICS_CLOSE_OUTPUT(out);

	evaluate_result(model_space, &result, data, config);

	pllAlignmentDataDestroy(data);
	return 0;
}
Esempio n. 2
0
void evaluate_result(model_space_t *relative_model_space, pltb_result_t *result, pllAlignmentData *data, pltb_config_t *config)
{
	pllInstance *tree;

	/* TODO: inplace modifications. ugly! */
	make_indices_absolute(relative_model_space, &result->matrix_index);

	unsigned *models  = malloc(sizeof(unsigned) * (IC_MAX + config->n_extra_models));
	unsigned n_models = prepare_unique_model_tasks(models, &result->matrix_index, config->extra_models, config->n_extra_models);

	model_space_t model_space;
	init_selection_model_space(&model_space, models, n_models);

	PRINT_TREE_SEARCH_HEADER();
	while (next_model(&model_space)) {
		PRINT_TREE_SEARCH_PRETEXT_BEGIN(model_space.matrix_repr_short);
		bool first = true;
		for (unsigned i = 0; i < IC_MAX; i++) {
			if (result->matrix_index[i] == models[model_space.matrix_index]) {
				if (first) {
					PRINT_TREE_SEARCH_PRETEXT_IC(get_IC_name_short(i));
					first = false;
				} else {
					PRINT_TREE_SEARCH_PRETEXT_IC_SEP(get_IC_name_short(i));
				}
			}
		}
		if (first) {
			PRINT_TREE_SEARCH_PRETEXT_IC("extra");
		}
		PRINT_TREE_SEARCH_PRETEXT_END();

		partitionList *parts = init_partitions(data, config->base_freq_kind);
		/* do the actual work */
		tree = setup_instance(model_space.matrix_repr, &config->attr_tree_search, data, parts);
		tree_search(tree, parts);
		prepare_tree_string(tree, parts);
		PRINT_TREE(tree->tree_string);
		pllPartitionsDestroy(tree, &parts);
		pllDestroyInstance(tree);
	}

	destroy_model_space(&model_space);
}
Esempio n. 3
0
File: sos.c Progetto: ldfaiztt/MSCS
SOS()
{
        readyq = new_dllist();
        mt_init();
        writeok     = mt_sem_create(0);
        writers     = mt_sem_create(1);
        readers     = mt_sem_create(1);
        nelem       = mt_sem_create(0);
        consoleWait = mt_sem_create(0);
        
        wr_iobuf = make_io_buffer(1);
        cr_iobuf = make_io_buffer(256);
        crb_no_chars = 0;
        crb_end = 0; 
        crb_begin = 0;

        curpid = -1;
//      pids = make_rb();
        init_partitions(); 
        DEBUG('e', "pagesize: %d\n", PageSize);

	jrbTree = make_jrb();		// Step 20

	init = new_pcb();		// Step 22
	init->pid = get_new_pid();	// Step 22
   
        cread_vnode = new_vnode();
        cread_vnode->iobuf =cr_iobuf;
        cr_iobuf->nwriters = 1;
        cwrite_vnode = new_vnode();               
        cwrite_vnode->iobuf = wr_iobuf;
        wr_iobuf->nreaders = 1;
        
        start_timer(10);	
	bzero(main_memory, MemorySize);
        mt_create(read_console_io, (void *)cr_iobuf);
        mt_create(write_console_io, (void *)wr_iobuf);
        //mt_create(read_console, NULL);
        mt_create(initialize_user_process, (void *)Argv);
        schedule();
}
Esempio n. 4
0
int main( int argc, char **argv ) {
    num_particles = read_int( argc, argv, "-n", 1000 );
    char *savename = read_string( argc, argv, "-o", NULL );
    MPI_Init( &argc, &argv );
    MPI_Comm_size( MPI_COMM_WORLD, &num_procs );
    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
    fsave = savename && rank == 0 ? fopen( savename, "w" ) : NULL;
    particles = (particle_t*) malloc( num_particles * sizeof(particle_t) );
    MPI_Type_contiguous( 7, MPI_DOUBLE, &PARTICLE );
    MPI_Type_commit( &PARTICLE );
    set_size( num_particles );

    init_vars();
    init_partitions();

    if( rank == 0 ) {
        init_particles( num_particles, particles );
    }
    MPI_Bcast(particles, num_particles, PARTICLE, 0, MPI_COMM_WORLD);
    partition_particles();
    init_grid();

    double simulation_time = read_timer();

    for( int step = 0; step < NSTEPS; step++ ) {
        if (rank == 0) {
            right_fringe();
            MPI_Isend(right_sending_buffer, num_sending_right, PARTICLE, rank+1, 0, MPI_COMM_WORLD, &send_right_req);
            MPI_Irecv(right_receiving_buffer, num_my_particles, PARTICLE, rank+1, MPI_ANY_TAG, MPI_COMM_WORLD, &recv_right_req);
            MPI_Wait(&send_right_req, &send_right_stat);
            MPI_Wait(&recv_right_req, &recv_right_stat);
            MPI_Get_count(&recv_right_stat, PARTICLE, &recvd_right_count);
            num_augmented_particles = num_my_particles + recvd_right_count;
            memcpy(my_particles + num_my_particles, right_receiving_buffer, recvd_right_count * sizeof(particle_t));
        } else if (rank == (num_procs-1)) {
            left_fringe();
            MPI_Isend(left_sending_buffer, num_sending_left, PARTICLE, rank-1, 0, MPI_COMM_WORLD, &send_left_req);
            MPI_Irecv(left_receiving_buffer, num_my_particles, PARTICLE, rank-1, MPI_ANY_TAG, MPI_COMM_WORLD, &recv_left_req);
            MPI_Wait(&send_left_req, &send_left_stat);
            MPI_Wait(&recv_left_req, &recv_left_stat);
            MPI_Get_count(&recv_left_stat, PARTICLE, &recvd_left_count);
            num_augmented_particles = num_my_particles + recvd_left_count;
            memcpy(my_particles + num_my_particles, left_receiving_buffer, recvd_left_count * sizeof(particle_t));
        } else {
            left_fringe();
            right_fringe();
            MPI_Isend(left_sending_buffer, num_sending_left, PARTICLE, rank-1, 0, MPI_COMM_WORLD, &send_left_req);
            MPI_Irecv(left_receiving_buffer, num_my_particles, PARTICLE, rank-1, MPI_ANY_TAG, MPI_COMM_WORLD, &recv_left_req);
            MPI_Isend(right_sending_buffer, num_sending_right, PARTICLE, rank+1, 0, MPI_COMM_WORLD, &send_right_req);
            MPI_Irecv(right_receiving_buffer, num_my_particles, PARTICLE, rank+1, MPI_ANY_TAG, MPI_COMM_WORLD, &recv_right_req);
            MPI_Wait(&send_left_req, &send_left_stat);
            MPI_Wait(&send_right_req, &send_right_stat);
            MPI_Wait(&recv_left_req, &recv_left_stat);
            MPI_Wait(&recv_right_req, &recv_right_stat);
            MPI_Get_count(&recv_left_stat, PARTICLE, &recvd_left_count);
            MPI_Get_count(&recv_right_stat, PARTICLE, &recvd_right_count);
            num_augmented_particles = num_my_particles + recvd_left_count + recvd_right_count;
            memcpy(my_particles + num_my_particles, left_receiving_buffer, recvd_left_count * sizeof(particle_t));
            memcpy(my_particles + num_my_particles + recvd_left_count, right_receiving_buffer, recvd_right_count * sizeof(particle_t));
        }

        populate_grid();
        time_step();

        num_sending_left = 0;
        num_sending_right = 0;
        int num_remaining_particles = 0;
        for ( int i = 0; i < num_my_particles; i++ ) {
            if (rank != 0 && my_particles[i].x <= partition_offsets[rank]) {
                left_sending_buffer[num_sending_left++] = my_particles[i];
            } else if (rank != (num_procs-1) && my_particles[i].x > partition_offsets[rank+1]) {
                right_sending_buffer[num_sending_right++] = my_particles[i];
            } else {
                remaining_particles[num_remaining_particles++] = my_particles[i];
            }
        }
        if (rank == 0) {
            MPI_Isend(right_sending_buffer, num_sending_right, PARTICLE, rank+1, 0, MPI_COMM_WORLD, &send_right_req);
            MPI_Irecv(right_receiving_buffer, num_my_particles, PARTICLE, rank+1, MPI_ANY_TAG, MPI_COMM_WORLD, &recv_right_req);
            MPI_Wait(&send_right_req, &send_right_stat);
            MPI_Wait(&recv_right_req, &recv_right_stat);
            MPI_Get_count(&recv_right_stat, PARTICLE, &recvd_right_count);
            num_augmented_particles = num_remaining_particles + recvd_right_count;
            memcpy(my_particles, remaining_particles, num_remaining_particles * sizeof(particle_t));
            memcpy(my_particles + num_remaining_particles, right_receiving_buffer, recvd_right_count * sizeof(particle_t));
            num_my_particles = num_augmented_particles;
        } else if (rank == (num_procs-1)) {
            MPI_Isend(left_sending_buffer, num_sending_left, PARTICLE, rank-1, 0, MPI_COMM_WORLD, &send_left_req);
            MPI_Irecv(left_receiving_buffer, num_my_particles, PARTICLE, rank-1, MPI_ANY_TAG, MPI_COMM_WORLD, &recv_left_req);
            MPI_Wait(&send_left_req, &send_left_stat);
            MPI_Wait(&recv_left_req, &recv_left_stat);
            MPI_Get_count(&recv_left_stat, PARTICLE, &recvd_left_count);
            num_augmented_particles = num_remaining_particles + recvd_left_count;
            memcpy(my_particles, remaining_particles, num_remaining_particles * sizeof(particle_t));
            memcpy(my_particles + num_remaining_particles, left_receiving_buffer, recvd_left_count * sizeof(particle_t));
            num_my_particles = num_augmented_particles;
        } else {
            MPI_Isend(right_sending_buffer, num_sending_right, PARTICLE, rank+1, 0, MPI_COMM_WORLD, &send_right_req);
            MPI_Irecv(right_receiving_buffer, num_my_particles, PARTICLE, rank+1, MPI_ANY_TAG, MPI_COMM_WORLD, &recv_right_req);
            MPI_Isend(left_sending_buffer, num_sending_left, PARTICLE, rank-1, 0, MPI_COMM_WORLD, &send_left_req);
            MPI_Irecv(left_receiving_buffer, num_my_particles, PARTICLE, rank-1, MPI_ANY_TAG, MPI_COMM_WORLD, &recv_left_req);
            MPI_Wait(&send_right_req, &send_right_stat);
            MPI_Wait(&recv_right_req, &recv_right_stat);
            MPI_Wait(&send_left_req, &send_left_stat);
            MPI_Wait(&recv_left_req, &recv_left_stat);
            MPI_Get_count(&recv_left_stat, PARTICLE, &recvd_left_count);
            MPI_Get_count(&recv_right_stat, PARTICLE, &recvd_right_count);
            num_augmented_particles = num_remaining_particles + recvd_left_count + recvd_right_count;
            memcpy(my_particles, remaining_particles, num_remaining_particles * sizeof(particle_t));
            memcpy(my_particles + num_remaining_particles, left_receiving_buffer, recvd_left_count * sizeof(particle_t));
            memcpy(my_particles + num_remaining_particles + recvd_left_count, right_receiving_buffer, recvd_right_count * sizeof(particle_t));
            num_my_particles = num_augmented_particles;
        }
    }

    simulation_time = read_timer() - simulation_time;
    if( rank == 0 ) {
        printf( "num_particles = %d, num_procs = %d, simulation time = %g s\n", num_particles, num_procs, simulation_time );
    }

    if (savename) {
        if (rank == 0) {
            final_partition_sizes = (int*) malloc( num_procs * sizeof(int) );
        }
        MPI_Gather(&num_my_particles, 1, MPI_INT, final_partition_sizes, 1, MPI_INT, 0, MPI_COMM_WORLD);
        if (rank == 0) {
            final_partition_offsets = (int*) malloc( num_procs * sizeof(int) );
            final_partition_offsets[0] = 0;
            for (int i = 1; i < num_procs; i++) {
                final_partition_offsets[i] = final_partition_offsets[i-1] + final_partition_sizes[i-1];
            }
        }
        MPI_Gatherv(my_particles, num_my_particles, PARTICLE, particles, final_partition_sizes, final_partition_offsets, PARTICLE, 0, MPI_COMM_WORLD);
        if (rank == 0) {
            save( fsave, num_particles, particles );
            free(final_partition_sizes);
            free(final_partition_offsets);
        }
    }

    free( partition_offsets );
    free( partition_sizes );
    free( my_particles ); // same as my_particles
    free(remaining_particles);
    free( left_sending_buffer );
    free( right_sending_buffer );
    free( left_receiving_buffer );
    free( right_receiving_buffer );
    if( fsave ) fclose( fsave );
    MPI_Finalize();
    return 0;
}