Cuda不能将类拆分为头和实现
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cuda不能将类拆分为头和实现相关的知识,希望对你有一定的参考价值。
我有下一个文件
kernel.粗
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include <cuda.h>
#include <device_launch_parameters.h>
#include <texture_fetch_functions.h>
#include <builtin_types.h>
#include <vector_functions.h>
#include <float.h>
#include "Book.cuh"
extern "C" __global__ void Custom2(double *data, double *c)
{
int i = threadIdx.x;
Book *book=new Book(data);
}
Book.cuh:
#pragma once
#include "cuda_runtime.h"
class Book
{
private:
public:
__device__ Book::Book(double *data)
{
}
__device__ double* Book::operator[] (const int index)
{
return nullptr;
}
};
这些文件编译没有任何问题。但现在我想将声明和实现拆分为两个文件.cu和.cuh
所以我将有两个文件而不是Book.cuh文件
Book.cuh
#pragma once
#include "cuda_runtime.h"
class Book
{
public:
__device__ Book(double *data);
__device__ double* operator[] (const int index);
};
book.粗
#pragma once
#include "Book.cuh"
__device__ Book::Book(double *data)
{
}
__device__ double* Book::operator[] (const int index)
{
return nullptr;
}
现在我的项目没有编译
这是错误
C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V140BuildCustomizationsCUDA 8.0.targets(689,9): error MSB3721: The command ""D:Program FilesNVIDIA GPU Computing ToolkitCUDAin
vcc.exe" -gencode=arch=compute_20,code=sm_20 --use-local-env --cl-version 2015 -ccbin "C:Program Files (x86)Microsoft Visual Studio 14.0VCinx86_amd64" -I"D:Program FilesNVIDIA GPU Computing ToolkitCUDAinclude" -I"D:Program FilesNVIDIA GPU Computing ToolkitCUDAinclude" -G --keep-dir x64Debug -maxrregcount=0 --machine 64 -cubin -cudart static -o X:ProjectsCudaTestCudaTest\kernel.ptx "X:ProjectsCudaTestCudakernel.cu"" exited with code 255.
Cuda编译器设置
NVCC编译类型:生成.cubin文件(-cubin)
我的环境:
Windows 10 x64
CUDA 8.0
显卡:Geforce GTX 660M
我是C#开发人员,以前没有C ++或Cuda的经验,我不确定这个Cuda特定的问题,或者只是我对C ++的几乎零知识。可能我的问题很容易解决,但我已经花了几个小时没有任何进展。
答案
这个问题具体是cuda。简而言之,解决方案是将Generate Relocatable Device代码设置为 - Yes(-rdc = true)
这里有很长的答案:https://devblogs.nvidia.com/separate-compilation-linking-cuda-device-code/
以上是关于Cuda不能将类拆分为头和实现的主要内容,如果未能解决你的问题,请参考以下文章
Cg入门20:Fragment shader - 片段级模型动态变色(实现汽车动态换漆)
RuntimeError: ‘lengths’ argument should be a 1D CPU int64 tensor, but got 1D cuda:0 Long tensor(代码片段