2016-04-27 7 views
1

カーネル関数をラップするテンプレートクラスを作成しました。そのため、別のクラスでカーネルを使用する必要があるときには、CUDAの用語と機能を気にせずに単にクラス関数を呼び出すことができます。クラスはテンプレートクラスなので、すべての定義と宣言は以下のように同じファイルに含まれています。汎用クラスのCUDAキーワードでのテンプレートクラスの使用

Scanner.h

#include <iostream> 
#include "ScanKernals.h" 

class Scanner { 
public : 
    template<typename T> 
    void ScanDevice(T * h_in, int size); 

    template<typename T> 
    void ScanHost(); 

}; 

template<typename T> 
void Scanner::ScanHost() 
{ 

} 

template<typename T> 
void Scanner::ScanDevice(T * h_in, int size) 
{ 
    T * d_in; 
    cudaMalloc(&d_in, size * sizeof(T)); 
    cudaMemcpy(d_in , h_in, size * sizeof(T), cudaMemcpyHostToDevice); 
    // runs kernel that is required to calculate the scan 
} 

ScanKernals.h

template<typename T> 
__global__ 
void scan(T * d_in, T* d_out, int size) 
{ 
    // keranel code 
} 

上記のクラスは、次に

main.cppに

以下のようにメイン関数で使用され
#include <iostream> 
#include "Scanner.h" 

int main() 
{ 
    Scanner scanner; 

    return 0; 
} 

しかし、私がコードをコンパイルすると、コンパイラはエラーを出し、CUDA固有のキーワードを認識しません。

私は別のた.cppファイルにスキャナクラスの定義を分離した場合、このエラーは発生しませんが、テンプレートクラスを2つの別々のファイルで宣言され、定義できないため、これではありませんオプション

ここに何か不足していますが、回避策がありますか?あなたがC++のコンパイルにコードを含むCUDAの構文を含むコードパスをお持ちの場合

答えて

2

は、あなたがしなければならない二つのものがあります。

  1. はNVCCコンパイラドライバ
  2. を使用してコードをコンパイルしたファイルの名前を変更拡張子は.cuです。 nvccはファイル拡張子を使用して、指定されたファイルのコンパイル軌跡を決定し、ファイルの拡張子が.cppの場合、コードはホストコンパイラに直接渡され、コンパイルは失敗します。

あなたは明らかにこれらのことのいずれか、あるいは両方を行うことに失敗しています。

+0

* nvccコンパイラドライバ*について詳しく説明できますか?nvrtcについて言及していますか? –

+0

nvccのドキュメントの先頭ページを参照してください。 Nvccはコンパイラではなく、コンパイラドライバです。 – talonmies

+0

次に、私はあなたの1.がどのように役立つか理解していません。これが私が求めていた理由です。私は@BAdhiが既に "nvccコンパイラドライバ"を使用していると思いついた。 –

0

ファイル上のnvccのデフォルトの動作は、@タロンが下線を引いたものとして期待した動作ではありません。ただし、次のコンパイラコマンドラインオプションを試してみたいことがあります。

--x {c|c++|cu}        (-x) 
    Explicitly specify the language for the input files, rather than letting 
    the compiler choose a default based on the file name suffix. 
    Allowed values for this option: 'c','c++','cu'. 

をご入力コードがする.cpp接尾辞の名前にもかかわらず、CUDAであることを明示的に指定します。フラグなし

__global__ void f() {} 

/usr/local/cuda-7.5/bin/nvcc -c main.cpp 
main.cpp:1:1: error: ‘__global__’ does not name a type 
__global__ void f() {} 
^ 

フラグ(エラーなし)の場合:ここでは例main.cppファイルがあり、自由に名前を付ける

/usr/local/cuda-7.5/bin/nvcc -c main.cpp -x cu 

ファイルは安全と思われます。

関連する問題