0

The following code gives multiple outputs

Sum of first 100000 natural numbers: 5000050000

Sum of first 100000 natural numbers: 5000050000

Sum of first 100000 natural numbers: 5000050000

Sum of first 100000 natural numbers: 5000050000

Sum of first 100000 natural numbers: 5000050000

Sum of first 100000 natural numbers: 5000050000

As per my understanding only the for loop will be run parallel and only one output should come. Why I am getting same output many times.

#include <iostream>
#include <omp.h>

int main() {
    int n = 100000; 
    long long sum = 0;

    #pragma omp parallel for reduction(+: sum)
    for (int i = 1; i <= n; ++i) {
        sum += i;
    }

    std::cout << "Sum of first " << n << " natural numbers: " << sum << std::endl;

    return 0;
}
8
  • 4
    You are confusing MPI (Open MPI is an implementation of the MPI standard) and OpenMP. Choose one paradigm (before going hybrid if you want). When asking a question, also includes your run command line. Commented Mar 25 at 5:26
  • 3
    Cannot reproduce on MSVC (VS2022) - I get only one output line. Which compiler are you using ?
    – wohlstad
    Commented Mar 25 at 5:35
  • 1
    Side note : C++ also has multithreading support out of the box (std::thread), and there is a set of algorithms like std::accumulate that can be called with a parallel execution policy. So make clear in your question WHAT you are investigating. Is it the use of OMP or are you just interested in parallelization in general? Commented Mar 25 at 5:51
  • 1
    @wohlstad he likely ran his program via mpirun, that's why you did not reproduce the output Commented Mar 25 at 6:44
  • 1
    because you are not running an MPI program, you are simply running 6 independant instances of the same program. mpiexec -n 1 a.out will output a single line, but this is unlikely what you are trying to achieve. Commented Mar 25 at 8:53

1 Answer 1

2

As many commenters have already pointed out, you are confusing MPI (the Message Passing Interface), which is used for large scale parallelism between completely separate computers which do not share memory, and OpenMP which is used for parallelism within a single machine that can support multiple hardware threads. (You have maybe been confused by the fact that one of the MPI implementations is called "Open MPI" [for which blame the people who chose that name!]).

Since your code is solely OpenMP; you are not including <mpi.h> or calling any MPI functions (which begin with the prefix MPI_) you should not be executing your code using mpirun but rather just treating it as a normal executable to run on the current node. So, just suing something like:-

% ./a.out

Because you are running with mpirun (or one of the batch systems that support MPI), multiple copies of your code are being executed on multiple nodes, and each copy prints the output.

0

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.