How should a very simple Makefile look like for Cuda compiling under linux

前端 未结 4 1930
天命终不由人
天命终不由人 2021-02-04 12:38

I want to compile a very basic hello world level Cuda program under Linux. I have three files:

  • the kernel: helloWorld.cu
  • main method: helloWorld.cpp
相关标签:
4条回答
  • 2021-02-04 12:55

    My version, verbose but transparent:

    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 $<
    
    0 讨论(0)
  • 2021-02-04 13:14

    Here is an example what my current project looks like. As you can see there is a few OpenGL libraries

    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
    

    then run make ce and ./ce

    0 讨论(0)
  • 2021-02-04 13:16

    Just in case, here's my variant. I use it to compile CUDA projects on Mac, but I think it will suit Linux too. It requires 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
    
    0 讨论(0)
  • 2021-02-04 13:16

    I've never heard of Cuda before, but from the online documentation it looks as if X.cu is supposed to be compiled into X.o, so having helloWorld.cu and helloWorld.cpp is not a good idea. With your permission I'll rename the "kernel" helloKernel.cu, then this should work:

    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 $@
    

    (Note that those leading spaces are tabs.)

    If that works, try a slicker version:

    NVCC = nvcc
    
    helloWorld.o: %.o : %.cpp %.h
    helloKernel.o: %.o : %.cu
    
    %.o:
        $(NVCC) -c %< -o $@
    
    helloWorld: helloWorld.o helloKernel.o
        $(NVCC) %^ -o $@
    
    0 讨论(0)
提交回复
热议问题