Autor |
Beitrag |
gerd8888
Beiträge: 205
Erhaltene Danke: 3
Win7
Delphi 10.1 Starter (kostenlos) Lazarus
|
Verfasst: Di 26.09.17 17:14
Hallo,
hat jemand ein Beispiel für die Programmierung von mehreren Kernen.
Gerd
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Di 26.09.17 17:20
In welcher Technik? Jede Programmiersprache/Programmierumgebung hat da üblicherweise mehrere Möglichkeiten.
|
|
gerd8888
Beiträge: 205
Erhaltene Danke: 3
Win7
Delphi 10.1 Starter (kostenlos) Lazarus
|
Verfasst: Di 26.09.17 18:28
In der Programmiersprache Delphi. Bei einem Algorithmus heisst es doch immer - nur 1 Kern. Ich würde gerne wissen, wie man prinzipiell mehrere Kerne in der Programmierung benutzt.
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Di 26.09.17 20:19
Ich hab letztens ein Beispielprogramm namens Threads in den Delphi Beispielen gefunden (vom Installationspaket) in dem drei Sortieralgorithmen parallelisiert verglichen werden. Ich bin mir zwar nicht sicher ob das mehrere Kerne nutzt, aber das läuft zumindest Parallel.
Einloggen, um Attachments anzusehen!
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
Zuletzt bearbeitet von Symbroson am Di 26.09.17 20:46, insgesamt 2-mal bearbeitet
|
|
t.roller
Beiträge: 118
Erhaltene Danke: 34
|
Verfasst: Di 26.09.17 20:39
Komponente:
Multiprocessor PCs with large cache memories are no more rare.
On this kind of machines high performance multithreading applications can be adversely affected by the default behaviour of the scheduler that often causes excessive thread process hopping.
This can be prevented using process and thread affinity masks. This component simplifies their use.
delphi.icm.edu.pl/ft...rocessorAffinity.zip
Ich habe die Komponente (Anhang) vervollständigt - aber für XE7 angepasst.
Wer eine niedrigere Version hat, muss ggf. die Prefixe entfernen.
Mehr Infos:
SetProcessAffinityMask - Select more than one processor?
stackoverflow.com/qu...e-than-one-processor
SetProcessAffinityMask function
msdn.microsoft.com/e...SPPError=-2147217396
Set processor affinity programmatically in a multi-core system
www.techrepublic.com...a-multi-core-system/
Einloggen, um Attachments anzusehen!
Zuletzt bearbeitet von t.roller am Di 26.09.17 23:13, insgesamt 4-mal bearbeitet
|
|
gerd8888
Beiträge: 205
Erhaltene Danke: 3
Win7
Delphi 10.1 Starter (kostenlos) Lazarus
|
Verfasst: Di 26.09.17 21:20
Symbroson, das war ein nettes Beispiel. Ist das parallel auch schneller wie normal?
t.roller, den source-code habe ich nicht verstanden. Wohl etwas für Profis?
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Di 26.09.17 21:28
Das weiß ich leider nicht - das musst du wohl oder übel selbst in deinem Anwendungsbereich ausprobieren. Ich kann es jetzt gerade nicht testen.
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
doublecross
Beiträge: 149
Erhaltene Danke: 27
Windows 7
C#; Visual Studio 2015
|
Verfasst: Mi 27.09.17 14:58
Hallo,
gerd8888 hat folgendes geschrieben : | Symbroson, das war ein nettes Beispiel. Ist das parallel auch schneller wie normal? |
die Frage ist so pauschal nicht zu beantworten, weil da viele Aspekte rein spielen.
Generell, ist es schon schneller, wenn mehrere Teile des Codes Paralel ausgeführt werden. Es bedeutet aber immer auch einen gewissen Verwaltungsaufwand. Benötigt diese Verwaltung der Parallelen Codeschnipzel mehr zeit, als durch die paralele Ausführung gespart wird, dann wird es sogar langsamer. Auch hat man es immer wieder mit begrenzten Resourchen zu tun, welche die Paralelen Programmteile sich teilen müssen. Stelle dir vor, zwei Programmteile wollen etwas ausdrucken, dann hilft es gar nciht wenn diese Parallel laufen, wenn nur ein Drucker da ist.
Auch kommt es immer dann zu Verzögerungen, wenn ein Programmteil mit dem anderen "sprechen muss" bzw. Daten übertragen, da die beiden sich dann immer abstimmen müssen, wann wer ansprechbar ist usw.
In C# gab es mitlerweile einige Anläufe von Microsoft um Parallele Programmierung, sowohl möglichst einfach, möglichst Sicher und möglichst effizient zu ermöglichen. Bei den neueren sagt man dem Compiler eigentlich nicht mehr "führe Parallel aus" sondern eher "führe Parallel aus wenn es sich lohnt". Mann lässt dann also ein Programm bewerten, ob es sich für dieses Programmstück auf dem aktuellen System überhaupt Lohnt einen eigenen Thread zu eröffnen oder ob es nicht schneller ist diesen Code Seriell auszuführen. Das System prüft dann auch z. B. welcher Kern, wie stark ausgelastet ist und sorgt dann dafür das der neue Thread nach Möglichkeit auf den Kern zur Ausführung gelangt, der am meisten Luft hat usw.
Ich will damit nur zeigen, dass das Thema sehr komplex ist und solche Fragen wie deine nicht in dieser Pauschalität beantwortet werden können.
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Mi 27.09.17 15:03
Deswegen ja ^^
Symbroson hat folgendes geschrieben : | das musst du wohl oder übel selbst in deinem Anwendungsbereich ausprobieren. |
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
gerd8888
Beiträge: 205
Erhaltene Danke: 3
Win7
Delphi 10.1 Starter (kostenlos) Lazarus
|
Verfasst: Mi 27.09.17 19:04
doublecross, das Beispiel mit nur 1 Drucker verstehe ich. Mehrere Rechenprozesse dürften hingegen parallel gut zu verarbeiten sein.
Vielleicht werde ich tatsächlich mal das Beispielprogramm umschreiben und die Zeit messen.
|
|
GuaAck
Beiträge: 378
Erhaltene Danke: 32
Windows 8.1
Delphi 10.4 Comm. Edition
|
Verfasst: Mi 27.09.17 20:05
Hallo,
hier hatte ich mal ein kleines Beipiel gemacht, um die Rechenzeiten zu vergleichen.
Minimale "sinnvolle Größe" eines Thread
Gruß
Guaack
Moderiert von Th69: URL-Titel hinzugefügt.
|
|
Delphi-Laie
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: Mi 27.09.17 21:11
gerd8888 hat folgendes geschrieben : | Hallo,
hat jemand ein Beispiel für die Programmierung von mehreren Kernen.
Gerd |
Es werden nicht Kerne prorammiert, sondern Threads. Diese werden von Windows nach eigenem Gutdünken auf die Prozessoren bzw. Kerne verteilt. Es lassen sich allerdings auch Prozessoren bzw. Kerne ausschließen, sowohl bei den Threads als auch bei den Prozessen.
Bei Luckie findet man unter michael-puff.de/Prog...ng/Delphi/Tutorials/ sowohl Anleitungen als auch Beispielprogramme auch zur Threadprogrammierung unter Delphi. Auch in meinem "Sortierkino" gibt es Multithreadingalgorithmen. Die Verteilung der Threads und Prozesse läßt sich mit meinem Programm "Prozesse (Prozeßbetrachter und mehr)" einschränken.
|
|
Delphi-Laie
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: Mi 27.09.17 21:36
|
|