カーネル関数をラップするテンプレートクラスを作成しました。そのため、別のクラスでカーネルを使用する必要があるときには、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の構文を含むコードパスをお持ちの場合
* nvccコンパイラドライバ*について詳しく説明できますか?nvrtcについて言及していますか? –
nvccのドキュメントの先頭ページを参照してください。 Nvccはコンパイラではなく、コンパイラドライバです。 – talonmies
次に、私はあなたの1.がどのように役立つか理解していません。これが私が求めていた理由です。私は@BAdhiが既に "nvccコンパイラドライバ"を使用していると思いついた。 –