12

私は CUDA を使用しておりint2_、複雑な整数を処理するクラスを作成しました。

ファイル内のクラス宣言は次のComplexTypes.hとおりです。

namespace LibraryNameSpace
{
    class int2_ {

        public:
            int x;
            int y;

            // Constructors
            __host__ __device__ int2_(const int,const int);
            __host__ __device__ int2_();
            // etc.

            // Equalities with other types      
            __host__ __device__ const int2_& operator=(const int);
            __host__ __device__ const int2_& operator=(const float);
            // etc.

    };
}

ファイル内のクラスの実装は次のComplexTypes.cppとおりです。

#include "ComplexTypes.h"

__host__ __device__         LibraryNameSpace::int2_::int2_(const int x_,const int y_)           { x=x_; y=y_;}
__host__ __device__         LibraryNameSpace::int2_::int2_() {}
// etc.

__host__ __device__ const   LibraryNameSpace::int2_& LibraryNameSpace::int2_::operator=(const int a)                        { x = a;            y = 0.;             return *this; }
__host__ __device__ const   LibraryNameSpace::int2_& LibraryNameSpace::int2_::operator=(const float a)                      { x = (int)a;       y = 0.;             return *this; }
// etc.

すべてがうまく機能します。main( を含む)では、数字ComplexTypes.hを扱うことができました。int2_

CudaMatrix.cuファイルに、関数を含めて定義ComplexTypes.hし、適切にインスタンス化しています。__global__

template <class T1, class T2>
__global__ void evaluation_matrix(T1* data_, T2* ob, int NumElements)
{
    const int i = blockDim.x * blockIdx.x + threadIdx.x;
    if(i < NumElements) data_[i] = ob[i];
}

template __global__ void evaluation_matrix(LibraryNameSpace::int2_*,int*,int);

ファイルの状況は関数CudaMatrix.cuと対称のようmainです。それにもかかわらず、コンパイラは不平を言います:

Error   19  error : Unresolved extern function '_ZN16LibraryNameSpace5int2_aSEi'    C:\Users\Documents\Project\Test\Testing_Files\ptxas simpleTest

考慮してください:

  1. 実装を別のファイルに移動する前は、ファイルに宣言と実装の両方を含めると、すべてが正しく機能していましたmain
  2. 問題のある命令はdata_[i] = ob[i].

誰が何が起こっているのか考えていますか?

4

1 に答える 1

23

上記の投稿で従った手順には、2 つの問題があります。

  1. ComplexTypes.cppCUDAキーワードおよび. _ _ ComplexTypes.cu_ nvcc_ これは Talonmies のコメントで指摘されています。実は、投稿する前にファイル名を からに変更していたのですが、コンパイラが文句を言って同じエラーを表示していました。したがって、私は巧妙に後退していました。__device____host__.cpp.cu

  2. Visual Studio 2010 では、[表示] -> [プロパティ ページ]を使用する必要があります。構成プロパティ -> CUDA C/C++ -> 共通 -> リロケータブル デバイス コードの生成 -> はい (-rdc=true)。これは、個別のコンパイルに必要です。実際、NVIDIA CUDA Compiler Driver NVCCでは、次のように述べられています。

CUDA は、デバイス コードをホスト オブジェクトに埋め込むことで機能します。プログラム全体のコンパイルでは、実行可能なデバイス コードをホスト オブジェクトに埋め込みます。別のコンパイルでは、再配置可能なデバイス コードをホスト オブジェクトに埋め込み、デバイス リンカー (nvlink) を実行してすべてのデバイス コードをリンクします。nvlink の出力は、ホスト リンカーによってすべてのホスト オブジェクトと一緒にリンクされ、最終的な実行可能ファイルが形成されます。再配置可能なデバイス コードと実行可能なデバイス コードの生成は、 --relocatable -device-code={true,false}オプションによって制御されます。これは、 –rdc={true,false}に短縮できます。

于 2013-06-19T12:15:44.127 に答える