Programm mit Prozessen parallelisieren

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
MeisterPropper
Beiträge: 1
Registriert: Mo Feb 22, 2021 12:07 pm

Programm mit Prozessen parallelisieren

Beitrag von MeisterPropper » Mo Feb 22, 2021 12:26 pm

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

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8680
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Programm mit Prozessen parallelisieren

Beitrag von Xin » Mo Feb 22, 2021 2:11 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten