Programm Sequenz einem CPU Kern Zuweisen.

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Programm Sequenz einem CPU Kern Zuweisen.

Beitrag von Maik81SE »

Moin zusammen.

Bin eben durch Zufall auf dies Tutorial gekommen und bitte um eure Meinung, ob es ein macht, dies und einen eigenen Kern zu setzen, um die Gesamte CPU zu entlasten.

Habe vor, mit dieser Komponente bis zu 6 Layer zu fahren, was Rechenleistung ohne Ende brauchen wird :| :|
Dazu noch auf einem PI 4 der noch mit 32 Bit läuft...
Sollte interessant werden, gerade, wenn ich daran denke, das das Ehebild im Programm (350 x 350) Pixel und auf dem Beamer (max. HD) laufen soll.
Der PI4 sollte soweit ich das auf dem Film habe 2 bzw. 4 Kerne fahren.

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Programm Sequenz einem CPU Kern Zuweisen.

Beitrag von Winni »

Maik81SE hat geschrieben:
Di 15. Dez 2020, 17:30

Bin eben durch Zufall auf dies Tutorial gekommen und bitte um eure Meinung, ob es ein macht, dies und einen eigenen Kern zu setzen, um die Gesamte CPU zu entlasten.
Ich verstehe dir Frage nicht

Ansonsten kann ich Dir ne Menge Auskunft über die BGRAbitmap geben.

Winni

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: Programm Sequenz einem CPU Kern Zuweisen.

Beitrag von Maik81SE »

Winni hat geschrieben:
Di 15. Dez 2020, 17:50
Maik81SE hat geschrieben:
Di 15. Dez 2020, 17:30

Bin eben durch Zufall auf dies Tutorial gekommen und bitte um eure Meinung, ob es ein macht, dies und einen eigenen Kern zu setzen, um die Gesamte CPU zu entlasten.
Ich verstehe dir Frage nicht

Ansonsten kann ich Dir ne Menge Auskunft über die BGRAbitmap geben.

Winni
Soweit ich das richtig im Filter habe, regelt es System, wie die Kerne ausgelastet werden, aber es soll wohl ich möglich sein, einen Kern komplett zu blocken, damit er für bestimmte Aufgaben zu 💯 Prozent zur Verfügung steht.

Die Auskünfte nehme ich gerne entgegen, aber vorher les ich erst Mal das Tutorial richtig durch.

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Programm Sequenz einem CPU Kern Zuweisen.

Beitrag von af0815 »

Wozu das ganze? Wenn die Aufgabe nicht vom Betriebssystem her skaliert, so zerlege die in Threads, damit die vom Betriebssystem verteilt werden können. Zu was willst du da ein erzwungenes Chaos anrichten und gut funktionierende Scheduler in ihrer Arbeit behindern. Man kann schlechtes Design nicht wettmachen, wenn man im System mit viel Tricks was ändert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: Programm Sequenz einem CPU Kern Zuweisen.

Beitrag von Maik81SE »

af0815 hat geschrieben:
Di 15. Dez 2020, 19:32
Wozu das ganze? Wenn die Aufgabe nicht vom Betriebssystem her skaliert, so zerlege die in Threads, damit die vom Betriebssystem verteilt werden können. Zu was willst du da ein erzwungenes Chaos anrichten und gut funktionierende Scheduler in ihrer Arbeit behindern. Man kann schlechtes Design nicht wettmachen, wenn man im System mit viel Tricks was ändert.
Genau deshalb bitte ich um eure Meinung, da ich mich zugeben mit dem noch nicht beschäftigt habe...
Brauchte ich bisher auch nicht, nur bei dem jetzigen Projekt, werde ich nicht um das Thema Prozeßhandling ins Auge zu fassen.

Rendern, mischen.

Kurz, alles was GLMixer macht nur mit externer Hardware und Pi-kompatibel

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Programm Sequenz einem CPU Kern Zuweisen.

Beitrag von Winni »

Hi!

Das verteilen der Jobs af die jeweiligen CPU Kerne überlass mal schön den Betriebssystem.
Was ist denn, wenn Du z.B. so viel RAM unter Windows verbrauchst, dass Windows seinen swap file vergrößern muss.

Das hat dann ja wohl Vorrang vor Deiner App.
Wenn jetzt das Betriebssystem nicht Vorrang hat, dann hast Du einen klassischen Deadlock.
Ergebnis : Betriebssystem frozen.

Das ist nur eins von unzähligen vorstellbaren Szenarios.

