Compilation 在linux下编译Cuda时,一个非常简单的Makefile应该是什么样子

Compilation 在linux下编译Cuda时,一个非常简单的Makefile应该是什么样子,compilation,cuda,makefile,gpgpu,Compilation,Cuda,Makefile,Gpgpu,我想在Linux下编译一个非常基本的hello世界级Cuda程序。我有三个文件: 内核:helloWorld.cu 主要方法:helloWorld.cpp 公共标题:helloWorld.h 你能给我写一个简单的Makefile来用nvcc和g++编译这个吗 谢谢, Gabor我以前从未听说过Cuda,但从在线文档来看,似乎X.cu应该被编译成X.o,因此拥有helloWorld.cu和helloWorld.cpp不是一个好主意。如果您允许,我将重命名“kernel”helloKernel.

我想在Linux下编译一个非常基本的hello世界级Cuda程序。我有三个文件:

  • 内核:helloWorld.cu
  • 主要方法:helloWorld.cpp
  • 公共标题:helloWorld.h
你能给我写一个简单的Makefile来用nvcc和g++编译这个吗

谢谢,

Gabor

我以前从未听说过Cuda,但从在线文档来看,似乎X.cu应该被编译成X.o,因此拥有helloWorld.cu和helloWorld.cpp不是一个好主意。如果您允许,我将重命名“kernel”helloKernel.cu,这样应该可以:

NVCC = nvcc helloWorld.o: helloWorld.cpp helloWorld.h $(NVCC) -c %< -o $@ helloKernel.o: helloKernel.cu $(NVCC) -c %< -o $@ helloWorld: helloWorld.o helloKernel.o $(NVCC) %^ -o $@ NVCC=NVCC helloWorld.o:helloWorld.cpp helloWorld.h $(NVCC)-c%<-o$@ helloKernel.o:helloKernel.cu $(NVCC)-c%<-o$@ helloWorld:helloWorld.o helloKernel.o $(NVCC)%^-o$@ (请注意,这些前导空格是制表符。)

如果有效,请尝试更圆滑的版本:

NVCC = nvcc helloWorld.o: %.o : %.cpp %.h helloKernel.o: %.o : %.cu %.o: $(NVCC) -c %< -o $@ helloWorld: helloWorld.o helloKernel.o $(NVCC) %^ -o $@ NVCC=NVCC helloWorld.o:%.o:%.cpp%.h helloKernel.o:%.o:%.cu %.o: $(NVCC)-c%<-o$@ helloWorld:helloWorld.o helloKernel.o $(NVCC)%^-o$@
以防万一,这是我的变体。我用它在Mac上编译CUDA项目,但我认为它也适合Linux。它需要CUDA SDK

BINDIR = ./ # places compiled binary in current directory
EXECUTABLE := helloWorld

CCFILES := helloWorld.cpp
CUFILES := helloWorld.cu

# an ugly part - setting rootdir for CUDA SDK makefile
# look for common.mk - I don't know where SDK installs it on Linux -
# and change ROOTDIR accordingly 
ROOTDIR := /Developer/GPU\ Computing/C/common

include $(ROOTDIR)/../common/common.mk

我的版本,冗长但透明:

myapp: myapp.o g++ -fPIC -o $@ $< -L /usr/local/cuda/lib -lcudart myapp.o: myapp.cu /usr/local/cuda/bin/nvcc --compiler-options -fno-strict-aliasing \ -I/usr/local/cuda/include \ -DUNIX -O2 -o $@ -c $< matrixMul: matrixMul.o g++ -fPIC -o $@ $< -L /usr/local/cuda/lib -lcudart # It MUST be named .cu or nvcc compiles as regular C !!! (no __global__) matrixMul.o: matrixMul.cu /usr/local/cuda/bin/nvcc --compiler-options -fno-strict-aliasing \ -I/usr/local/cuda/include \ -DUNIX -O2 -o $@ -c $< myapp:myapp.o g++-fPIC-o$@$<-L/usr/local/cuda/lib-lcudart myapp.o:myapp.cu /usr/local/cuda/bin/nvcc--编译器选项-fno严格别名\ -I/usr/local/cuda/include\ -DUNIX-O2-o$@-c$< matrixMul:matrixMul.o g++-fPIC-o$@$<-L/usr/local/cuda/lib-lcudart #它必须命名。cu或nvcc编译为常规C!!!(否全球) matrixMul.o:matrixMul.cu /usr/local/cuda/bin/nvcc--编译器选项-fno严格别名\ -I/usr/local/cuda/include\ -DUNIX-O2-o$@-c$<
下面是我当前项目的一个示例。如您所见,有几个OpenGL库

ce : cudaExample.c cudaExample.h
    cp cudaExample.c cudaExample.cu
    /usr/local/cuda/bin/nvcc -arch=sm_20 -o ce -lglut -lGL -lGLU -lXext -lXmu -lX11 -lm  cudaExample.cu
然后运行
make ce

/ce

你能在普通的cpp文件上使用nvcc吗?我没有访问nvcc的权限,所以我不能确定,但根据文档,是的。对于普通的编译器任务,nvcc将任务交给标准编译器,如g++。请用[make]标记标记与make相关的问题。理由:我知道这篇文章的年龄,但是对于那些开始使用CUDA<5.x的人来说,这些信息可能会派上用场。实际上,接受的答案依赖于common.mk文件,该文件将cutil依赖项作为“-lcutil”拉入。无论如何,对于CUDA>=5.x,不再需要/鼓励使用common.mk,因为所有的makefile都是自包含的(也就是Changelog)