从另一个文件编译__device__函数调用时Visual Studio MSB3721错误

时间:2017-07-22 18:49:37

标签: c++ visual-studio cuda

我试图编译一个CUDA项目,一旦我尝试运行在单独的.cu文件中定义的函数就会出现255错误

这是定义主内核的地方

#include <curand_kernel.h>
#include <ctime>

#include <stdio.h>
#include "Scene.cuh"

__global__ void fill(float *c, Scene* scene)
{
    int index = blockIdx.y * blockDim.x * blockDim.y * gridDim.x +
                threadIdx.y * blockDim.x * gridDim.x +
                blockIdx.x * blockDim.x + threadIdx.x;


    // this is the line which gives the compilation error
    float3 result = scene->computeRayFromIndex(index);

    c[index * 4 + 0] += 1.0f; 
    c[index * 4 + 1] += 1.0f;
    c[index * 4 + 2] += 1.0f; 
    c[index * 4 + 3] += 1.0f;
}

这是scene.cuh

#ifndef Scene_h
#define Scene_h

#include "cuda_runtime.h"

class Scene {

public:
    Scene();

    __host__ __device__ float3 computeRayFromIndex(int);

    int width;
    int height;

    int cameraType;

    private:

};

#endif

and scene.cu

#include "Scene.cuh"

Scene::Scene() {

}

__host__ __device__ float3 Scene::computeRayFromIndex(int pixelIndex) {
    float3 test;
    return test;
}

我正在使用visual studio 2013,我正常从菜单中将cuda文件添加到我的项目中

这是编译错误

Error   10  error MSB3721: The command ""C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\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\x86_amd64"  -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include"  -G   --keep-dir x64\Debug -maxrregcount=0  --machine 64 --compile -cudart static  -g   -DWIN32 -DWIN64 -D_DEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /FS /Zi /RTC1 /MDd " -o x64\Debug\fillRandomTexture.cu.obj "D:\CUDA\projects\vRay\vRay\fillRandomTexture.cu"" exited with code 255.

如果我发表评论

,项目将构建并运行良好
float3 result = scene->computeRayFromIndex(index);

在主内核文件中

1 个答案:

答案 0 :(得分:3)

在CUDA中,当我们想要从另一个设备代码函数调用设备代码函数,并且这两个设备代码函数在不同的编译单元中时,在编译这样的时候启用relocatable device code generation and linking是必要的。项目

在visual studio中,可以从项目属性页面为整个项目设置,如here所示:

enter image description here

此外,在使用visual studio和CUDA时,错误&#34; MSB3721&#34;是视觉工作室的一个非特定错误,表示&#34;我跑nvcc并返回错误&#34;。但是,nvcc之前的实际错误应该在此之前发生。如果你没有在&#34; MSB3721&#34;之前的编译输出窗口中看到它。错误,那么你的详细程度太低了。你可以增加它,这样做的确切方法会因VS版本而有所不同,所以我建议你搜索一下如何为你的特定版本做这些。