C++ MPI und OpenMP

Darkko

Cadet 3rd Year
Dabei seit
Juni 2011
Beiträge
60
Hallo

Ich versuche folgenden Code über die Konsole zum Laufen zu bringen:

Code:
#include <iostream>
#include <omp.h>
#include <mpi.h>
using namespace std;

int main() {

	int x = 20000 * 20000;
	double y = 1.2345;
	double *a = new double[x];

#pragma omp parallel num_threads(4)
	for (int i = 0; i < x; i++) {
		a[i] = y * 1.2345;
	}

	MPI_Init(NULL, NULL);
	int rank, size;
	MPI_Comm_rank(MPI_COMM_WORLD, &rank);
	MPI_Comm_size(MPI_COMM_WORLD, &size);
	printf("%d\n",size);
	printf("%d",rank);
	MPI_Finalize();
	return 0;
}
Der Sinn des Codes sei mal dahingestellt, der dient nur zu Testzwecken.
Problem: Das Programm wird über die Konsole mit "mpiexec -n 4 testing" nicht ausgeführt, bzw. es terminiert sofort (keine Fehlermeldung). Ohne MPI läuft es wie erwartet, aber halt nur mit einem Prozess und 4 threads. Muss ich beim Aufruf noch andere Parameter mitgeben damit dieser sogenannte hybride Code korrekt ausgeführt wird?

Kompiliert wurde aus eclipse mit mingw64.

Danke für die Hilfe.
Cheers Darkko
 

Velines

Lt. Junior Grade
Dabei seit
Juli 2008
Beiträge
395
OpenMP und MPI sind verschiedene Sachen.
Für MPI fehlen (iirc) noch einige Initialisierungen und dann natürlich die Kommunikation bzw. Aufteilung der Daten auf die einzelnen Prozesse.
Für OpenMP sieht der Code gut aus; die Anzahl der Threads (!) kann man über eine Umgebungsvariable (OMP_NUM_THREADS oder so) festlegen, wenn sie von der Anzahl der Kernen abweichen soll.
 

kuddlmuddl

Commander
Dabei seit
Mai 2010
Beiträge
2.492
Ich hab ka was MPI und OpenMP ist und evtl. ist es auch ein dummer Hinweis aber mich wundert das hier:
int x = 20000 * 20000;
double *a = new double[x];

Kann man ohne weiteres so viel Speicher holen ohne malloc etc? Ich wollte vor einigen Jahren mal Bildverarbeitung machen und da wars mit Arrays nicht so einfach so große Datenmengen zu verwalten.
Könntest testweise die 20000 mal durch 100 ersetzen
 

Darkko

Cadet 3rd Year
Ersteller dieses Themas
Dabei seit
Juni 2011
Beiträge
60
@kuddlmuddel: ja der array frisst gut 3.5gb, aber das ist i.o.

@ blitzmerker: mein bisheriger code verwendet mpi. da aber mein aktuelles projekt nur auf einer maschine läuft, dachte ich es wäre etwas simpler nur mit openmp weiter zu arbeiten.
 

Darkko

Cadet 3rd Year
Ersteller dieses Themas
Dabei seit
Juni 2011
Beiträge
60
Wenn du dich auf den Code oben beziehst ja. Aber mein richtiges Projekt beinhaltet viele Klassen mit Algorithmen basierend auf MPI und ich will u.a. zusätzliche Algorithmen implementieren, jedoch nur noch mit OpenMP. Wenn ich das Project jedoch in eine exe kompiliere lande ich beim oben beschriebenen Problem...
 

FreddyMercury

Commodore
Dabei seit
Dez. 2002
Beiträge
5.034
Hast du dich ueberhaupt vorher mit C/C++ Programmierung beschaeftigt? Wenn du ein Programm mit parametern ausfuehren willst, solltest du schon "argc und argv" einbauen, ansonsten ist nichts mit "mpiexec -n 4 testing". Dein Programm muss doch wissen, was es mit den Angaben machen soll und C/C++ kommen beide leider nicht mit einer Glaskugel daher.
 

Darkko

Cadet 3rd Year
Ersteller dieses Themas
Dabei seit
Juni 2011
Beiträge
60
hast du schon mit mpi gearbeitet? anscheinend wohl kaum...
der applikation gebe ich keine parameter mit wie du eigentlich sehen solltest (testing ist die exe zur info). mpi ist ein seperates framework das seine parameter auch selbst definiert und behandelt, u.a. geb ich da meine exe mit. btw ohne openmp läuft es...
 
Zuletzt bearbeitet:
Top