2017-11-23 5 views
1

Ich bin auf der Suche nach einer Möglichkeit, cammt.h ein CUDA-Toolkit zu verwenden, die GPU-Parallelisierung der schnellen Fourier-Transformation durchführen.Definieren Sie Referenzen von Funktionen von CUDA

Zuerst habe ich Cuda Bibliothek und Manschette durch synaptische heruntergeladen. Dann habe ich das Beispielprogramm von cufft documentation von NVidia verwendet.
Meine Cuda-Bibliothek befindet sich unter /usr/local/cuda-9.0 auf meinem Laptop.

Ich habe diejenigen umfassen:

1 #include <iostream> 
2 #include <cstdio> 
3 #include "/usr/local/cuda-9.0/include/cuda.h" 
4 #include "/usr/local/cuda-9.0/include/cuda_runtime_api.h" 
5 #include "/usr/local/cuda-9.0/include/cufft.h" 

ich so kompilieren:

g++ -Wall main.cpp -o main 

und undefine Referenzen Fehler für jede CUDA-ähnliche Funktionen (cudaMalloc, cudaGetLastError, etc ...) erhalten

Ich bin ziemlich jung über Bibliothek Implementierung und ich verstehe nicht, was ich tun soll, um diese Cuda-Manschette Bibliothek ...

Die nvidia documentation Vortrag über filename.cu aber ich weiß nicht, worum es geht ...

Danke für Ihre Zeit :)

nb: Ich habe cuda.h und cuda_runtime_api.h nach ein Forum lesen (ich habe vergessen was es war). Anscheinend ist nur cuda_runtime_api.h notwendig (ich habe es ohne cuda.h versucht und bekomme die gleichen Fehler).

+1

müssen Sie gegen die Cuda Runtime API-Bibliothek sowie die Cuff-Bibliothek verknüpfen. Es wird wahrscheinlich einfacher sein, Ihnen zu helfen, wenn Sie einen kurzen, vollständigen Code sowie die genaue Compiler-Ausgabe geben. –

Antwort

1

ist die komplette Beispielcode (das tut nichts nützlich) und eine Probe g ++ Befehl zu kompilieren, die richtig kompilieren und den Code verlinken:

$ cat t1338.cpp 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <cuda_runtime.h> 
#include <cufft.h> 

int main() { 
    size_t work_size; 

    int fft_sz = 32;   // Size of each FFT 
    int num_ffts = 1;   // How many FFTs to do 

    cufftComplex *in_buf_h, *in_buf_d, *out_buf_d; 

    // Allocate buffers on host and device 
    in_buf_h = new cufftComplex[fft_sz*num_ffts]; 
    cudaMalloc(&in_buf_d, fft_sz*num_ffts*sizeof(cufftComplex)); 
    cudaMalloc(&out_buf_d, fft_sz*num_ffts*sizeof(cufftComplex)); 
    cudaMemset(out_buf_d, 0, fft_sz*num_ffts*sizeof(cufftComplex)); 
    // Fill input buffer with zeros and copy to device 
    memset(in_buf_h, 0, fft_sz*num_ffts*sizeof(cufftComplex)); 
    cudaMemcpy(in_buf_d, in_buf_h, fft_sz*num_ffts*sizeof(cufftComplex), cudaMemcpyHostToDevice); 

    // Plan num_ffts of size fft_sz 
    cufftHandle plan; 
    cufftCreate(&plan); 
    cufftMakePlan1d(plan, fft_sz, CUFFT_C2C, num_ffts, &work_size); 

    // Execute the plan. We don't actually care about values. 
    cufftExecC2C(plan, in_buf_d, out_buf_d, CUFFT_FORWARD); 

    // Sync the device to flush the output 
    cudaDeviceSynchronize(); 

    return 0; 
} 
$ g++ t1338.cpp -I/usr/local/cuda/include -L/usr/local/cuda/lib64 -lcudart -lcufft 
$ 

Ihre beinhalten Aussagen wahrscheinlich in Ordnung sind, wie sie ist , aber ich ein Format verwendet haben, die dann identifiziere ich eine Ergänzung der Standardpfad mit

-I/usr/local/cuda/include 

jedoch Ihre Kompilierungsbefehl die notwendige Verbindung Gerät definitiv fehlt „für diese Datei suchen auf dem Standard-Pfad“, sagt. Sie müssen angeben, wo die Bibliotheken zu finden (der Pfad) mit -L und dann die spezifischen Bibliotheken zeigen, umfassen, die beide die CUDA-Laufzeitbibliothek (-lcudart) und auch die CUFFT Bibliothek (-lcufft):

-L/usr/local/cuda/lib64 -lcudart -lcufft 

Das CUDA-Toolkit wird normalerweise mit Beispielcodes installiert, die Beispiel-Makefiles enthalten, die Sie untersuchen können, oder Sie kompilieren nur diese Projekte, um die typische Verwendung des Kompilierungsbefehls zu sehen.

Wie bereits erwähnt, ist dieser Quellcode unvollständig. Es macht nichts Sinnvolles. Es soll nur das korrekte Kompilierungsverhalten demonstrieren. Insbesondere habe ich eine ordnungsgemäße Fehlerprüfung ausgelassen, die ich Ihnen in Ihren tatsächlichen Codes empfehlen sollte.

Je nachdem, ob Ihr einen symbolischen Link erstellt installieren oder nicht, müssen Sie die oben genannten Pfade ändern: für Ihre Hilfe

-I/usr/local/cuda-9.0/include 

und

-L/usr/local/cuda-9.0/lib64 -lcudart -lcufft 
0

Hallo und vielen Dank! Es funktioniert, wenn ich die Compilation verwende, die du angegeben hast. Ich frage mich immer noch, wo du findest, dass lcudart und lcufft der Laufzeit- und Manschettenbibliothek zugewiesen wurden. Eigentlich verstehe ich nicht wirklich, warum wir das -lcudart und -lcult benutzen müssen.

Verwandte Themen