如何使用-dc标志编译Nsight EE?

时间:2016-01-04 11:21:16

标签: c++ eclipse cuda makefile nsight

我正在尝试使用Nsight编译CUDA应用程序,将.cpp文件编译为.o文件,然后链接主应用程序。我的建立基于NVIDIA“并行为所有”示例Separate Compilation and Linking of CUDA C++ Device Code及其Makefile

objects = main.o particle.o v3.o

all: $(objects)
        nvcc -arch=sm_20 $(objects) -o app

%.o: %.cpp
        nvcc -x cu -arch=sm_20 -I. -dc $< -o $@

clean:
        rm -f *.o app

当我将我的代码复制到一个新目录并使用该Makefile(当然适用于我的文件名和其他标志)时,一切正常。

但我无法弄清楚如何在Eclipse中获得相同的选项,因此构建总是失败并出现以下错误:

/usr/local/cuda-7.5/bin/nvcc -G -g -O0 -std=c++11 -gencode arch=compute_50,code=sm_50  -odir "src" -M -o "src/Object.d" "../src/Object.cpp"
/usr/local/cuda-7.5/bin/nvcc -G -g -O0 -std=c++11 --compile  -x c++ -o  "src/Object.o" "../src/Object.cpp"

../src/kernels.cu:31:12: error: ‘blockIdx’ was not declared in this scope
#... lots more "no one told me this was CUDA" errors

../src/Object.cpp:125:26: error: expected primary-expression before ‘<’ token
#... can't call CUDA kernels from cpp either ...

我的项目文件的相关内容包括:

Object.cpp:

#include "Object.h"
#include "kernels.cu"

main.cpp :(与fname相同的错误为main.cu)

#include "Object.h"

kernels.cu:

#include "Object.h"

Object.h:

#include <cuda_runtime.h>

使用自定义makefile编译代码。缺失的部分似乎是-dc(设备代码)标志,但我不知道如何在Nsight Eclipse版本中启用它。我知道我可以创建一个Makefile项目,但我更喜欢在Eclipse中进行,以便所有内省都能正常工作等。

1 个答案:

答案 0 :(得分:1)

我解决了这个问题,虽然我还是不完全理解它... 似乎-x c++是关键标志,而不是-dc

当文件重命名时,Nsight Eclipse的默认构建设置可正常工作:

Object.cpp Object.cu

#include "Object.h"
#include "kernels.cuh"

main.cpp :( main.cu也很好)

#include "Object.h"

kernels.cu kernels.cuh

#include "Object.h"

Object.h:

#include <cuda_runtime.h>

显然.cu个文件被.o(语言CUDA)编译为-x cu个文件然后链接,但.cpp个文件使用语言-x c++编译,因此没有看到所有的CUDA标记。 main.cpp文件中没有实际的CUDA,因此无关紧要。

如果没有重命名kernels.cukernels.cuh构建失败,则会出现多个定义错误,因为它编译了两次。

目前的配置似乎有效,我希望这对某人有帮助。我真的希望有一些关于文件扩展如何影响Nsight中的构建规则的明确文档或设置...