如何让 Nsight EE 使用 -dc 标志进行编译?
How to get Nsight EE to compile with -dc flag?
我正在尝试使用 Nsight 编译一个 CUDA 应用程序,它将 .cpp
文件编译为 .o
文件,然后链接主应用程序。我的构建基于 NVIDIA "Parallel for All" 示例 Separate Compilation and Linking of CUDA C++ Device Code and its 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 中进行,这样所有的内省都可以正常工作等。
我解决了这个问题,虽然我还是不完全明白...
似乎 -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
文件使用 -x cu
(语言 CUDA)编译为 .o
文件,然后链接,但 .cpp
文件使用语言 -x c++
编译因此看不到所有 CUDA 标记。 main.cpp
文件中没有实际的 CUDA,因此无关紧要。
如果不将 kernels.cu
重命名为 kernels.cuh
,构建将失败并出现多个定义错误,因为它编译了两次。
当前配置似乎可以工作,希望这对某人有所帮助。我真的希望有一些关于文件扩展名如何影响 Nsight 构建规则的清晰文档或设置...
我正在尝试使用 Nsight 编译一个 CUDA 应用程序,它将 .cpp
文件编译为 .o
文件,然后链接主应用程序。我的构建基于 NVIDIA "Parallel for All" 示例 Separate Compilation and Linking of CUDA C++ Device Code and its 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 中进行,这样所有的内省都可以正常工作等。
我解决了这个问题,虽然我还是不完全明白...
似乎 -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
文件使用 -x cu
(语言 CUDA)编译为 .o
文件,然后链接,但 .cpp
文件使用语言 -x c++
编译因此看不到所有 CUDA 标记。 main.cpp
文件中没有实际的 CUDA,因此无关紧要。
如果不将 kernels.cu
重命名为 kernels.cuh
,构建将失败并出现多个定义错误,因为它编译了两次。
当前配置似乎可以工作,希望这对某人有所帮助。我真的希望有一些关于文件扩展名如何影响 Nsight 构建规则的清晰文档或设置...