Grundlagenfrage zu OpenGL/CL/AL
-
Moin moin,
ich arbeite zwar jetzt schon seid über 4 Jahren mit den oben genannten Bibliotheken, habe mir aber schon immer die Frage gestellt, ob und wie überhaupt
Programme mit bestimmten Abhängigkeiten laufen, wenn diese Abhängigkeiten fehlen.
Sprich, was mach ein auf dem Stream SDK compiliertes Programm, wenn es plötzlich kein OpenCL mehr gibt?Startet es dann garnicht oder läuft es nur solange wie ich die Klassen, Methoden etc. nicht benutze oder wie ist das geregelt?
Oder tritt das Problem wegen der dynamischen Bindung von Ressourcen überhaupt gar nicht erst auf?
-
4 Jahren mit den oben genannten Bibliotheken
Probiere es aus.
Normalerweise startet das Programm nicht, wenn die Bibliothek nicht gefunden wurden.
-
wenn es plötzlich kein OpenCL mehr gibt
Warum sollte es plötzlich kein OpenCL mehr geben ?
Normalerweise startet das Programm gar nicht erst wenn die Abhängigkeit nicht vorhanden ist, es sei denn die Bindung ist rein dynamisch, das ist aber sehr selten.
Falls du jetzt allerdings von C# ausgehst startet das Programm auch ohne die Abhängigkeiten, Probleme gibt es erst wenn du eine der Funktionen aufrufst.
Aber irgendwann wird dein Programm so oder so crashen, weil es ja etwas braucht was nicht vorhanden ist.
-
DarkShadow44 schrieb:
Warum sollte es plötzlich kein OpenCL mehr geben ?
Weil der Anwender beispielsweise kein OpenCL oder Stream SDK installiert hat und die CL Komponenten wahlweise zugeschaltet werden können.
DarkShadow44 schrieb:
Normalerweise startet das Programm gar nicht erst wenn die Abhängigkeit nicht vorhanden ist, es sei denn die Bindung ist rein dynamisch, das ist aber sehr selten.
Kann man denn sowas machen, wenn CL oder AL optional genutzt werden kann? Und jetzt nicht unbedingt über ein compiler flag
DarkShadow44 schrieb:
Falls du jetzt allerdings von C# ausgehst startet das Programm auch ohne die Abhängigkeiten, Probleme gibt es erst wenn du eine der Funktionen aufrufst
C# ist ja auch CLR basiert und lädt den Kram zur Laufzeit, wäre zwar schön aber wird in C++ wohl so ohne weiteres nicht machbar sein, ausser mit loadlibrary aber dann fehlen ja trotzdem abhängikeiten
-
Was erwartest du dass ein Programm macht, wenn es OpenGL/D3D nicht findet?
-
Weil der Anwender beispielsweise kein OpenCL oder Stream SDK installiert hat und die CL Komponenten wahlweise zugeschaltet werden können.
Naja normalerweise verwendet man entweder OpenCL oder nicht. Und wenn du wirklich Berechnungen von OpenCL brauchst kann die Anwendung ohne nicht laufen.
Kann man denn sowas machen, wenn CL oder AL optional genutzt werden kann? Und jetzt nicht unbedingt über ein compiler flag
-
wenn ich etwas veroeffentlichen will, packe ich es dann eh in eine eigene DLL, oft hab ich eh eine version die fuer individuelle platformen spezialisiert ist. dann kann ich z.b. Cuda nehmen wenn eine NVidia karte vorhanden ist, OpenCL nehmen wenn eine AMD hardware vorhanden ist und auf Intel dann eine CPU version von OpenCL oder es halt emulieren.
welche version meiner DLL geladen wird, haengt dann von der einstellung und den faehigkeiten des PCs ab.
ich kann mich nicht mehr richtig entsinnen, aber ich glaube http://libsh.org/ hat auch fallback moeglichkeiten angeboten (ist aber jahre her dass ich mir das ansah), muesstest du dir selbst ansehen.
-
heee schrieb:
Was erwartest du dass ein Programm macht, wenn es OpenGL/D3D nicht findet?
dann bleibt der bildschirm schwarz
DarkShadow44 schrieb:
Klar. Schau mal hier und hier.
Also sagen wir mal ich hätte ein template für eine klasse, die einen Funktionspointer enthält und eine bestimmte signatur.
wenn ich den artikel richtig verstanden habe, kann ich mittels loadlibrary und getprocaddress das entsprechende funktionshandle erhalten und die methode nutzen und später wieder entladen richtig?
Also kann ich dann sagen "Du hast kein opencl also benutze normalen modus, oh doch opencl, dann nutze die hardwarebeschleunigung für dieses jenes was auch immer"
-
Also sagen wir mal ich hätte ein template für eine klasse, die einen Funktionspointer enthält und eine bestimmte signatur.
Warum template ? Halt einfach eine Wrapper-Klasse für die Funktionen aus der Dll.
Funktionshandle erhälst du keins, nur die Adresse. Wenn du die dann einem Funktionspointer zuweist kannst du die Funktion über den Pointer aufrufen.
Die Klasse kann dann ja noch eine Funktion haben die zurückgibt ob die Dll erfolgreich geladen wurde, dann kannst du für beide Fälle einen entsprechenden Programmpfad einbauen.