gpt4 book ai didi

c++ - ptxas 文件中的 CUDA 外部类链接和未解析的外部函数

转载 作者:可可西里 更新时间:2023-11-01 14:58:29 26 4
gpt4 key购买 nike

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

有人知道发生了什么事吗?

最佳答案

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

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

  2. 在 Visual Studio 2010 中,必须使用 View -> Property Pages;配置属性 -> CUDA C/C++ -> 通用 -> 生成可重定位设备代码 -> 是 (-rdc=true)。这是单独编译所必需的。事实上,在 NVIDIA CUDA Compiler Driver NVCC ,据说:

CUDA works by embedding device code into host objects. In whole program compilation, it embeds executable device code into the host object. In separate compilation, we embed relocatable device code into the host object, and run the device linker (nvlink) to link all the device code together. The output of nvlink is then linked together with all the host objects by the host linker to form the final executable. The generation of relocatable vs executable device code is controlled by the --relocatable-device-code={true,false} option, which can be shortened to –rdc={true,false}.

关于c++ - ptxas 文件中的 CUDA 外部类链接和未解析的外部函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17188527/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com