2017-04-26 14 views
1

いくつかのCUDA関数には少し問題があります。C++で外部cuda関数テンプレートを宣言する方法

.cuファイルを.cuファイルと.cppファイルでNvidiaサンプルから分離したいと考えています。カーネルは関数テンプレートです。私はC++ファイルの外部関数として宣言するとエラーになります。

定義は次のようになります。

template <int BLOCK_SIZE> __global__ void 
matrixMulCUDA(float *C, float *A, float *B, int wA, int wB) 

そして、私はこのようにC++で関数を宣言している:

template <int BLOCK_SIZE> extern void 
matrixMulCUDA(float *C, float *A, float *B, int wA, int wB); 

を宣言は私にすべてのエラーを与えるものではありませんが、それはこのように使われているとき:

if (block_size == 16) 
    { 
     matrixMulCUDA <16> << < grid, threads >> >(d_C, d_A, d_B, dimsA.x, dimsB.x); 
    } 
    else 
    { 
     matrixMulCUDA <32> << < grid, threads >> >(d_C, d_A, d_B, dimsA.x, dimsB.x); 
    } 

それは私の "構文エラー '<'" 伝えます。

C++で関数を宣言する方法を教えてもらえますか? .cuファイルにすべてが格納されていれば、正常に実行されます。

+0

あなたの 'matrixMulCuda'の使い方を' '>> 'としてください。 –

+0

'.cu'ファイルや' .cpp'ファイルには "このように使われました"というコードがありますか? – Angew

+0

@AlgirdasPreidžiusそれはCUDAカーネルの呼び出し構文です(奇妙な空間が挿入されています)。 – Angew

答えて

1

質問はそれほど具体的ではありませんが、.cuファイルではなく、.cppファイルにカーネル呼び出し(質問に表示されているコード)があるようです。

これが当てはまる場合、それは実際問題です。 name <<<dims>>> (args)のCUDAカーネル起動構文は、NVCCの構文構造であり、ホストC++コンパイラではありません。したがって、それを使用するコードは、通常.cppの代わりに.cuファイルに変換されるNVCCによって処理されなければなりません。

カーネルを呼び出すコードを.cuファイルに移動する必要があります。通常、C++ヘッダーで宣言され、.cuファイルで定義された純粋なC++関数で簡単にラップできます。テンプレートを使用すると、これほど簡単ではありません。そこにブロックif全体を移動する必要があります。したがって、このような何か:

共有ヘッダファイル

void callMatrixMulKernel(std::size_t block_size, float *C, float *A, float *B, int wA, int wB); 

.cuファイル

void callMatrixMulKernel(std::size_t block_size, float *C, float *A, float *B, int wA, int wB) 
{ 
    if (block_size == 16) 
    { 
    matrixMulCUDA <16> <<< grid, threads >>>(d_C, d_A, d_B, dimsA.x, dimsB.x); 
    } 
    else 
    { 
    matrixMulCUDA <32> <<< grid, threads >>>(d_C, d_A, d_B, dimsA.x, dimsB.x); 
    } 
} 

.cppファイル

// In some function somewhere 
callMatrixMulKernel(16, d_C, d_A, d_B, dimsA.x, dimsB.x); 
+0

はい、良いアイデアです。私は試してみます。ありがとうございます@Angew。 – John

関連する問題