对于给定输入,当内核> = 12时,为什么MPI_Bcast不起作用?

问题描述 投票:0回答:1

我目前的代码适用于12岁以下的内核,使用打印,代码可以一直显示到MPI_Bcast(&global_mean,...)在显示之前和之后都没有打印:注意:MPI自定义类型已创建并已经过测试;

int main (int argc, char ** argv)
{ 

    int pid, n_processors;
    const int ROOT = 0;

    int xsize, ysize, colmax;
    pixel *src = (pixel*) malloc(sizeof(pixel) * MAX_PIXELS);

    // Scatter receiver vector
    pixel *receive_buffer;

    int send_count, partial_sum, total_sum, global_mean, nump, remainder;

    double global_time = 0.0;

    MPI_Init(NULL, NULL);

    MPI_Comm_rank(MPI_COMM_WORLD, &pid);
    MPI_Comm_size(MPI_COMM_WORLD, &n_processors);

    if(pid == ROOT){

        /* Take care of the arguments */
        if (argc != 3)
        {
            fprintf(stderr, "Usage: %s infile outfile\n", argv[0]);
            exit(1);
        }

        /* Read file */
        if(read_ppm (argv[1], &xsize, &ysize, &colmax, (char *) src) != 0)
            exit(1);

        if (colmax > 255)
        {
            fprintf(stderr, "Too large maximum color-component value\n");
            exit(1);
        }

        printf("Has read the image, calling filter\n");

        send_count = (xsize * ysize)/n_processors;
        nump = xsize * ysize; 


    }

    double start_time = MPI_Wtime();


    MPI_Bcast(&send_count, 1, MPI_INT, ROOT, MPI_COMM_WORLD);


    // Initialize receive_buffer
    receive_buffer = (pixel*)malloc(send_count * sizeof(pixel));

    // 1. Scatter src array through different proccessors
    MPI_Scatter(src, send_count, mpi_pixel_type, receive_buffer, send_count, mpi_pixel_type, ROOT, MPI_COMM_WORLD);

    // 2. Do partial sums
    int i;
    partial_sum = 0; 
    for(i = 0; i <= send_count; i++){
        partial_sum += (unsigned int)receive_buffer[i].r + (unsigned int)receive_buffer[i].g + (unsigned int)receive_buffer[i].b;
    }

    MPI_Reduce(&partial_sum, &total_sum, 1, MPI_INT, MPI_SUM, ROOT, MPI_COMM_WORLD);
    // Calculate missing pixels
    if(pid == ROOT){
        remainder = nump % n_processors;
        for(int i = nump - remainder; i < nump + 1; i++)
            total_sum += (unsigned int)receive_buffer[i].r + (unsigned int)receive_buffer[i].g + (unsigned int)receive_buffer[i].b;
    }

    // 3. Calculate mean
    if(pid == ROOT)
        global_mean = total_sum/nump;




    MPI_Bcast(&global_mean, 1, MPI_INT, ROOT, MPI_COMM_WORLD);

    // 4. Apply algorithm 
    MPI_Scatter(src, send_count, mpi_pixel_type, receive_buffer, send_count, mpi_pixel_type, ROOT, MPI_COMM_WORLD);
    unsigned int psum;
    for(i = 0; i <= send_count; i++){
        psum = (unsigned int)receive_buffer[i].r + (unsigned int)receive_buffer[i].g + (uint)receive_buffer[i].b;
        if(global_mean > psum)
            receive_buffer[i].r = receive_buffer[i].g = receive_buffer[i].b = 0;
        else
            receive_buffer[i].r = receive_buffer[i].g = receive_buffer[i].b = 255;

    }

    // 5. Gather partial results
    MPI_Gather(receive_buffer, send_count, mpi_pixel_type, src, send_count, mpi_pixel_type, ROOT, MPI_COMM_WORLD);

    if(pid == ROOT){
        // printf("Reamainder: %d\n", remainder);
        for(i = nump - remainder; i <= nump; i++){
            psum = (unsigned int)src[i].r + (unsigned int)src[i].g + (uint)src[i].b;
            if(global_mean > psum)
                src[i].r = src[i].g = src[i].b = 0;
            else
                src[i].r = src[i].g = src[i].b = 255;

        }
    }


    double end_time = MPI_Wtime();

    global_time += end_time - start_time;

    if(pid == ROOT){
        printf("Filtering took: %g secs\n", global_time) ;

        /* Write result */
        printf("Writing output file\n\n");

        if (write_ppm(argv[2], xsize, ysize, (char *)src) != 0)
            exit(1);
    }




    MPI_Finalize();  

    return 0;

}

在核心<12下工作正常,但是当核心> = 12时>

=   BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
=   PID 56361 RUNNING AT sigma.nsc.liu.se
=   EXIT CODE: 11
=   CLEANING UP REMAINING PROCESSES
=   YOU CAN IGNORE THE BELOW CLEANUP MESSAGES

我的代码在哪里做错了?为什么仅在达到某些内核时才停止工作?

我目前的代码适用于12岁以下的内核,可以使用打印,代码可以一直显示到MPI_Bcast(&global_mean,...)在显示之前和之后都没有打印:注意:已经创建了MPI自定义类型,并且...

c openmpi
1个回答
0
投票

为什么停止工作

© www.soinside.com 2019 - 2024. All rights reserved.