Mulicores die zweite...

Blender3D

Blender3D

Vitamin C++
Hallo, liebes Forum.

Ich habe mal eine Frage. Wenn ich eine Anwendung auf einem Multicore-System neukompiliere, ist es dann so, dass sie automatisch alle zur verfügung stehenden Kerne nutzt?

Danke für die Antworten schonmal im Vorraus!

Grüße, Blender3D
 
Hallo, liebes Forum.

Ich habe mal eine Frage. Wenn ich eine Anwendung auf einem Multicore-System neukompiliere, ist es dann so, dass sie automatisch alle zur verfügung stehenden Kerne nutzt?

Danke für die Antworten schonmal im Vorraus!

Grüße, Blender3D

Ja und nein.

Ich hab irgendwo gelesen, das gcc immer 1 cpu nimmt, egal ob du davon 3580 stück drin hast.

Irgendein Parameter ist bei gcc dafür zuständig gcc zu sagen "hey nimm die 4". Google mal einfach.
 
Ne dasn Quark. Ein Prozess besteht aus >=1 Thread. Ein Thread kann jeweils auf einem Core laufen (bzw. gibts noch Multithreading, aber das ist ein anderes Thema). Wenn der Prozess also mit mehreren Threads laeuft (bsp. Webserver), kann dies auch ueber mehrere CPUs geschehen. Wenn der Prozess nur ein Thread hat, dann laeuft das auch nur auf einer CPU.

Ob ein Prozess immer auf der selben CPU ist, oder die CPU auch mal wechselt liegt in erster Linie am Memory und CPU Scheduler. Meistens wird der Prozess immer auf derselben CPU eingelagert da dort die richtigen Register meist schon eingelagert sind, es sei denn, eine andere CPU hat ueberhaupt nix zu tun, dann switcht auch der Prozess.

//Edit: um die Frage zu beantworten: wenn das System mehrere Cores sieht, werden die Threads auch verteilt. Es sei denn, du hast irgendwas komisches rumgewuschelt was bei Linux hald moeglich ist :).
 
Zuletzt bearbeitet:
Ich hab das irgendwo gelesen wegen gcc, und werd es auch wieder suchen...;)
 
das Ubuntuusers Wiki sagt
Hinweis:
Auf Rechnern mit mehr als einem CPU-Kern kann man die Compilierung oft erheblich beschleunigen, indem man make -j statt make ausführt.
 
Hmm... und wie kann ich ein Programm dazu veranlassen, dass es z.B. immer 4 oder 8 Threads belegt, dass diese dann auf alle Kerne ausgelagert werden?

Grüße, Blender3D
 
das Ubuntuusers Wiki sagt

Das beantwortet aber keine Frage hier. In dem Fall wird gcc einfach paralell kompilieren und nicht seriell ein File nach dem anderen. Das Linken setzt am Schluss ja das Binary zusammen (IMHO).

@blender3d:
Das kannst du meistens gar nicht beeinflussen. Entweder wurde eine Applikation Multithreaded programmiert, oder nicht. Wenn sie Multithreaded programmiert wurde, gibt es immernoch min. 2 Typen von Applikationen:

Die, bei denen alle Threads dasselbe erledigen:
Bsp. Webserver -> User connected, Requests wird in einen Thread ausgelagert der explizit diesen User bedient, hier macht jeder Thread dasselbe. Die Threads sind untereinander nicht verbunden/müssen nicht kommunizieren.

...oder aber es werden einzelne, voneinander abhängige Subsysteme ausgelagert:
Bei Spielen wie HL2 kann dies beispielsweise die Physikengine oder Künstliche Intelligenz sein, die in seperaten Threads laufen. Diese müssen koordiniert sein (ist bei HL2 ein "Koordinator"-Thread) da die Aufgaben der Threads ja unterschiedlich schnell beendet sein können. Hier kannst du nicht aussuchen, ob und wieviele Threads du haben willst, das ist einfach die Softwarearchitektur die es vorgibt.

Wenn du eine Applikation wie einen Webserver hast, dann kannst du oftmals in den Einstellungen sagen, ob Threads voralloziiert oder laufend erstellt werden sollen, wieviele Threads das Maximum ist etc. pp. Schau dir mal das Apache2-Konfigfile an - dort wirst du vieles antreffen das ich hier erklärt habe.

Ggf. gibt es Ressource-Capping Tools fuer Linux, bei welchen du Limitte gibst wie "Prozess A darf nur 90% CPU Last generieren" bzw. "Prozess A laeuft immer auf Prozessor B".

Was genau hast du denn vor?
 
Jetzt habe ich allerdings Blender, dessen Renderer für Multithreads programmiert wurde und dessen Physik etc. nicht. Daher wollte ich wissen, ob ich z.B. durch eine Compileroption den Kompiler veranlassen kann, dass er das Programm in Threads aufteilt.

Grüße, Blender3D
 
Das beantwortet aber keine Frage hier. In dem Fall wird gcc einfach paralell kompilieren und nicht seriell ein File nach dem anderen. Das Linken setzt am Schluss ja das Binary zusammen (IMHO).

oh, sorry, hab den Part mit dem Kompilieren, den der Threadsteller angesprochen hat so verstanden, ob man denn auf mehreren Kernen kompilieren kann.
Bin irgendwie in letzter Zeit echt nicht der Hellste. :(
 
Nun es ist ja so: Das Programm kommt als Binary raus und dein OS lässt es laufen.

Bei mehr CPUs hat dein OS nun die Qual der Wahl auf welchen es dieses Laufen lässt.
Nimmt man OPENMP oder ähnliche Sachen wird der Code schon so aufbereitet, dass er auf mehreren CPUs laufen kann.
Hast du in deiner Anwendung nun mehrere (OS-)Threads, dann kennt das OS diese und kann sie auf die CPUs verteilen.

In kurz:
Solange ein Programm nicht auf Multicore getrimmt/geschrieben wurde, bringt dem Programm die vielen Kerne gar nix.


Und noch ein Wörtchen am Rande.
Echtzeitanwendungen sind auf einem Core immer noch etwas schneller als verteilt.
Hingegen kann ein Server auf mehreren Cores richtig rocken.
(Kommt halt immer drauf an, wie viele Daten das Programm "zwischen sich" austauschen muss. Stichwort: Synchronisation).

Ach ja und um auf deine Frage zu antworten: Nein.
 

Ähnliche Themen

Script pausieren bis Bedingung erfüllt ist

Verbindung zwischen /opt/{appdir} und /ext/opt/{appdir}

Keine grafische Oberfläche (Debian Installation)

iptables Konfigurationsdatei

Welches Linux/Unix für ehemaligen OSX Nutzer?

Zurück
Oben