/ / Nur ein Thread mit MPI erstellt & keine Beschleunigung mit OpenMP - Linux, MPI, OpenMP

Nur ein Thread erstellt mit MPI & keine Beschleunigung mit OpenMP - linux, mpi, openmp

Ich habe eigentlich zwei Fragen, aber es scheint, dass sie zusammenhängen:

1) Ich habe versucht, ein einfaches MPI-Beispiel auszuführen:

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

int main(int argc, char* argv[])
{
int rank, size;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);

printf("I am %d from %dn", rank, size);
MPI_Finalize();
return 0;
}

Es muss etwas ausgeben wie:

I am 0 from 2
I am 1 from 2

Obwohl ich folgendes bekomme:

$ mpicc mpi_hello.c -o hello
$ mpirun -np 4 ./hello
I am 0 from 1
I am 0 from 1
I am 0 from 1
I am 0 from 1
$ mpirun -np 2 ./hello
I am 0 from 1
I am 0 from 1

Ist es irgendwie mit der Thread-Definition in Linux verbunden? Ich starte es unter Ubuntu 16.04.

2) Mein OpenMP-Programm:

#include <omp.h>
#include <math.h>
#include <time.h>
#include <iostream>
#include <stdio.h>

const int N = 10000;

int matrix[N][N];

int main()
{
#pragma omp parallel num_threads(2)

#pragma omp for
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
matrix[i][j] = 1+i;

clock_t t;

t = clock();

#pragma omp parallel num_threads(2)
#pragma omp for
for (int i = 0; i < N; i++)
{
matrix[i][i] = 0;
for (int j = 0; j< N; j++)
if (j != i)
matrix[i][i] += sin(cos(log(matrix[i][j] + matrix[j][i])));
}
t = clock() - t;

std::cout << "It took " << ((float)t)/CLOCKS_PER_SEC << " sec" << std::endl;

return 0;
}

Es funktioniert korrekt und verwendet 2 Threads. Es lädt jedoch 2 Prozessoren (~ 100% CPU) und benötigt die gleiche Zeit (~ 34 Sekunden) wie das gleiche aufeinanderfolgende (lädt 1 Prozessor ~ 50% CPU). Ich weiß, dass OpenMP möglicherweise einige Zeit benötigt, um zu starten, aber wie kann dies zur gleichen Dauer von Programmen führen?

Antworten:

0 für die Antwort № 1

Beantwortung des MPI-Teils der Frage. Hast du MPICH installiert? Wenn dies der Fall ist, versuchen Sie, wie folgt zu kompilieren und auszuführen:

$ mpicc.mpich mpi_hello.c -o hello
$ mpirun.mpich -np 4 ./hello
I am 0 from 4
I am 1 from 4
I am 2 from 4
I am 3 from 4

Es sollte funktionieren.