Ich versuche, ein in C geschriebenes GPL-Programm zu modifizieren. Mein Ziel ist es, eine Methode durch eine CUDA-Implementierung zu ersetzen, was bedeutet, dass ich mit nvcc statt mit gcc kompilieren muss. Ich brauche Hilfe, um das Projekt aufzubauen - es nicht zu implementieren (Sie müssen nichts über CUDA C wissen, um zu helfen, denke ich nicht).
Dies ist das erste Mal, dass ich versuche, ein C-Projekt moderater Komplexität zu ändern, das eine .configure- und Makefile-Datei enthält. Ehrlich gesagt, das ist das erste Mal, dass ich seit langer Zeit irgendwas in C mache, einschließlich alles, was gcc oder g ++ betrifft, also bin ich ziemlich verloren.
Ich bin nicht sehr daran interessiert, configure und Makefiles zu lernen - das ist eher ein Experiment. Ich würde gerne sehen, ob die Projektumsetzung gut läuft, bevor Sie Zeit damit verbringen, ein korrektes Build-Skript zu erstellen. (Nicht willens, zu lernen, wie notwendig, nur versuchen, eine Vorstellung von der Reichweite zu geben).
Was sind meine Optionen, um dieses Projekt zu bauen? Ich habe eine Vielzahl von Fragen ...
Ich habe versucht, "CC = nvcc" zur Datei "configure.in" nach AC_PROG_CC hinzuzufügen. Dies schien zu funktionieren - Ausgabe von laufenden configure und make zeigte nvcc als Compiler. Make konnte jedoch die Quelldatei nicht mit dem CUDA-Kernel kompilieren und erkannte die CUDA-spezifische Syntax nicht. Ich weiß nicht warum, ich hatte gehofft, das würde einfach funktionieren.
Ist es möglich, eine Quelldatei mit nvcc zu kompilieren und sie dann in den Verknüpfungsschritt des make-Prozesses für das Hauptprogramm einzubinden? Wenn das so ist, wie? (Diese Frage macht vielleicht keinen Sinn - ich bin wirklich rostig)
Was ist der richtige Weg, dies zu tun?
Gibt es eine schnelle und schmutzige Art, die ich für Testzwecke verwenden könnte?
Gibt es ein geheimes Tool, mit dem jeder diese Konfigurations- und Makefiles einrichten und verstehen kann? Das ist noch schlimmer als die Apache Ant-Skripte, an die ich gewöhnt bin (Yeah, ich bin nicht in meinem Bereich)
Sie müssen nicht alles mit nvcc kompilieren. Sie vermuten, dass Sie Ihren CUDA-Code einfach mit NVCC kompilieren können und alles andere (außer der Verknüpfung) korrekt ist. Hier ist der Ansatz, den ich verwenden würde, um zu starten.
Fügen Sie einen neuen Header (z. B. myCudaImplementation.h) und eine neue Quelldatei (mit der Erweiterung .cu, z. B. myCudaImplementation.cu) hinzu. Die Quelldatei enthält Ihre Kernelimplementierung sowie eine (Host-) C-Wrapperfunktion, die den Kernel mit der entsprechenden Ausführungskonfiguration (aka <<<>>>
) und Argumenten aufruft. Die Header-Datei enthält den Prototyp für die C-Wrapper-Funktion. Nennen wir diese Wrapper-Funktion runCudaImplementation()
Ich würde auch eine andere Host-C-Funktion in der Quelldatei (mit dem Prototyp im Header) bereitstellen, die die vorhandenen GPU-Geräte abfragt und konfiguriert und true zurückgibt, wenn es erfolgreich ist, andernfalls false. Nennen wir diese Funktion configureCudaDevice()
.
Jetzt in Ihrem ursprünglichen C-Code, wo Sie normalerweise Ihre CPU-Implementierung aufrufen würden, können Sie dies tun.
%Vor%Nun, da Sie Ihren gesamten CUDA-Code in eine neue .cu-Datei geschrieben haben, müssen Sie diese Datei nur mit nvcc kompilieren. Alles andere bleibt gleich, außer dass Sie die Objektdatei verknüpfen müssen, die nvcc ausgibt. z.B.
%Vor%Fügen Sie dann myCudaImplementation.o zu Ihrer Linkzeile hinzu (etwas wie :) g ++ -o myApp myCudaImplementation.o
Wenn Sie jetzt eine komplexe App verwenden, die configure verwendet und bereits ein komplexes Makefile besitzt, ist sie möglicherweise komplizierter als das oben genannte, aber das ist der allgemeine Ansatz. Unter dem Strich wollen Sie nicht alle Ihre Quelldateien mit nvcc kompilieren, nur die .cu-Dateien. Verwenden Sie Ihren Host-Compiler für alles andere.
Ich bin kein Experte mit konfigurieren, kann also nicht wirklich helfen. Sie können möglicherweise configure ausführen, um ein Makefile zu generieren, und dieses Makefile dann bearbeiten - es wird keine allgemeine Lösung sein, aber es wird Sie starten.