CUDA externen Klasse "Verknüpfung" und " unresolved extern-Funktion im ptxas Datei
Arbeite ich mit CUDA und ich erstellt haben, ein int2_
Klasse befassen sich mit komplexen zahlen.
Klasse Erklärungen in der ComplexTypes.h
- Datei wie folgt:
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.
};
}
Klasse-Implementierungen in der ComplexTypes.cpp
- Datei wie folgt:
#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.
Alles gut funktioniert. In der main
(die ComplexTypes.h
) ich konnte viel mit int2_
zahlen.
In der CudaMatrix.cu
- Datei, ich bin jetzt auch ComplexTypes.h
und zu definieren und richtig zu instanziieren der __global__
Funktion:
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);
Die situation der CudaMatrix.cu
- Datei zu sein scheint symmetrisch zu der main
Funktion. Dennoch, der compiler beschwert sich:
Error 19 error : Unresolved extern function '_ZN16LibraryNameSpace5int2_aSEi' C:\Users\Documents\Project\Test\Testing_Files\ptxas simpleTest
Bitte beachten Sie, dass:
- Bevor die Implementierung in separaten Dateien, alles war richtig funktioniert, wenn beide Deklarationen und Implementierungen in
main
Datei. - Die problematische Anweisung ist
data_[i] = ob[i]
.
Jemand hat eine Idee was Los ist?
- vermutlich haben Sie sich nicht
ComplexTypes.cpp
- Datei, sondern eineComplexTypes.cu
- Datei, die Sie auf der Durchreise sind nvcc, da sonst die__host__ __device__
sollte nicht kompilieren... - Ich habe eine Lösung gefunden für mein Problem. Ich habe es geschrieben als Antwort in der Hoffnung, dass es nützlich sein könnte, um andere Benutzer.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Prozedur, die ich verfolgt habe in meinem Beitrag oben hat zwei Probleme:
Den
ComplexTypes.cpp
mit dem Namen muss gedreht werden, umComplexTypes.cu
so dassnvcc
konnte abzufangen, die CUDA keywords__device__
und__host__
. Dies wurde bereits von der Talonmies in seinem Kommentar. Tatsächlich, vor der Veröffentlichung, ich war schon das ändern der Dateinamen von.cpp
zu.cu
, aber der compiler meckert und zeigt den gleichen Fehler. Deshalb war ich arglos Schritt zurück;In Visual Studio 2010 verwenden Ansicht -> Eigenschaft-Seiten; Konfiguration, Eigenschaften -> CUDA C/C++ -> Common -> Erstellung von Verschiebbaren Geräte-Code -> ja (-rdc=true). Dies ist notwendig, für die getrennte Kompilierung. In der Tat, in NVIDIA CUDA-Compiler-Treiber NVCC, es wird gesagt, dass: