Pracuję z CUDA i stworzyłem klasę int2_
do obsługi złożonych liczb całkowitych.Łącze klasy zewnętrznej CUDA i nierozwiązana funkcja zewnętrzna w pliku ptxas
deklaracji klasy w pliku ComplexTypes.h
w następujący sposób:
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.
};
}
realizacje klasa w pliku ComplexTypes.cpp
w następujący sposób:
#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.
Wszystko działa dobrze. W main
(który zawiera ComplexTypes.h
) mógłbym obsłużyć numery int2_
.
W pliku CudaMatrix.cu
, jestem teraz w tym ComplexTypes.h
i definiowania i prawidłowo uruchamianiu funkcji __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);
Sytuacja pliku CudaMatrix.cu
wydaje się być symetryczny do funkcji main
. Niemniej jednak, kompilator narzeka:
Error 19 error : Unresolved extern function '_ZN16LibraryNameSpace5int2_aSEi' C:\Users\Documents\Project\Test\Testing_Files\ptxas simpleTest
Proszę wziąć pod uwagę, że:
- Przed przeniesieniem wdrożenia do oddzielnych plików, wszystko działa poprawnie, gdy w tym zarówno deklaracje i implementacje w pliku
main
. - Problematyczna instrukcja to
data_[i] = ob[i]
.
Ktoś ma pojęcie o tym, co się dzieje?
przypuszczalnie Do not masz 'ComplexTypes.cpp' plik, ale raczej' ComplexTypes.cu' plik której przechodzą do nvcc, inaczej '__host__ __device__' nie powinien skompilować ... – talonmies
Znalazłem rozwiązanie mojego problemu. Wysłałem to jako odpowiedź, mając nadzieję, że może być przydatna dla innych użytkowników. – JackOLantern