私はCUDAで作業しており、複素数の数値を処理するためにint2_
クラスを作成しました。 ComplexTypes.h
ファイル内ptxasファイルのCUDA外部クラスリンケージと未解決のextern関数
クラスの宣言を次のようにComplexTypes.cpp
ファイルで
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.
};
}
クラスの実装を次のように
#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
は、以下のことを考慮してください:
main
ファイル内の両方の宣言と実装を含むとき
- 別々のファイルに実装を移動する前に、すべてが正常に働いていました。
- 問題のある指示は
data_[i] = ob[i]
です。
誰でも何が起こっているのか考えていますか?
おそらくあなたがそうでなければ '__host__ __device__'がコンパイルべきではない、' ComplexTypes.cpp'ファイルではなく、あなたがNVCCに渡している 'ComplexTypes.cu'ファイルを持っているドント... – talonmies
私は私の問題の解決策を見つけました。私はそれが他のユーザーに役立つことを望む答えとして投稿しました。 – JackOLantern