Erstellen einer statischen CUDA-Bibliothek in verknüpft werden mit einem C++ - Programm
Ich bin versucht, link ein CUDA-kernel mit C++ autotools-Projekt jedoch nicht scheinen, um passieren die Verknüpfung Bühne.
Ich habe eine Datei GPUFloydWarshall.cu enthält den kernel und eine wrapper-C-Funktion möchte ich in einer Bibliothek libgpu.ein. Dies wird konsistent mit dem Rest des Projekts. Ist das überhaupt möglich?
Zweitens, die Bibliothek müssten dann mit etwa zehn anderen Bibliotheken für die wichtigsten ausführbare Datei, die im moment mit mpicxx.
Momentan benutze ich/generiert die unten Befehle zum kompilieren und erstellen der libgpu.eine Bibliothek
nvcc -rdc=true -c -o temp.o GPUFloydWarshall.cu
nvcc -dlink -o GPUFloydWarshall.o temp.o -L/usr/local/cuda/lib64 -lcuda -lcudart
rm -f libgpu.a
ar cru libgpu.a GPUFloydWarshall.o
ranlib libgpu.a
Wenn das alles verbunden, die in das Hauptprogramm bekomme ich die folgende Fehlermeldung
problem/libproblem.a(libproblem_a-UTRP.o): In function `UTRP::evaluate(Solution&)':
UTRP.cpp:(.text+0x1220): undefined reference to `gpu_fw(double*, int)'
Th gpu_fw Funktion ist meiner wrapper-Funktion.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, es ist möglich. Und die Schaffung eines (nicht-CUDA) - wrapper-Funktion um es noch einfacher macht. Sie können Ihr Leben noch einfacher, wenn du dich auf C++ - Verknüpfung in (Sie erwähnen einen wrapper C-Funktion). mpicxx ist ein C++ - compiler/linker-alias und cuda-Dateien (.cu) Folgen Sie der C++ compiler/linker-Verhalten standardmäßig. Hier eine ganz einfache Frage, die erörtert Gebäude cuda-code (gekapselt in einer wrapper-Funktion) in eine statische Bibliothek.
Sobald Sie eine C/C++ (non-CUDA) wrapper ausgesetzt, die Sie in Ihrer Bibliothek verknüpfen sollte nicht anders sein als gewöhnliche Verknüpfung von gewöhnlichen Bibliotheken. Sie können noch brauchen, um passieren die cuda-runtime-Bibliotheken und anderen cuda-Bibliotheken, die Sie vielleicht in der link-Schritt, aber es ist die gleiche konzeptionell wie alle anderen Bibliotheken kann das Projekt abhängen.
EDIT:
Es ist nicht klar, müssen Sie verwenden den Geräte-Verknüpfung für das, was Sie tun möchten. (Aber es ist akzeptabel, nur es macht die Dinge etwas komplizierter.) Sowieso, Ihre Konstruktion, die Bibliothek ist nicht ganz korrekt, jetzt haben Sie gezeigt, dem Befehl Folge. Die device-link-Befehl erzeugt eine device-linkable Objekt, dass nicht alle notwendigen host-Stücke. Um alles an einem Ort, den wir hinzufügen möchten, beide GPUFloydWarshall.o (was hat das Gerät-linked Stück) UND temp.o (was hat der host-code-Stücke) mit in die Bibliothek.
Hier ein voll gearbeitet Beispiel:
-arch
- Schalter angegeben ist (dh. der Standardwert ist-arch=sm_20
). Wenn Sie kompilieren wie oben gezeigt, und dann Versuch zu laufen auf cc1.x Gerät, würden Sie wahrscheinlich erhalten die Fehlermeldung, die Sie darauf hinweisen ("invalid device-Funktion")