Ich habe ein Programm gecodet, welches alle Primzahlen in einem bestimmten Bereich ausgibt. Was muss ich machen, damit beide CPU-Kerne vollständig ausgelastet werden? Habe im Anhang eine ZIP-Datei mit Quellcode, Codeblocks-Projekt und .exe Datei. Danke für eure Hilfe.
Dualcoreoptimierung eines Programms
-
-
Du kannst n Threads laufen lassen (n = Zahl der Cores) und die Arbeit entsprechend aufteilen
CoreA rechnet Primzahlen von 1 bis 100.000
Core B dann von 100.001 bis 200.000
Core C 200.001 .... usw -
Das habe ich jetzt so realisiert, dass ich zweimal das Programm ausführe und in dass eine dann sage, 1 bis 100000 im zweiten 100001 bis 200000. Kann man das irgendwie Programmtechnisch automatisieren, dass er es automatisch aufteilt. Klar jetzt hab ich 100% Auslastung. Werde jetzt noch probieren, ein drittes Programm starten. Dann müssten die anderen zwei langsamer werden. Oder stürtzt dann der PC ab?
-
Zitat von Benjamin92
Das habe ich jetzt so realisiert, dass ich zweimal das Programm ausführe und in dass eine dann sage, 1 bis 100000 im zweiten 100001 bis 200000. Kann man das irgendwie Programmtechnisch automatisieren, dass er es automatisch aufteilt. Klar jetzt hab ich 100% Auslastung. Werde jetzt noch probieren, ein drittes Programm starten. Dann müssten die anderen zwei langsamer werden. Oder stürtzt dann der PC ab?
Kannst tausende Threads erstellen. Das OS verteilt die Threads selbst auf die zu verfügungstehenden Prozessoren/Kerne.
Aber das mit den großen Bereichen über Threads rechnen ist nicht ganz so performant. Ich hatte das mal mit pthreads getestet und irgendwie gab's nur ein Chaos. Vielleicht hatte ich es auch falsch implementiert und keine guten Tricks angewandt. -
Zwei Threads langen aber auch. Tausende Threads belasten nur den Scheduler unnötig.
Wie das ganze in C geht, davon habe ich allerdings (vor allem unter Windows) keine Ahnung. In Java geht's einfacher aber da kriegst du noch andere Performanceprobleme
-
wenn dus in Threads aufteilst, macht das OS den rest für dich automatisch
leider liegt die schwerste Aufgabe immernoch bei dir, nämlich das sinnvoll in 2 Threads aufteilenwie machst du das mit den Primzahlen? teilst du für jede Zahl durch alle die kleiner sind?
das geht viel besser, z.B. mit dem Sieb des Eratosthenes, das setzt aber voraus, dass du alle Zahlen vorher schon geprüft hast, da kannst du nichtmehr einfach einen kern die eine Hälfte und den anderen die andere Hälfte berechnen lassen -
Zitat von friedrichheinze
Zwei Threads langen aber auch. Tausende Threads belasten nur den Scheduler unnötig.
Wie das ganze in C geht, davon habe ich allerdings (vor allem unter Windows) keine Ahnung. In Java geht's einfacher aber da kriegst du noch andere Performanceprobleme
Umschalten zwischen zwei Threads sind höchstens wenige Hundert Takte... Kann man also vernachlässigen...
-
Zitat von pETe!
Umschalten zwischen zwei Threads sind höchstens wenige Hundert Takte... Kann man also vernachlässigen...
das kommt schon auch drauf an, ob Threadscheduling im Userland oder im Kernel passiert, bei Kernelthreads muss da schon weitaus mehr passieren
allerdings sollte es wohl kein Problem sein die Anzahl der Prozessoren abzufragen und das Problem dann halt in x Threads zu unterteilen
Jetzt mitmachen!
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!