PTXAS 文件中的 CUDA 外部类链接和未解析的 extern 函数

CUDA external class linkage and unresolved extern function in ptxas file

提问人:Vitality 提问时间:6/19/2013 最后编辑:Vitality 更新时间:6/19/2013 访问量:9410

问:

我正在使用 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.

一切正常。在(包括)中,我可以处理数字。mainComplexTypes.hint2_

在文件中,我现在包含并定义并正确实例化该函数:CudaMatrix.cuComplexTypes.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.cumain

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

请考虑:

  1. 在将实现移动到单独的文件之前,在文件中包含声明和实现时,一切都正常工作。main
  2. 有问题的指令是 。data_[i] = ob[i]

有人知道发生了什么吗?

C++ CUDA 未解析的外部

评论

0赞 talonmies 6/19/2013
大概你没有文件,而是你传递给NVCC的文件,否则不应该编译......ComplexTypes.cppComplexTypes.cu__host__ __device__
0赞 Vitality 6/19/2013
我已经找到了解决我问题的方法。我已将其发布为答案,希望它对其他用户有用。

答:

23赞 Vitality 6/19/2013 #1

我在上面的帖子中遵循的程序有两个问题:

  1. 必须将文件名转换为 ,以便可以拦截 CUDA 关键字和 .Talonmies在他的评论中指出了这一点。实际上,在发布之前,我已经将文件名从 更改为 ,但编译器抱怨并显示相同的错误。因此,我巧妙地退后一步;ComplexTypes.cppComplexTypes.cunvcc__device____host__.cpp.cu

  2. 在 Visual Studio 2010 中,必须使用 View -> 属性页;配置属性 -> CUDA C/C++ -> 通用 -> 生成可重定位的设备代码 -> 是 (-rdc=true)。这对于单独编译是必要的。事实上,在NVIDIA CUDA编译器驱动程序NVCC上,据说:

CUDA 的工作原理是将设备代码嵌入到主机对象中。在整个程序编译中,它将可执行设备代码嵌入到主机对象中。在单独的编译中,我们将可重定位的设备代码嵌入到主机对象中,并运行设备链接器 (nvlink) 将所有设备代码链接在一起。然后,nvlink 的输出由主机链接器与所有主机对象链接在一起,以形成最终的可执行文件。可重定位与可执行设备代码的生成由 --relocatable-device-code={true,false} 选项控制,该选项可以缩短为 –rdc={true,false}

评论

4赞 talonmies 6/19/2013
基本上,您只有两种选择 - 将所有设备代码移动到同一个编译单元中,或者使用单独的编译。您的答案是后者,它仅适用于 CUDA 5.0 或更高版本。前者是在引入链接器之前构建 CUDA 应用程序的唯一方法。
0赞 3Dave 4/23/2014
谢谢。我已经追了好几个小时了。(也适用于 CUDA 5.5 和 VS2012)
4赞 Maghoumi 10/25/2014
在 Nsight Eclipse 中,该选项可作为 CUDA > Build > Settings > Project > Properties Separate compilation 下的单选按钮