Winni

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: Programm Sequenz einem CPU Kern Zuweisen.

Beitrag von Maik81SE »

Nicht persönlich nehmen, aber unter Windows Programmiere ich keinen nm mehr.

Ebensonwie Mac...
Dann wohl Mal eine Platte mischen, wie ich die Prozesse sinnvoll aufteile.

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Programm Sequenz einem CPU Kern Zuweisen.

Beitrag von Winni »

Hallo!

Das hat nix mit dem Typ des Betriebssystems zu tun sondern mit dem Wesen des Betriebssystems an sich.

Empfohlene Literatur:

https://www.buecher.de/shop/betriebssys ... 42154606/

Winni

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: Programm Sequenz einem CPU Kern Zuweisen.

Beitrag von Maik81SE »

Winni hat geschrieben:
Di 15. Dez 2020, 19:59
Hallo!

Das hat nix mit dem Typ des Betriebssystems zu tun sondern mit dem Wesen des Betriebssystems an sich.

Empfohlene Literatur:

https://www.buecher.de/shop/betriebssys ... 42154606/

Winni
Leider fällt das Buch raus, da mein English nicht so das Beste ist.
Geb ich offen zu, dennoch danke für den Tip.
Such ich Mal nach 'ner deutschen Ausgabe

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Programm Sequenz einem CPU Kern Zuweisen.

Beitrag von Warf »

Ich weiß nicht ob ich deine Frage richtig verstehe, aber unter POSIX systemen (ich gehe mal von aus auch unter Windows, aber kenn mich auf dem OS nicht so gut aus) kannst du threads auf kerne pinnen, aber nicht kerne auf threads. Das heißt, du kannst deinem Linux sagen das ein gewisser thread immer auf dem selben Kern ausgeführt werden soll, aber du kannst nicht verhindern das das system noch einen anderen prozess oder thread auf den selben kern scheduled.

Das gesagt, CPU pinning hat gewisse Vorteile, hauptsächlich den der Cache lokalität des L1 caches. Den jeder CPU core hat seinen eigenen L1 cache in dem instruktionen und daten gecached werden. Wenn ein thread jetzt zunächst auf einem kern läuft und später auf einen anderen gescheduled wird, muss der gesammte cache neu geladen werden. Wenn der Thread aber gepinned wird, sind die chancen gut das solang nicht was anderes großes dazwischen gescheduled wird, teile des caches überleben.

Wenn man sehr rechenaufwendigen code hat der nicht paralelisierbar ist, also nur auf einer CPU läuft, dann kann man mit dem pinnen auf einen thread da ein paar prozente performance rausholen.
Hat natürlich noch ein paar andere Vorteile, so kann man z.b. seine CPU für verschiedene tasks aufteilen oder bei multithreaded anwendungen garantieren das immer noch ein kern offen bleibt um z.b. interaktionen mit anderen prozessen zu erlauben. Man kann damit auch für Messungen (benchmarks, etc.) die abbhängigkeit von der restlichen auslastung der maschine reduzieren um etwas von dem datenrauschen loszuwerden.

Für weitere infos schau mal hier: https://man7.org/linux/man-pages/man3/p ... _np.3.html

Das gesagt, die Vorteile klingen vielleicht jetzt toll und sinnvoll, aber nicht vergessen, wir reden hier von minimalen verbesserungen, die in den allermeisten Fällen den aufwand nicht Wert sind. Tatsächlich war die einzige situation wo ich das je gebraucht hab war bei einem recht kompliziertem, nicht parallelisierbaren algorithmus der für mehrere stunden lief und bei dem jedes bisschen performance verbesserung gebraucht wurde

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Programm Sequenz einem CPU Kern Zuweisen.

Beitrag von Socke »

Das kann man noch weiter treiben, wenn man im Rechner mehrere CPU-Sockel hat. Dann sind nämlich enige RAM-Rigel an Sockel 1 schneller als an Sockel 2 angebunden.
Wenn die Anwendung das weiß und damit umgehen kann, kann durch die Lokalität des CPU-Caches und des RAMs noch einiges an Geschwindigkeit herausgeholt werden, als wenn die Prozesse/Threads wild verteilt werden. Das ganze nennt man dann "NUMA aware" (NUMA = Non-Uniform Memory Access, Nicht gleichförmiger Speicherzugriff).

Andere Anwendungsfälle sind z.B. virtuelle Maschinen, die man auf bestimmte CPU-Kerne festlegt und so durch die Cache-Lokalität die Geschwindigkeit erhöhen kann.

