2017-03-01 5 views
0

私はNvidiaのnvccコンパイラを使用してデバイスコードを含む.cppファイルをコンパイルしていますが、ホストコードのみが含まれています。私が使っているプログラムはCとC++で書かれていて、gcc/g ++を使ってコンパイルしています。そしてg ++は最終的な実行ファイルを一緒にリンクするのに使われます。もともと、私が-Ofastを使ってプログラムを実行すると、約2秒で実行されますが、nvccで1 .cppファイルをコンパイルし、gcc/g ++で残りをg ++にリンクしています。プログラムは約8秒かかります走るnvccでさらに.cppファイルをコンパイルすると、さらに遅くなります(〜10秒)。私はnvccですべてをコンパイルするために私のmakeファイルを調整しようとしましたが、Cコードから多すぎるエラーを受け取りました。 nvccでコンパイルすると、C++コードだけがエラーなしで実行できるように見えます。 nvccはホストコードを最適化していませんか?なぜこれが起こるのですか?プログラムを構成する最善の方法は何ですか?nvccとg ++でコンパイル

Makefileの

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 [email protected] 

src/ctArc.o : src/ctArc.c include/tourtre.h src/ctMisc.h include/ctArc.h 
    $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o [email protected] 

src/ctBranch.o : src/ctBranch.c include/tourtre.h src/ctMisc.h include/ctBranch.h 
    $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o [email protected] 

src/ctComponent.o : src/ctComponent.c include/tourtre.h src/ctMisc.h src/ctComponent.h 
    $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o [email protected] 

src/ctNode.o : src/ctNode.c include/tourtre.h src/ctMisc.h include/ctNode.h 
    $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o [email protected] 

src/ctQueue.o : src/ctQueue.c include/tourtre.h src/ctMisc.h src/ctQueue.h 
    $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o [email protected] 

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

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 [email protected] 

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 [email protected] 

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 [email protected] 


clean : 
    -rm -rf src/*.o examples/simple/obj/*.o doc/html 
+1

NVFLAGSに '-Xcompiler -ansi -Xcompiler -Ofast'を追加すると、ホストコンパイラはnvccから直接(最適化)フラグを直接実行するようになります。 – tera

+0

ありがとう、それは完全に働いた。 – Nubcake

+0

フィードバックをいただきありがとうございます。私はこのコメントを答えに変えました。 – tera

答えて

2

ホストコンパイラを直接実行したときのようにNVCCから同じ(最適化)のフラグを取得するようにNVFLAGSに-Xcompiler -ansi -Xcompiler -Ofastを追加します。

関連する問題