Angenommen, ich möchte CUDAs untergeordnete Treiber-API für einige Quellen verwenden, die ich geschrieben habe. Ich weiß über cuLaunchKernel
, aber ich kann nicht scheinen, in den Dokumenten die genaue Erklärung zu finden, wie Sie das cuFunction
erhalten, um es von Ihren __global__
Funktionen zu übertragen.Wie bekomme ich eine cuFunction von einer __global__ Funktion, die ich geschrieben habe?
Antwort
Sie verwenden cuModuleGetFunction. Der übergebene Funktionsname muss der fehlende C++ - Name sein, wenn Sie keine C-Verknüpfung verwenden. Sie können dies mithilfe von cuobjdump auf einer kompilierten Version Ihrer Gerätequelle abrufen.
Aber _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ – einpoklum
Sie laden entweder eine vorkompilierte Binärdatei aus einer kubischen oder fetten Binärdatei, die Sie a priori erstellen, oder PTX-Code, den Sie entweder geschrieben oder aus der Quelle kompiliert haben. Sie können auch eine Runtime Device Linker-Sitzung initiieren, wenn Sie über Gerätecodebibliotheken verfügen, mit denen eine Verknüpfung hergestellt werden kann. – talonmies
Ich bekomme es, aber kann ich meine ausführbare Datei nicht irgendwie meine fette binäre sein? Ich meine, das ist, was die Laufzeit-API im Wesentlichen tut, oder? – einpoklum
werfen Sie einen Blick auf die CUDA-Beispielcodes, die die Treiber-API verwenden, z. B. [vectorAddDrv] (http://docs.nvidia.com/cuda/cuda-samples/index.html#vector-addition-driver-api). Das Projekt ist so eingerichtet, dass es den Kernel ("__global__" -Funktion in vectorAddDrv_kernel.cu) nach ptx kompiliert und der Kernel in ptx-Form über eine API-Sequenz in der vectorAddDrv.cpp-Datei geladen wird. Der [Treiber-API-Abschnitt] (http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#driver-api) des Programmierleitfadens wird auch als Referenz nützlich sein. –