Für ein System mit nur einem Sockel und einer vergleichsweisen einfachen Anwendung ist so etwas aber in der Regel übertrieben. Hier holt man mehr Leistung durch bessere Algorithmen heraus.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Programm Sequenz einem CPU Kern Zuweisen.

Beitrag von Winni »

Danke Warf!

Doch noch mal was Neues gelernt!

Nur am Rande:
Wer alle seine Kerne/Threads unter Vollast sehen will, der muss ZPAQ benutzen.
Euklid hat ein User-Interface hier im Forum vorgestellt.

ZPAQ auf höchste Kompression stellen, irgendeinen Film damit komprimieren.
Irgendeinen SystemMonitor starten. Ist bei KDE mit an Board.

Und dann beobachten wie (bei mir) von 8 Threads wirklich 7 bei 100% arbeiten.
Und auf dem 8. "nur" 70% ausgelastet sind. Damit anderweitig auch noch gearbeitet werden kann.
Die Maus wird etwas "eckig".

Winni

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Programm Sequenz einem CPU Kern Zuweisen.

Beitrag von Warf »

Ein riesen problem was auftauchen kann wenn prozesse threads sich selbst einer CPU zuweisen ist das wenn mehrere programme das machen, die nix voneinander wissen, hat man am ende mehrere threads die sich um den selben Kern schlagen und hat effektiv ein bottleneck geschaffen wo normalerweise keins wäre.
MMn. macht es daher viel mehr sinn statt das programme das selbst machen, das der User einfach in der lage ist die kerne per hand zuzuweisen, für Linux gibts es da das kommandozeilen tool taskset: https://www.looklinux.com/how-to-run-pr ... -in-linux/
So muss sich das programm darüber keine sorgen machen und wenn der user denkt er braucht das kann er die kerne zuweisen undzwar so das sich keine programme drum schlagen
Winni hat geschrieben:
Di 15. Dez 2020, 22:02
Nur am Rande:
Wer alle seine Kerne/Threads unter Vollast sehen will, der muss ZPAQ benutzen.
Euklid hat ein User-Interface hier im Forum vorgestellt.
Wenn man was mit makefiles kompiliert, können sachen die keine dependencies haben parallel kompiliert werden mit -j jobs.

Z.b. wenn ich llvm kompiliere macht mit "make -j $(nproc)" automatisch auf allen cpus und bei meinen 12 kernen ist dann die compilezeit von 3 stunden oder so auf 20 minuten runter (man braucht natürlich auch genug RAM sonst schmiert einen der ganze rechner ab xD). Dabei ist der rechner aber dann praktisch gänzlich unbenutzbar
Leider funktioniert das bei Lazarus nicht, da ist irgendwas im makefile kaputt das die dependencies nicht ganz korrekt sind.

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: Programm Sequenz einem CPU Kern Zuweisen.

Beitrag von Maik81SE »

Ok...
Nun habt ihr mir Angst gemacht :lol:

Nee Spaß beiseite...

werde ich mich mal hinsetzten und überlegen, ob ich das auch via TProzess lösen könnte, was ebenfall bei mir das erste wäre.

im Grunde geht es darum, das die Hardwarekommunikation von der Video-Geschichte (350 x 350 max 400 x 400, Mainform auf HDMI-1 PI4) und HD-Rendering (zB Beamer) getrennt gehandelt wird, um ein möglichst flüssiges Bild zu behalten.
also breuchte ich da wenn ich mich jetzt nicht verkalkuliere 3 Prozesse.
P1 - Hardware und Auswertung
P2 - Imageerzeugung, Redering
P3 - Clonen und Skalieren des P2-Image auf Fullscreen.

Von der Leistung her sollte mein Pi mit 4GB Ram das packen.

Ob und in wie weit ich das Aufnahme-Rendering und Twitch-Rendering mit einbinde halte ich mir erst mal offen, sollte es kommen wird dies unwegerlich P4 werden.

die Priortäten werd ich woh in die reihenfolge P2-P1-P3 setzen, wobei P3 nur Aktiv werden soll/darf, wenn auch ein Beamer oder ähnliches Bildgerät angeschlossen ist.

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Programm Sequenz einem CPU Kern Zuweisen.

Beitrag von af0815 »

Und wie soll das überhaupt funktionieren ? Auf welcher Basis ? Mir geht ein PI4 mit ein bischen 20mpx USB Kamera und Kommunikation schon an die Grenzen. IOSubsystem ist sowieso langsam. Halt alles der Preisklasse geschuldet. Nix SD, alles SSD.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten