Wissenschaftliches Programmieren mit C - Welcher Compiler



  • Hallo.

    Ich schreibe gerade ein Programm zur numerischen Berechnung von Feldgleichungen. Das ist extrem Rechenaufwändig - ein Durchlauf dauert (bei professionellen, kommerziellen und parallelisierten Programmen) gut und gerne mal zwei drei Stunden, aber auch Tage oder sogar Wochen - open End. Dabei spielt auch Parallelisierung eine große Rolle.

    Welche Compiler verwendet man für wissenschaftliches Programmieren unter C? Ich nutze bisher LCC und TCC CompilerL LCC kommt mir eher langsam vor. TCC ist echt schnell, aber er beinhaltet standardmäßig keine Parallelisierung.

    In dem Buch "OpenMP" von den Autoren "S. Hoffmann" und "R. Leinhart" werden neben Visual Studio C++ nur der GCC Compiler als kostenfreie Compiler, mit Unterstützung von OpenMP (ohne Anspruch auf Vollständigkeit). Visual C++ möchte ich aber nicht nutzen, da es durch die Laufzeitcompilierung nicht so schnell ist und sich daher (aus meiner Sicht - bitte korrigiert mich) für reine Kommandozeilenbasierte Programmierung nicht so eignet.

    Meine Frage: Welche Compiler werden für wissenschaftliches Programmieren unter C verwendet. Man findet dazu in der Regel nur zu Fortran eine Antwort... aber ich will das einfach in C machen.

    Grüße,
    CJens



  • CJens schrieb:

    Visual C++ möchte ich aber nicht nutzen, da es durch die Laufzeitcompilierung nicht so schnell ist und sich daher (aus meiner Sicht - bitte korrigiert mich) für reine Kommandozeilenbasierte Programmierung nicht so eignet.

    Laufzeitkompilierung? Ich glaub du hast da was falsch verstanden. Visual C++ ist ein ganz normaler C++ Compiler der nicht nur OpenMP unterstützt, sondern z.B. auch C++ AMP, auf das du vermutlich auch mal einen Blick werfen möchtest. Wenn es sich um extrem gut parallelisierbare Probleme handelt, dann solltest du dir unbedingt auch mal CUDA anschauen.



  • Zuerst einmal: greife wenn möglich auf spezialisierte Softwarepakete für die Berechnung der unterliegenden Mathematik zurück. Schreibe keine Matrix-Matrix-Multiplikation selbst, weil das "nur ein paar Zeilen" sind. Wenn du das hast, dann kann der Compiler meiner Erfahrung nach nicht mehr viel anstellen. Und eventuell bringen dir diese Bibliotheken direkt Parallelisierung mit.



  • ...hab mir das von CUDA auf Wikipedia durchgelesen. Also, das Problem ist nicht einfach parallelisierbar. Es muss ein lineares Gleichungssystem der Größe NxN; N>10 000 000 gelöst werden, wobei die Matrix nur in der Nähe der Diagonalen besetzt ist. Dafür gibt es spezielle Verfahren (Incomplette LU Zerlegung (ILU(0))). Das Problem wird räumlich unterteilt, und es findet kein so großer Austausch unter den Prozessen statt außer, dass einige Einträge in der Matrix doppelt gerechnet werden (in den unterschiedlichen Prozessen).

    Also, wenn ich auf .NET Biblioteken verzichte, wird mit Visual C++ alles voll kompiliert? Also, sorry wenn ich frage, aber ich lese gerade ein Buch darüber und habe auf diese Frage die Antwort irgendwie nicht gefunden. Wenn ich auf .Net Biblioteken komplett verzichte, und ein reines Kommandozeilenprogramm schreibe (printf(), etc.), dann wird das voll kompiliert und es ist auch nicht unbedingt das Vorhandensein von .Net Framework auf dem Rechner nötig?

    Danke, das ist eine wichtige Frage für mich.
    CJens



  • .NET in C++ ist rein prinzipiell unmöglich; wenn du .NET verwendest, dann kann es nicht sein, dass du C++ programmierst. Höchstwahrscheinlich programmierst du dann in C++/CLI, was eine andere Sprache ist. Der Visual C++ Compiler unterstützt beides. Wenn du ein normales Win32 Konsolenprojekt anlegst, dann wird dein Code als normales C++ zu einer nativen exe kompiliert...

    CJens schrieb:

    ...hab mir das von CUDA auf Wikipedia durchgelesen. Also, das Problem ist nicht einfach parallelisierbar. Es muss ein lineares Gleichungssystem der Größe NxN; N>10 000 000 gelöst werden, wobei die Matrix nur in der Nähe der Diagonalen besetzt ist.

    https://developer.nvidia.com/cublas 😉



  • otze schrieb:

    Zuerst einmal: greife wenn möglich auf spezialisierte Softwarepakete für die Berechnung der unterliegenden Mathematik zurück. Schreibe keine Matrix-Matrix-Multiplikation selbst, weil das "nur ein paar Zeilen" sind. Wenn du das hast, dann kann der Compiler meiner Erfahrung nach nicht mehr viel anstellen. Und eventuell bringen dir diese Bibliotheken direkt Parallelisierung mit.

    Hallo otze,

    Du hast natürlich total recht - es gibt für diese Lösungen fertige Mathematik Pakete, wo Dinge wie komprimierte Zeilenspeicherung und optimaler Datenzugriff, parallelisiert vorliegen. Mir geht es allerdings darum, dass ich eigentlich genau das lernen möchte und daher das einmal Zufuß lösen will - dann werde ich sicher auch auf solche optimierten Pakete zurückgreifen.

    CJens



  • dot schrieb:

    .NET in C++ ist rein prinzipiell unmöglich; wenn du .NET verwendest, dann kann es nicht sein, dass du C++ programmierst. Höchstwahrscheinlich programmierst du dann in C++/CLI, was eine andere Sprache ist. Der Visual C++ Compiler unterstützt beides. Wenn du ein normales Win32 Konsolenprojekt anlegst, dann wird dein Code als normales C++ zu einer nativen exe kompiliert...

    👍

    Programmiere beides parallel, aber eben nebenher. Einmal mit dem TCC Compiler (bisher, seriell) den reinen C (nicht C++) Löser und einmal mit Visual Studio C++ 2010 (mit CLI) für die grafische Oberfläche, wobei ich dann auch Klassen benutze, die ich im Löser aufgrund Performance nicht verwende.



  • C++/CLI war niemals und ist nicht für GUI Entwicklung gedacht; Microsoft selbst rät davon ab, es dafür zu verwenden. Wenn du GUIs mit .NET bauen willst, dann mach das z.B. in C#...

    Der einzige Anwendungsfall von C++/CLI ist Interop zwischen .NET und native Code.



  • CJens schrieb:

    Ich schreibe gerade ein Programm zur numerischen Berechnung von Feldgleichungen. Das ist extrem Rechenaufwändig - ein Durchlauf dauert (bei professionellen, kommerziellen und parallelisierten Programmen) gut und gerne mal zwei drei Stunden, aber auch Tage oder sogar Wochen - open End.

    Hi

    Könntest du mir sagen (Neugier meinerseits) was du für Feldgleichungen untersuchst und mit welchen Methoden du dies machst? Ich nehme an du hast partielle DGL mit Randbedingungen. Programmierst du dann mit Finiten Element oder Volumen Methoden?

    Gruß



  • Herbststurm schrieb:

    Hi

    Könntest du mir sagen (Neugier meinerseits) was du für Feldgleichungen untersuchst und mit welchen Methoden du dies machst? Ich nehme an du hast partielle DGL mit Randbedingungen. Programmierst du dann mit Finiten Element oder Volumen Methoden?

    Gruß

    Hi.

    Hab mit der Poisson Gleichung oder genauer der Laplace Gleichung begonnen, möchte jetzt den konvektiven Therm mit einbauen um zur allgemeinen Transportgleichung zu gelangen. Am Ende soll die Navier-Stokes Gleichung auf 2D unstrukturierten, N-Eckigen Flächenelementen mit der FVM Methode gelöst werden.

    Mir ist aber dabei wichtig, dass ich es wirklich selbst mache. Sollte das Ganze am Ende klappen, würde ich auch externe Pakete einbinden - aber einmal will ich es von Anfang bis Ende selbst schreiben - auch wenn da nicht alles optimal wird.

    Gruß,
    CJens



  • Machs einmal selber, dann leg das beiseite und guck dir Open-Source Software an, z.B. OpenFoam.

    Und an deiner Stelle würd ich auch mit strukturierten Gittern anfangen, oder willst du einen Gittergenerator auch noch implementieren?



  • ...ich arbeite bei einem ANSYS Distributor und ich versuche hier nicht ein Konkurrrenzprodukt zu schreiben. Aber wie es prinzipiell geht, weiß ich ja. Ich will ein Programm schreiben, das auch große Gitter verarbeiten kann - dann lege ich es auch wieder weg 🙂

    Ich sehe darüber hinaus keinen großen Vorteil von strukturierten Gittern. Es sollen ja reale Probleme im 2D gelöst werden. Klar, die Interpolationsroutinen, die Flusssummierung... das ist ETWAS einfacher. Aber das ganze Gitterhandling (was wirklich sehr kompliziert war) funktioniert jetzt. Würde ich nochmal von vorne anfangen... würde ich Deinen Rat befolgen 🙂

    Gitter lese ich von externen Softwaretools ein (ICEM - Nastrangitter - das funktioniert auch schon alles).


Anmelden zum Antworten