Guten Tag in die Runde, ich bin ein absoluter Anfänger in Sachen Compiler und deren Anwendung.
Vielleicht kann mir hier jemand weiter helfen.
Die umfangreichen Quelldateien liegen mir vor.
Ich möchte daraus für unterschiedliche Targets die Exe Datei erstellen, z.B. x64 (ist bereits im Compiler vorhanden), als auch AVX, SSSE3, BMI etc. pp.
Unter Windoof ist kein Compiler im Lieferumfang - Du musst uns auch mitteilen welchen Compiler Du benutzen möchtest.
Bin wohl blind, MSVC2022 ist im Titel. Sorry.
Da kann man das in den Compiler und Linker Optionen einstellen.
Unterschiedliche Exe zu erstellen ist nicht gänzlich ohne, aber die IDE erstellt normalerweise bereits ein Debug und ein Release Build die man als Beispiel ansehen wie man Compiler und Linker Optionen einstellen kann.
z.B. x64 (ist bereits im Compiler vorhanden), als auch AVX, SSSE3,
Mach dich erstmal schlau, was das ist, was du da hingeschrieben hast!
x64 macht noch halbwegs sinn, AVX und SSE3 sind was ganz anderes, und vorallem keine Targets für die man compiliert...
AVX und SSE3 sind was ganz anderes, und
vorallem keine Targets für die man compiliert...
Das kommt durchaus drauf an. Ist nur eine Frage der Spezifikation der Software. Wenn darin steht, dass sie zum Lauf halt AVX oder SSE3 benötigt, dann ist es absolut legitim, eine entsprechendes Programm zu kompilieren (welches dann halt keine Fallbacks für den Fall der Nichtverfügbarkeit enthalten muss).
Was man aber auch bei einem solchen Programm immer einbauen sollte: Eine Laufzeitprüfung, ob die spezifizierten Anforderungen erfüllt sind. Und die sollte bei negativem Ergebnis sowohl eine aussagekräftige Fehlermeldung liefern, was genau fehlt als auch einen geordneten Exit des Programms bewerkstelligen.
An dieser simplen und überaus nützlichen Sache scheitern leider viele "Programmierer"...
Vom Visual Studio? Und was glaubst Du sonst noch so?
Die Quellen kommen natürlich nicht vom VS, sollen sich aber wohl damit übersetzen lassen.
Was wohl fehlt, sind die Metadaten für die verschiedenen Build-Targets. Deren Details liegen beim VS in den Projektdateien. Und in der Solution-Datei gibt es eine Liste der möglichen Targets.
Also entweder beschafft "Esmeralda" (wohl nur ein unfähiger und mit einiger Wahrscheinlichkeit männlicher Programmierer) neben den eigentlichen Quellen auch noch diese Metadaten oder er/sie/es muss das halt selber konfigurieren. Das kann man mit einem simplen Texteditor direkt in den entspechenden Dateien tun oder auch in dem GUI, welches die IDE dafür bereitstellt.
z.B. x64 (ist bereits im Compiler vorhanden), als auch AVX, SSSE3,
Mach dich erstmal schlau, was das ist, was du da hingeschrieben hast!
x64 macht noch halbwegs sinn, AVX und SSE3 sind was ganz anderes, und
vorallem keine Targets für die man compiliert...
Du hastvöllig recht mit deiner Aussage, habe mich falsch ausgedrückt.
AVX und SSE3 sind was ganz anderes, und
vorallem keine Targets für die man compiliert...
Das kommt durchaus drauf an. Ist nur eine Frage der Spezifikation der
Software. Wenn darin steht, dass sie zum Lauf halt AVX oder SSE3
benötigt, dann ist es absolut legitim, eine entsprechendes Programm zu
kompilieren (welches dann halt keine Fallbacks für den Fall der
Nichtverfügbarkeit enthalten muss).
Das würde ich trotzdem nicht als eigenes Target bezeichnen, sondern eher als eine Optimierungs-Option, die bestimmte CPU-Erweiterungen erfordert.
Was man aber auch bei einem solchen Programm immer einbauen sollte: Eine
Laufzeitprüfung, ob die spezifizierten Anforderungen erfüllt sind. Und
die sollte bei negativem Ergebnis sowohl eine aussagekräftige
Fehlermeldung liefern, was genau fehlt als auch einen geordneten Exit
des Programms bewerkstelligen.
Oder automatisch auf eine Version zurückfallen, die das nicht benötigt.
Wenn man in den Projekteinstellungen (also global) meinetwegen AVX2 festlegt, dann kann es schon in main, WinMain oder DllMain knallen (Illegal Instruction), wenn die ausführende CPU kein AVX2 unterstützt und der Compiler halt schon dort angefangen hat mit AVX2-Befehlen zu hantieren. Das geht schneller, als man denkt. Es ist also durchaus ratsam, nicht das komplette Projekt mit AVX2 zu kompilieren, sondern erstmal auf CPU-spezifische Dinge zu verzichten. Dann wird nur SSE2 genommen, was unter Win64 immer vorhanden ist. Einzelne (zeitkritische) Funktionen oder größere Programmteile kann man dann mit "Multi-Versioning" optimieren lassen. Für den clang-Compiler, den man ja im VS2022 problemlos nachinstallieren kann (und auch sollte, da er besser als der MS-Compiler optimiert), geht das so wie hier beschrieben:
Jetzt braucht man beim Programmstart nur noch einen CPU-Check (z.B. IsProcessorFeaturePresent) und etwas Code, der dafür sorgt, daß die Adresse der zur CPU passenden MachWas-Funktion in den "MachWasFunktionPointer" geschrieben wird.