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 № 1Beantwortung 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.