Gcc 使用nvcc和g+编译+;

Gcc 使用nvcc和g+编译+;,gcc,cuda,linker,g++,nvcc,Gcc,Cuda,Linker,G++,Nvcc,我正在使用Nvidia的nvcc编译器编译一个.cpp文件,该文件将包含设备代码(但现在只包含主机代码)。我用的程序是用C和C++编写的,用GCC/G++编译,用G++连接最终的可执行文件。最初,当我使用-Ofast运行我的程序时,它运行大约需要2秒,但我考虑了nvcc来编译1.cpp文件,其余的使用gcc/g++,让g++将其链接在一起,程序运行大约需要8秒。如果我用nvcc编译更多的.cpp文件,它的速度会减慢更多(~10秒)。我试着调整我的make文件,用nvcc编译所有的东西,但是我收到

我正在使用Nvidia的nvcc编译器编译一个.cpp文件,该文件将包含设备代码(但现在只包含主机代码)。我用的程序是用C和C++编写的,用GCC/G++编译,用G++连接最终的可执行文件。最初,当我使用-Ofast运行我的程序时,它运行大约需要2秒,但我考虑了nvcc来编译1.cpp文件,其余的使用gcc/g++,让g++将其链接在一起,程序运行大约需要8秒。如果我用nvcc编译更多的.cpp文件,它的速度会减慢更多(~10秒)。我试着调整我的make文件,用nvcc编译所有的东西,但是我收到了太多来自C代码的错误。只有C++代码在NVCC编译时才能够运行而无错误。nvcc是否未优化主机代码?为什么会发生这种情况?组织课程的最佳方式是什么

生成文件

CC = gcc
CCPP = g++
NVCC = /vol/cuda/8.0.61/bin/nvcc

#preprocessor defines
DEFINES = -DUSE_ZLIB

OPTFLAGS = -Ofast

#CFLAGS = -ansi -pedantic -Wall -Werror -fPIC 
#CFLAGS = -ansi -pedantic -Wall -fPIC 
CFLAGS = -ansi $(OPTFLAGS)
NVFLAGS = -x c++ -Wno-deprecated-gpu-targets -ccbin g++

NVLINKFLAGS = -L/vol/cuda/8.0.61/lib64/ -lcuda -lcudart
#NVLINKFLAGS += -L/vol/cuda/8.0.61/lib -lcuda -lcudart

CPPFLAGS = $(OPTFLAGS) -I./include $(DEFINES)
LINKFLAGS = -lz

all : simple

objs =  src/tourtre.o     \
    src/ctArc.o       \
    src/ctBranch.o    \
    src/ctComponent.o \
    src/ctNode.o      \
    src/ctQueue.o     \
    src/ctNodeMap.o   \
    examples/simple/obj/Data.o \
    examples/simple/obj/Mesh.o \
    examples/simple/obj/main.o

simple : $(objs)
    $(CCPP)  $(CPPFLAGS) -o simple $^ $(LINKFLAGS) $(NVLINKFLAGS)

src/tourtre.o : src/tourtre.c include/tourtre.h src/ctMisc.h include/ctArc.h include/ctNode.h src/ctComponent.h include/ctNode.h src/ctQueue.h src/ctAlloc.h
    $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@

src/ctArc.o : src/ctArc.c include/tourtre.h src/ctMisc.h include/ctArc.h 
    $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@

src/ctBranch.o : src/ctBranch.c include/tourtre.h src/ctMisc.h include/ctBranch.h 
    $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@

src/ctComponent.o : src/ctComponent.c include/tourtre.h src/ctMisc.h src/ctComponent.h 
    $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@

src/ctNode.o : src/ctNode.c include/tourtre.h src/ctMisc.h include/ctNode.h 
    $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@

src/ctQueue.o : src/ctQueue.c include/tourtre.h src/ctMisc.h src/ctQueue.h 
    $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@

src/ctNodeMap.o : src/ctNodeMap.c src/ctNodeMap.h include/ctNode.h src/ctQueue.h src/sglib.h
    $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@

examples/simple/obj/Data.o: examples/simple/src/Data.cpp examples/simple/src/Data.h examples/simple/src/Global.h 
    $(CCPP) $(CPPFLAGS) $(CFLAGS) -c $< -o $@

examples/simple/obj/Mesh.o: examples/simple/src/Mesh.cpp examples/simple/src/Data.h examples/simple/src/Global.h examples/simple/src/Mesh.h 
    $(NVCC) $(NVFLAGS) -c $< -o $@

