headers OpenCL .cl-Datei
Ich geschrieben habe, ein OpenCL-kernel in einen .cl
- Datei. Es wird versucht #include
mehrere Header.
Seine Kompilierung fehlschlägt, da das enthaltene header-Dateien werden "nicht gefunden".
Ich bin mir bewusst, dass clBuildProgram
können die -I dir
option fügt das Verzeichnis dir
zu der Liste von Verzeichnissen, die durchsucht wird, die header-Dateien.
In der khronus Website forum dieser Beitrag http://www.khronos.org/message_boards/viewtopic.php?f=37&t=2535 Gespräche über das Thema.
Sie vorschlagen, zu verwenden clCreateProgramWithSource
die gibt alle Quellen (einschließlich .h-Dateien).
Ich habe eine Fragen zu diesem Problem:
- Welche option ist besser? (
clBuildProgram
vs.clCreateProgramWithSource
wie oben beschrieben) - Wenn ich
clCreateProgramWithSource
wie weiß der compiler wissen, was zu gehören? Ich meine, die Quelle steht für die enthaltenen Dateinamen? - Wenn ich
clBuildProgram
und es gibt mehrere Verzeichnisse mit Dateien enthalten, wie kann ich Sie angeben?
InformationsquelleAutor Yakov | 2013-01-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
OpenCL erfordert, dass Sie verwenden
clCreateProgramWithSource()
gefolgt vonclBuildProgram()
.ClCreateProgramWithSource()
erstellt und gibt einencl_program
Objekt.Dass
cl_program
Objekt ist input inclBuildProgram()
.clBuildProgram()
können Sie angeben, compiler-Optionen die include-die include-DateiVerzeichnisse. In Ihrem Fall, für die header-Datei beinhaltet, es wird so etwas wie die string:
Den der compiler verwendet, ist die internen OpenCL-compiler in der OpenCL SDK, die Sie verwenden. Also, wenn Sie
mit der AMD-SDK, die AMD OpenCL-compiler, einen Teil Ihrer OpenCL SDK verwendet werden. Ebenfalls für Nvidia oder Intel.
Ist es wichtig zu überprüfen, die OpenCL-status-code für ALLE OpenCL - Funktion aufruft.
Dies ist zwingend für
clCreateProgramWithSource()
undclBuildProrgam()
zu bekommenjeder compiler-Fehler oder Meldungen. Es ist eine ganz andere bit-code zu schreiben
um die Größe der Nachrichten ab und rufen dann die Nachrichten selbst.
InformationsquelleAutor Tim Child
Den Nvidia-OpenCL-device-Treiber haben einen bug bei Verwendung von-I mit einer bestimmten Anzahl von enthält und der code-Länge. AMD und Intel haben dieses problem nicht. Meine Lösung ist, statt verketten alle .cl-Dateien in eine große an Laufzeit. Der Nachteil dieser ist, dass im debugging-code die Zeilennummer der Fehler entspricht der concatentated .cl-Datei und nicht in den einzelnen .cl-Dateien.
Ich bezweifle, dass Nvidia jemals dieses Problem zu beheben. Sie kümmern sich nicht über OpenCL viel mehr.
Das ist interessant. Habe ich aber getestet habe ich es auf die CPU. Ich habe nicht eine AMD GPU, also kann ich nicht testen Sie es auf der GPU. Vielleicht ist es ein GPU-vs. CPU-Problem?
Nein, ich habe versucht, es unter die beiden Geräte unter Windows der compiler einfach nicht scheinen zu handhaben relative Pfade enthalten. Im Grunde genommen habe ich "-I cl/" in meinem compiler-Befehlszeile, und meine Kerne angeordnet sind ordentlich in der cl/ - Verzeichnis, und das funktioniert zwar Prima auf Intel/Linux, AMD einfach nicht mehr, egal was ich versuche, und die einzige Lösung, die ich fand, war entweder hartzucodieren die absoluten Pfad von jedem .cl-Datei in den #include-Direktiven, oder Sie meine cl/ Ordner auf dem system $PATH. Es könnte sein, meine installation kaputt wenn ich nicht halten mein Windows-system so viel wie mein Linux.
Auch in diesem Fall nicht arbeiten ist besser als teilweise/nach dem Zufallsprinzip arbeiten. Ich Verschwendete eine Menge Zeit, um herauszufinden, warum mein code wurde nicht verändert. Es würde halten, mit altem code und nicht erkennen, meine Chancen. Am Ende habe ich denke, es ist am besten zu vermeiden, die -I-option. Fügen Sie einfach alle .cl-Dateien zusammen als eine große an Laufzeit. Ein weiterer Vorschlag: ich Laufe immer auf der CPU zuerst, bevor die Tests auf der GPU. GPU-bugs crash mein ganzes system manchmal (zumindest auf Windows). Das geschieht nie auf der CPU.
nVidia erlaubt keine Pfade mit Leerzeichen. Versuchen Sie es mit einem alten DOS-Namen Weg und es wird funktionieren!
InformationsquelleAutor
Gibt es einen weiteren trick: Sie sollten das emulieren selbst (ich. e. so etwas wie die manuelle Fusion). Es ist nicht ganz klar, für coding, aber es funktioniert, wenn Ihre OpenCL-compiler nicht unterstützt (oder unterstützt falsch)
-I
Richtlinien. Dieser Ansatz ist nicht perfekt (zum Beispiel, verlieren Sie syntax-highlighting), aber die helfen können, für alt oder buggy OpenCL-Compiler.Kleines einfaches Beispiel für diese Möglichkeit:
InformationsquelleAutor avtomaton