Seite 1 von 1

Programm mit Prozessen parallelisieren

Verfasst: Mo Feb 22, 2021 12:26 pm
von MeisterPropper
Hallo Zusammen,

in einer Übung vom Studium wurde mir folgende Aufgabe gestellt, bei der ich nicht genau weiß wie ich an diese ran gehen soll. :? Habt Ihr ein paar Tipps? :)

Code: Alles auswählen

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

const int n = 1000000000;

int main(int argc, char** argv) {
	int i;
	double x, y, pi, sum;
	y = 1.0/n; sum = 0.0;
	
	for (i=0; i<n; i++) {
		x = y * ((double)i + 0.5);
		sum = sum + (4.0/(1.0+x*x));
	}

	printf("pi = %.15f\n", y*sum);
	return 0;
}
Das Programm soll mit Prozessen parallelisiert werden. Aus einem Eingabe-Parameter soll angegeben werden, wie viele Prozesse genutzt werden. Für die Kommunikation soll eine Message Queues benutzt werden. Das Ergebnis am Ende soll dann vom gestarteten Prozess ausgegeben werden.

Vielen Dank für eure Hilfe :)

Edit by Xin: Codetags eingefügt

Re: Programm mit Prozessen parallelisieren

Verfasst: Mo Feb 22, 2021 2:11 pm
von Xin
MeisterPropper hat geschrieben:
Mo Feb 22, 2021 12:26 pm

Code: Alles auswählen

	for (i=0; i<n; i++) {
		x = y * ((double)i + 0.5);
		sum = sum + (4.0/(1.0+x*x));
	}
Das Programm soll mit Prozessen parallelisiert werden. Aus einem Eingabe-Parameter soll angegeben werden, wie viele Prozesse genutzt werden.
Naja, Du siehst, dass der Inhalt der Schleife nicht von n abhängt oder einem Vor- oder Nachfolger. Die einzige Abhängigkeit ist hier sum und bei der Addition ist ja (theoretisch) egal, in welcher Reihenfolge Du addierst. (Tatsächlich könnte das Ergebnis aber unterschiedlich ausfallen und zwar wäre eine parallele Lösung dann vermutlich exakter.)

Du hast hier einen Prozess, der von 0 bis n-1 geht. Du kannst also zwei Prozesse machen, die von 0 bis n/2-1 und von n/2 bis n-1 rechnen und die Werte addieren. Am Ende nimmst Du die Ergebnisse von allen Prozessen und addierst die aufeinander.
MeisterPropper hat geschrieben:
Mo Feb 22, 2021 12:26 pm
Für die Kommunikation soll eine Message Queues benutzt werden. Das Ergebnis am Ende soll dann vom gestarteten Prozess ausgegeben werden.
Ich könnte das jetzt flott in C++ hinrotzen, aber das sieht mir stark nach C aus, also sind C++-Libs wohl nicht gefragt.

Was ist denn eine MessageQueue, was stellt sich der Prof vor. Brachial könntest Du auch ein Programm schreiben, was n mal aufgerufen wird, jedes schreibt eine Dateie schreibt und ein zweites, was - wenn n Dateien da sind, deren Inhalt addiert. :-)

Da ist jetzt eher die Frage, welches OS Du verwendest. Oder eben C++, was das ganze abstrahieren würde. Da würdest Du einfach die passende Funktion asynchron aufrufen und am Ende sagen: Wenn alle fertig, die Ergebnisse aller Tasks addieren.