Bui Minh Duc
Bui Minh Duc

Reputation: 132

stack smashing detected when use MPI_Reduce

I have learned to use some MPI functions. When I try to use MPI_Reduce, I get stack smashing detected when I run my code:

#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>

void main(int argc, char **argv) {
    int i, rank, size;
    int sendBuf, recvBuf, count;
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    sendBuf = rank;
    count = size;
    MPI_Reduce(&sendBuf, &recvBuf, count, MPI_INT, 
        MPI_SUM, 0, MPI_COMM_WORLD);

    if (rank == 0) {
        printf("Sum is %d\n", recvBuf);
    }

    MPI_Finalize();
}

It seem to be okey with my code. It will print sum of all rank in recvBufwith process 0. In this case, it will print Sum is 45 if I run my code with 10 process mpirun -np 10 myexecutefile. But I don't know why my code has the error:

Sum is 45
*** stack smashing detected ***: example6 terminated
[ubuntu:06538] *** Process received signal ***
[ubuntu:06538] Signal: Aborted (6)
[ubuntu:06538] Signal code:  (-6)
[ubuntu:06538] *** Process received signal ***
[ubuntu:06538] Signal: Segmentation fault (11)
[ubuntu:06538] Signal code:  (128)
[ubuntu:06538] Failing at address: (nil)
--------------------------------------------------------------------------
mpirun noticed that process rank 0 with PID 0 on node ubuntu exited on signal 11 (Segmentation fault).
--------------------------------------------------------------------------

What is the problem and how can I fix it?

Upvotes: 2

Views: 1599

Answers (1)

francis
francis

Reputation: 9817

In

MPI_Reduce(&sendBuf, &recvBuf, count, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);

The argument count must be the number of elements in send buffer. As sendBuf is a single integer, try count = 1; instead of count = size;.

The reason why Sum is 45 got correctly printed is hard to explain. Accessing values out of bound is undefined behavior: the problem could have remained unnoticed, or the segmentation fault could have been raised before Sum is 45 got printed. The magic of undefined behavior...

Upvotes: 4

Related Questions