DITTY Geschrieben 23. Oktober 2009 Geschrieben 23. Oktober 2009 (bearbeitet) Hallo COM, ich suche jetzt schon eine Ewigkeit und finde einfach keine Lösung. Ich programmiere unter Linux mit GCC (C++) und verwende diese Header-Files: #include <sys/time.h> #include <sys/resource.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/stat.h> #include <unistd.h> #include <sched.h> #include <stdlib.h> #include <signal.h> #include <errno.h> #include <dirent.h> #include <syslog.h> #include <pthread.h> #include <semaphore.h> using namespace std; Prozesse oder Threads zu erzeugen und aufeinander abzustimmen ist nicht das Problem. Ich bin auf der Suche, nach Funktionen, Libs, Frameworks, API´s, welche mir folgendes ermöglichen: 1.) Ansprechen von CPU-Kernen 2.) Herausfinden, welcher CPU-Kern auch ein physischer und welcher nur ein logischer CPU-Kern ist (HT) 3.) Prozessen (startende und laufende) gezielt auf einzelne CPU-Kerne verteilen. 4.) Threads (startende und laufende) gezielt auf einzelne CPU-Kerne verteilen. Was gibt es da für Möglichkeiten, Funktionen, API-Aufrufe, etc. etc.? Ich werde diesbzgl. einfach nicht fündig. Ich finde nur Tut´s, Bücher und Co. welche sich mit der Thematik Multiprocessing / Multithreading befassen, aber nicht, wie man Prozesse und Threads manuell auf CPU-Kerne verteilen kann, also nicht vom OS automatisiert. Unter Windows (Taskmanager) und Linux gibt es ja die Möglichkeit, schön komfortabel über eine grafische Oberfläche bzw. Shell. Ich möchte aber gerne etwas eigenes programmieren und gewisse Dinge automatisieren lassen (nicht vom OS). Mir fehlen einfach Funktionen, API-Aufrufe etc., welche ich verwenden könnte. Ich würde es ja auch mit Assembler versuchen, aber da weiß ich auch nicht genau, wie ich gezielt einzelne CPU-Kerne ansprechen kann. Wenn Windows und Linux selbst soetwas schon anbieten, muss es doch System-API´s geben, die das ermöglichen. Denn selbst mit Assembler, müsste ich für jeden CPU-Typ und CPU-Modell ein Programm schreiben. Wär echt super, wenn dazu jemand mehr weiß und mich / uns von seiner Weißheit teilhaben lässt. Gruß DITTY :) Bearbeitet 23. Oktober 2009 von DITTY Zitieren
flashpixx Geschrieben 23. Oktober 2009 Geschrieben 23. Oktober 2009 1.) Ansprechen von CPU-Kernen 2.) Herausfinden, welcher CPU-Kern auch ein physischer und welcher nur ein logischer CPU-Kern ist (HT) 3.) Prozessen (startende und laufende) gezielt auf einzelne CPU-Kerne verteilen. 4.) Threads (startende und laufende) gezielt auf einzelne CPU-Kerne verteilen. Message Passing Interface ? Wikipedia dazu gibt es dann diverse Bibliotheken für die entsprechenden OS (OpenMPI, MPI CH2, MS MPI) Für Windows alternativ Distributed Component Object Model ? Wikipedia Mir fehlen einfach Funktionen, API-Aufrufe etc., welche ich verwenden könnte. Wenn Windows und Linux selbst soetwas schon anbieten, muss es doch System-API´s geben, die das ermöglichen. Denn selbst mit Assembler, müsste ich für jeden CPU-Typ und CPU-Modell ein Programm schreiben. Da Du schon ähnliche Threads gestellt hast, möchte ich Dich darauf hinweisen, dass parallele Programmierung nicht trivial ist und sehr viel Wissen bezügl optimierter Algorithmen erfordert. Nur weil ein Algorithmus parallel laufen kann, wird er nicht "besser" bzw "schneller", siehe dazu Amdahlsches Gesetz ? Wikipedia Zitieren
DITTY Geschrieben 23. Oktober 2009 Autor Geschrieben 23. Oktober 2009 Besten Dank. Jetzt hab ich etwas, wo ich mich näher beschäftigen kann. Zwei Fragen habe ich aber noch. 1.) Ich werde mich jetzt zwar einlesen, aber wenn mir trotzdem noch jemand gute Bibliotheken und API-Aufrufe (am besten Linux) bzgl. des Themas ans Herz legen kann, wär ich sehr dankbar. 2.) Kann man mittels MPI und DCOM auch erkennen, welcher der Kerne ein echter physischer Kern und welcher nur ein logischer (HT) Kern ist oder gibts da keine Möglichkeiten? THX nochmal und Gruß DITTY :) PS: Im Moment geht es mir nicht darum ein Programm schneller zu machen, sondern mehrere Jobs schnellstmöglich parallel abarbeiten zu lassen, was ja möglich ist, wenn man gezielt die CPU-Kerne ansprechen kann. Ich möchte damit erstmal die Lasten auf viele Kerne verteilen (ich glaube man nennt das Skalierung auf die CPU-Kerne). Zitieren
flashpixx Geschrieben 23. Oktober 2009 Geschrieben 23. Oktober 2009 Ich werde mich jetzt zwar einlesen, aber wenn mir trotzdem noch jemand gute Bibliotheken und API-Aufrufe (am besten Linux) bzgl. des Themas ans Herz legen kann, wär ich sehr dankbar. Warum wiederholst Du Deine Frage? Die Antwort hast Du erhalten Kann man mittels MPI und DCOM auch erkennen, welcher der Kerne ein echter physischer Kern und welcher nur ein logischer (HT) Kern ist oder gibts da keine Möglichkeiten? Was nützt Dir eine Unterscheidung zwischen Core und CPU? Dein Problem wird auf einem Core berechnet, wie viele Cores ein CPU hat ist unerheblich für die Berechnung. PS: Im Moment geht es mir nicht darum ein Programm schneller zu machen, sondern mehrere Jobs schnellstmöglich parallel abarbeiten zu lassen, was ja möglich ist, wenn man gezielt die CPU-Kerne ansprechen kann. Ich möchte damit erstmal die Lasten auf viele Kerne verteilen (ich glaube man nennt das Skalierung auf die CPU-Kerne). Hast Du das Gesetz von Amdahl verstanden? Wenn Du mehrere Jobs hast, kann es sogar sein, dass Dein paralleler Algorithmus schlechter ist, als ein sequentieller. Du hast Dir Gedanken über SPMD und der daran geknüpften Speichertechnologie Shared memory vs Distributed memory gemacht? Alternativ kann man Probleme auch über streaming memory access wie sie in der GPU Technik verwendet werden lösen. Je nach Problemstellung gibt es auch diverse Bibliotheken wie BLAS, PETSc oder ATLAS. Alternativ bieten die CPU Hersteller auf die Hardware optimierte Bibliotheken. Du versucht analog zu Deinen anderen Threads das Problem wieder einfach durch den Einsatz irgendwelcher Bibliotheken erschlagen zu können. Der Einsatz von paralleler Programmierung ist recht komplex und fordert ein entsprechendes Verständnis für das Problem und verschiedener Lösungsstrategien. Zitieren
DITTY Geschrieben 23. Oktober 2009 Autor Geschrieben 23. Oktober 2009 OK, ok, dass dürfte für´s Erste reichen. Jetzt habe ich ein paar Anhaltpunkte. Wie ich schon sagte, natürlich werde ich mich über das genannte informieren. Aber es kann ja nicht schaden, dass hin-und-wieder trotzdem Jemand etwas dazu postet, schließlich bin ich nicht der Einzige, der gerne etwas Mehr darüber erfahren möchte. Weitere TIPPS, Quellen und Namen (API, Funktionen, Libs, etc.) können nicht schaden und sind gerne willkommen. Aus diesem Grunde lasse ich mal diesen Thread hier offen stehen. Hier können auch andere sich zum Thema auslassen und fleißig (weiter-)diskutieren. Warum wiederholst Du Deine Frage? Die Antwort hast Du erhalten Ich habe mich nicht wiederholt, sondern um nähere Details gebeten. Auch wenn diese mir im Moment vielleicht nicht mehr sagen, so wäre es wenigstens etwas für die Zukunft oder jetzt etwas für all die jenigen, welche bereits schon soweit sind. Ich danke aber trotzdem. Was nützt Dir eine Unterscheidung zwischen Core und CPU? Dein Problem wird auf einem Core berechnet, wie viele Cores ein CPU hat ist unerheblich für die Berechnung. Ein physischer Core ist nunmal ein physischer und ein logischer ein logischer. Und wenn es sich dabei nur um ein Benchmark-Programm handeln soll. Es geht mir darum, um herauszufinden, wie man programmiertechnisch das herausfinden kann. Von Gebrauch und Nicht-Gebrauch ist noch garnicht die Rede. Du versucht analog zu Deinen anderen Threads das Problem wieder einfach durch den Einsatz irgendwelcher Bibliotheken erschlagen zu können. Natürlich, warum das Rad jedesmal neu erfinden? Was spricht dagegen? Wenn schon irgendwelche Bibliotheken und / oder API´s von OS´s Derartiges anbieten, warum sollte man darauf nicht zurückgreifen können? Im Übrigen geht das auch nicht anders, egal was man verwendet, entweder ist es eine Bibliothek (Std, uvm.), eine DLL oder vom OS bereitgestellte Möglichkeiten. Wer gerne noch hardwarespezifischer Programmieren möchte, kommt wohl um Assembler nicht drumherum. Aber hier geht es in erster Linie um C++. Alternativ bieten die CPU Hersteller auf die Hardware optimierte Bibliotheken. Ich kann mich irren, bitte korregiert mich, aber setzen solche zugeschnittenen / optimierten Bibliotheken nicht zugehörige Entwickler-Tools, z.B. Assembler, Linker, Debugger, Compiler, etc. voraus? Genau das möchte ich mir nämlich ersparen. Ich möchte möglichst immer die selben Tools anwenden, vorzugsweiße die GNU-Tools (in C++ halt GCC). Ich für meinen Teil werde Bisheriges zusammentragen und erstmal fleißig alles / vieles einstudieren. Bei Fragen werde ich gerne nochmals melden. Man schreibt sich! ;-) Besten Dank nochmal und Gruß DITTY :):) Zitieren
flashpixx Geschrieben 23. Oktober 2009 Geschrieben 23. Oktober 2009 (bearbeitet) Ich habe mich nicht wiederholt, sondern um nähere Details gebeten. Deine Fragen zielen auf fertige Lösungen ab, außerdem solltest Du in der Lage sein, diverse Sachen Dir selbst an zu eignen und wie gesagt, dieses Themengebiet ist nicht trivial Ein physischer Core ist nunmal ein physischer und ein logischer ein logischer. Mehrkernprozessor ? Wikipedia Der Begriff Mehrkernprozessor (auch Multicore-Prozessor oder Multikernprozessor) bezeichnet einen Mikroprozessor mit mehr als einem vollständigen Hauptprozessor auf einem einzigen Chip. zeigt einmal mehr Deine begrenzte Sichtweise. Außerdem geht es bei Parallelisierung sicherlich nicht um ein einziges Multicoresystem, sondern um einen Cluster mit mehreren Multicores Wenn schon irgendwelche Bibliotheken und / oder API´s von OS´s Derartiges anbieten, warum sollte man darauf nicht zurückgreifen können? Im Übrigen geht das auch nicht anders, egal was man verwendet, entweder ist es eine Bibliothek (Std, uvm.), eine DLL oder vom OS bereitgestellte Möglichkeiten. Wer gerne noch hardwarespezifischer Programmieren möchte, kommt wohl um Assembler nicht drumherum. Aber hier geht es in erster Linie um C++. Nein es geht um Konzepte. Dir wird der Einsatz eine Bibliothek nichts bringen, wenn Du sie nicht verstehst anzuwenden bzw auch Dein Problem nicht so abstrakt formulieren kannst, dass es in Deinem Fall parallel lösbar ist. Wie schon gesagt, Du kannst nur bis zu einem gewissen Grad parallelisieren und auch hier gibt es je nach Problemstellung eine Vielzahl von Lösungsmöglichkeiten. Ich kann mich irren, bitte korregiert mich, aber setzen solche zugeschnittenen / optimierten Bibliotheken nicht zugehörige Entwickler-Tools, z.B. Assembler, Linker, Debugger, Compiler, etc. voraus? Du irrst, da Du Dich bisher noch nicht einmal selbstständig mit den genannten Dingen befasst hast. Genau das möchte ich mir nämlich ersparen. Ich möchte möglichst immer die selben Tools anwenden, vorzugsweiße die GNU-Tools (in C++ halt GCC). Du solltest erst einmal lernen die Tools überhaupt zu nutzen, bevor Du Dir über Parallelisierung Gedanken machst. Dir nützt eine Bibliothek gar nichts, wenn Du nicht Deinen Algorithmus entsprechend parallelisieren kannst, z.B. wirst Du zustimmen, dass bei einem Skalarprodukt die Parallelisierung niemals 100% betragen kann. Bearbeitet 23. Oktober 2009 von flashpixx Zitieren
DITTY Geschrieben 23. Oktober 2009 Autor Geschrieben 23. Oktober 2009 Zitat: Zitat von DITTY Beitrag anzeigen Ich kann mich irren, bitte korregiert mich, aber setzen solche zugeschnittenen / optimierten Bibliotheken nicht zugehörige Entwickler-Tools, z.B. Assembler, Linker, Debugger, Compiler, etc. voraus? Du irrst, da Du Dich bisher noch nicht einmal selbstständig mit den genannten Dingen befasst hast. Ich zitiere mich einfach mal: "korregiert mich, wenn ich falsch liegen sollte". Aber doch, damit habe ich mich schon beschäftigt. Allein Intel bietet eine eigene Bibliothek an und erwähnt sogar den Einsatz ihres eigenen OpenSource-Compilers. Ob auch der GCC diese kompilieren kann, weiß ich nicht. Und wenn wir schon auf Grafikkarten zu sprechen kommen. Auch NVIDIA und ATI bieten eigene Lösungen. Im Falle von NVIDIA CUDA. Um Missverständnisse aus dem Weg zu räumen, mir geht es bei diesem Thread in erster Linie um Multicore/Multiprocessing/Multithreading-Programmierung bzgl. CPU´s-only, nicht gleich Cluster-Systeme oder steckt dahinter die selbe Logik bzw. gar Technik, nur auf engeren Raum? Und, natürlich ist mein Verständnis diesbzgl. noch nicht SO groß, darum ersuche ich hier ja um Rat, und um Quellen, Hinweise, Namen, etc. Wie gesagt, dass soll jetzt kein Streitthema werden. Ich lasse daher einfach den Thread noch für mich und andere einfach so im Raum stehen. Bitte keine ewig langen Diskussionen anfangen, wenn keine wirklichen Fragen mehr sind. Weitere Quellen, Hinweise, Tipps und Tricks, sowie Namen (Bibliotheken, API-Ãufrufe, etc.) sind herzlich willkommen. flashpixx, Du hasst da schon viel in den Raum geworfen, wofür ich sehr dankbar bin. z.B. wirst Du zustimmen, dass bei einem Skalarprodukt die Parallelisierung niemals 100% betragen kann. Ja, dem stimme ich zu. Gruß DITTY :) Zitieren
flashpixx Geschrieben 23. Oktober 2009 Geschrieben 23. Oktober 2009 Um Missverständnisse aus dem Weg zu räumen, mir geht es bei diesem Thread in erster Linie um Multicore/Multiprocessing/Multithreading-Programmierung bzgl. CPU´s-only, nicht gleich Cluster-Systeme oder steckt dahinter die selbe Logik bzw. gar Technik, nur auf engeren Raum? Kennst Du Wikipedia? Mehrkernprozessor ? Wikipedia Multithreading ? Wikipedia Mehrprozessorsystem ? Wikipedia Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.