gpt4 book ai didi

c++ - 在 CUDA 设备代码和主机代码中创建模板类对象时未解析的外部函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:01:12 26 4
gpt4 key购买 nike

我在文件 template.cutemplate.cuh 中定义了一个类模板。我使用 hostdevice 关键字将构造函数和析构函数标记为可调用的设备和主机。

template.cuh

#pragma once

#include "cuda_runtime.h"

template<class T>
class Foo
{
public:

__host__ __device__
Foo();

__host__ __device__
~Foo();
};

template.cu

#include "template.cuh"

template<class T>
__host__ __device__
Foo<T>::Foo()
{

}

template<class T>
__host__ __device__
Foo<T>::~Foo()
{

}

// Instantiating template of type int
template
class Foo<int> ;

我的主要功能在 Kernel.cu 文件中,其中包含 template.cuh header 。我只是在主机和设备代码中实例化一个 int 类型的 Foo 对象。

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include "template.cuh"

__global__ void addKernel(int *c, const int *a, const int *b)
{
Foo<int> f;

int i = threadIdx.x;
c[i] = a[i] + b[i];
}

int main()
{
Foo<int> t;
return 0;
}

当我在 NVIDIA CUDA 6.5 运行时类型的 Visual Studio C++ 项目中编译上述代码文件时,出现 Unresolved external 函数错误并显示以下日志:

1>  c:\Users\admin\documents\visual studio 2013\Projects\Test\Testtemplates>"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\bin\nvcc.exe" -gencode=arch=compute_20,code=\"sm_20,compute_20\" --use-local-env --cl-version 2013 -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin"  -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\include"  -G   --keep-dir Debug -maxrregcount=0  --machine 32 --compile -cudart static  -g   -DWIN32 -D_DEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /Zi /RTC1 /MDd  " -o Debug\kernel.cu.obj "c:\Users\admin\documents\visual studio 2013\Projects\Test\Testtemplates\kernel.cu"     
1> ptxas fatal : Unresolved extern function '_ZN3FooIiEC1Ev'
1> kernel.cu

我在这里做错了什么?

最佳答案

出现此错误的原因是您没有使用设备代码链接。看看这篇文章:Separate Compilation and Linking of CUDA C++ Device Code

我刚刚用您的代码尝试了以下操作,它对我有用。注意附加标志-dc:

nvcc template.cu kernel.cu -dc
nvcc template.o kernel.o -o kernel

我没有太多直接使用 Visual Studio 的经验,我更喜欢使用 CMake涵盖为 VS 生成正确的设置。

以下 CMakeLists.txt 文件适用于 Linux 和 gcc,您可以在 Windows 和 VS 上尝试一下,然后将生成的项目设置与您使用的项目设置进行比较。

PROJECT(kernel)
FIND_PACKAGE(CUDA REQUIRED)

SET(CUDA_SEPARABLE_COMPILATION ON)
CUDA_ADD_EXECUTABLE(kernel template.cuh template.cu kernel.cu)

关于c++ - 在 CUDA 设备代码和主机代码中创建模板类对象时未解析的外部函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29603790/

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