cuda mit mingw - aktualisiert
Entwickeln wir unseren code in linux, würde aber gerne kompilieren eine ausführbare windows-Datei. Die alten non-gpu-version kompiliert einwandfrei mit mingw unter windows, also hoffte ich, ich wäre in der Lage, das gleiche zu tun mit die CUDA-version.
Die Strategie ist das kompilieren von kernel-code mit nvcc in visual studio, und den rest mit gcc bei mingw.
Bisher, werden wir schnell zusammengestellt .cu-Datei (mit dem kernel und der kernel startet) in visual studio. Jedoch, wir können immer noch nicht kompilieren von c-code in mingw. Der c-code enthält cuda-api-Aufrufe wie cudaMalloc
- und cuda-Typen wie cudaEvent_t
ist, so müssen wir zählen cuda.h und cuda_runtime.h. Allerdings gcc gibt Warnungen und Fehler für diese überschriften, zum Beispiel:
../include/host_defines.h:57:0: warning: "__cdecl" redefined
und
../include/vector_functions.h:127:14: error: 'short_4' has no member named 'x'
Irgendwelche Ideen auf, wie können wir diese überschriften und kompilieren Sie das c-Teil des Codes?
- Haben Sie sich überlegt mit Hilfe der Treiber API?
- Nein - wie viel Arbeit würde es dauern, zu konvertieren von der Laufzeit-api auf die Treiber-api?
- Wenn Sie eine Menge von CUDA-code wird es eine Weile dauern, zu konvertieren - die Treiber-API ist sehr viel Ausführlicher als die runtime-API. Die Treiber-API-code wäre einfacher zu kompilieren durch mingw, da rufen Sie die Treiber durch standard-C-Funktionen. Ich kann Ihnen nicht sagen, ob es Wert ist den Schmerz zu wechseln oder nicht wenn!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie wirklich verzweifelt, es könnte ein Weg sein. Der nvcc ist eigentlich nur ein frontend für eine Reihe von Compilern. Es ruft g++ viel zu strip-Kommentare, separates Gerät und dem host-code, handle name mangling, link Sachen wieder zusammen, etc. (verwenden Sie
--verbose
) um die details zu erhalten.Meine Idee ist wie folgt: Sie sollten in der Lage sein zu kompilieren der host-code mit mingw während der Kompilierung der Geräte-code zu einem fatbin auf einem linux-Rechner (wie ich denke das Gerät ist binary host-Maschine unabhängig). Danach verbinden Sie die Teile des Codes wieder zusammen mit mingw oder verwenden Sie die Treiber-API zum laden der fatbin dynamisch. Disclaimer: nicht testen!
Soweit ich weiß, ist es unmöglich, CUDA, ohne MSVC. So müssen Sie die MSVC zu machen nvcc arbeiten, und Sie können kompilieren CPU-code mit mingw und verknüpfen alles miteinander.
Laut http://forums.nvidia.com/index.php?showtopic=30743
Möchten Sie vielleicht einen Blick auf, wie die cycles-renderer dies handhabt, Blick auf https://developer.blender.org/diffusion/B/browse/master/extern/cuew/ und
https://developer.blender.org/diffusion/B/browse/master/intern/cycles/device/device_cuda.cpp
Ich weiß, es ist nicht ein automagic trick, aber es könnte Ihnen helfen, begonnen zu erhalten.