2017-11-23 2 views
1

私は、高速フーリエ変換のGPU並列化を実行するCUDAツールキットcufft.hを使用する方法を探しています。CUDAからの関数の定義を明確にしない

まず、シナプスを介してcudaライブラリとカフをダウンロードしました。 その後、NVidiaのcufft documentationのサンプルプログラムを使用しました。
私のcudaライブラリは、私のラップトップの/usr/local/cuda-9.0にあります。

私はそれらには、コメントを追加しました:

(... cudaMalloc、cudaGetLastError、など)

g++ -Wall main.cpp -o main 

と各CUDAのような機能のための未定義の参照のエラーを取得:

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" 

私はこのようなコンパイル

私はライブラリの実装についてかなり若いですが、私はこのcuda-cufftライブラリを適切に組み込むために何をすべきか理解していません。

filename.cuについてnvidia documentation話が、私はこれが何であるかを知らない...

はあなたの時間:)

NBをありがとう:私は後cuda.hとcuda_runtime_api.hを追加しましたフォーラムを読んで(私はそれが何かを忘れていた)。どうやら、cuda_runtime_api.hだけが必要です(私はcuda.hを使わずに試してみて、同じエラーが出ます)。ここで

+1

あなたはcudaランタイムAPIライブラリとcufftライブラリをリンクする必要があります。あなたが短い、完全なコードと正確なコンパイラ出力を与えるならば、おそらくあなたを助ける方が簡単でしょう。 –

答えて

1

は、完全なサンプル・コード(つまり、何も有効ではありません)とサンプルgは適切にコードをコンパイルしてリンクするコマンドをコンパイル++です:あなたはステートメントを含める

$ 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 
$ 

は、おそらくとして、あるOKですが、私が言うのフォーマットを使用している「このファイルの標準パスで検索」と、私はあなたのコンパイルコマンドは間違いなく必要なリンク装置が欠落しているが

-I/usr/local/cuda/include 

と標準パスへの追加を識別します。あなたはどこ-Lとライブラリ(パス)を見つけるために指定する必要があり、その後、含まれるように、特定のライブラリを示し、両方のCUDAランタイムライブラリである(-lcudart)ともCUFFTライブラリ(-lcufft):

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

CUDAツールキットは、通常、サンプルコードでインストールされます。このサンプルコードでは、サンプルのMakefileを調べることができます。また、これらのプロジェクトをコンパイルして、一般的なコンパイルコマンドの使用法を確認することもできます。

私が言及したように、このソースコードは不完全です。それは何も役に立たない。適切なコンパイルの動作を示すだけです。特に、私はあなたの実際のコードに含めることをお勧めします適切なエラーチェックを省略しました。

あなたのインストールは、シンボリックリンクを作成したかどうかに応じて、に上記のパスを変更する必要があります。

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

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

こんにちは、あなたの助けをありがとう! あなたが与えたコンパイルを使用すると動作します。私はまだlcudart ans lcufftがランタイムとカフライブラリに割り当てられていたことをどこで見つけたのだろうか。実際に、なぜ私たちが-lcudartと-lcufftを使用する必要があるのか​​、私は本当に分かりません。

関連する問題