examples/simple/obj/main.o: examples/simple/src/main.cpp examples/simple/src/Data.h examples/simple/src/Global.h examples/simple/src/Mesh.h 
    $(CCPP) $(CPPFLAGS) $(CFLAGS) -c $< -o $@


clean :
    -rm -rf src/*.o examples/simple/obj/*.o doc/html
CC=gcc
CCPP=g++
NVCC=/vol/cuda/8.0.61/bin/NVCC
#预处理器定义
定义=-DUSE_ZLIB
OPTFLAGS=-Ofast
#CFLAGS=-ansi-pedantic-Wall-Werror-fPIC
#CFLAGS=-ansi-pedantic-Wall-fPIC
CFLAGS=-ansi$(OPTFLAGS)
NVFLAGISS = -XC++(Wno)不推荐GPU目标-CcBN G++
NVLINKFLAGS=-L/vol/cuda/8.0.61/lib64/-lcuda-lcudart
#NVLINKFLAGS+=-L/vol/cuda/8.0.61/lib-lcuda-lcudart
CPPFLAGS=$(OPTFLAGS)-I./包括$(定义)
LINKFLAGS=-lz
全部:简单
objs=src/tourtre.o\
src/ctArc.o\
src/ctBranch.o\
src/ctComponent.o\
src/ctNode.o\
src/ctQueue.o\
src/ctNodeMap.o\
示例/simple/obj/Data.o\
示例/simple/obj/Mesh.o\
示例/simple/obj/main.o
简单:$(objs)
$(CCPP)$(CPPFLAGS)-o简单的$^$(链接标志)$(NVLINKFLAGS)
src/tourtre.o:src/tourtre.c include/tourtre.h src/ctMisc.h include/ctrc.h include/ctNode.h src/ctComponent.h include/ctNode.h src/ctQueue.h src/ctAlloc.h
$(CC)$(CPPFLAGS)$(CFLAGS)-c$<-o$@
src/ctArc.o:src/ctArc.c include/tourtre.h src/ctMisc.h include/ctArc.h
$(CC)$(CPPFLAGS)$(CFLAGS)-c$<-o$@
src/ctBranch.o:src/ctBranch.c include/tourtre.h src/ctMisc.h include/ctBranch.h
$(CC)$(CPPFLAGS)$(CFLAGS)-c$<-o$@
src/ctComponent.o:src/ctComponent.c include/tourtre.h src/ctMisc.h src/ctComponent.h
$(CC)$(CPPFLAGS)$(CFLAGS)-c$<-o$@
src/ctNode.o:src/ctNode.c include/tourtre.h src/ctMisc.h include/ctNode.h
$(CC)$(CPPFLAGS)$(CFLAGS)-c$<-o$@
src/ctQueue.o:src/ctQueue.c include/tourtre.h src/ctMisc.h src/ctQueue.h
$(CC)$(CPPFLAGS)$(CFLAGS)-c$<-o$@
src/ctNodeMap.o:src/ctNodeMap.csrc/ctNodeMap.h include/ctNode.h src/ctQueue.h src/sglib.h
$(CC)$(CPPFLAGS)$(CFLAGS)-c$<-o$@
examples/simple/obj/Data.o:examples/simple/src/Data.cpp examples/simple/src/Data.h examples/simple/src/Global.h
$(CCPP)$(CPPFLAGS)$(CFLAGS)-c$<-o$@
examples/simple/obj/Mesh.o:examples/simple/src/Mesh.cpp examples/simple/src/Data.h examples/simple/src/Global.h examples/simple/src/Mesh.h
$(NVCC)$(NVFLAGS)-c$<-o$@
examples/simple/obj/main.o:examples/simple/src/main.cpp examples/simple/src/Data.h examples/simple/src/Global.h examples/simple/src/Mesh.h
$(CCPP)$(CPPFLAGS)$(CFLAGS)-c$<-o$@
清洁:
-rm-rf src/*.o示例/simple/obj/*.o doc/html

-Xcompiler-ansi-Xcompiler-Ofast
添加到NVFLAGS,以便主机编译器从nvcc获得与直接运行时相同的(优化)标志。

-Xcompiler-ansi-Xcompiler-Ofast
添加到NVFLAGS,以便主机编译器从nvcc获得与直接运行时相同的(优化)标志。非常感谢,这非常有效。谢谢你的反馈——既然有效,我就把评论变成了答案。