function define in .h declared in .cu

前端 未结 1 707
情歌与酒
情歌与酒 2021-01-27 00:26

I made a project split in three folders : src, include, obj I am using CImg.h and cuda.h library. I declare void convolve(cimg_library::CImg&, cimg_libra

1条回答
  •  时光取名叫无心
    2021-01-27 00:46

    1. please don't post code (or Makefile contents) with line numbers. It just gets in the way, usually.
    2. The compilation process here follows a compile...link process. The first stage is the compile stage, and you should be using -c for both g++ and nvcc during this stage (i.e. for both types of Makefile targets)
    3. nvcc has no -cu option. I think maybe you meant -x cu

    I also removed the ampersands on the function call.

    Here is a simplified example based on what you have shown, primarily removing the CImg stuff and some other unnecessary items:

    $ cat main.cpp
    #include "convolve.h"
    
    int main(){
    
    int var1 = 0;
    int var2 = 1;
    convolve(var1, var2);
    }
    $ cat convolve.h
    void convolve(int &, int &);
    $ cat convolve.cu
    #include "convolve.h"
    
    __global__ void kernel(){};
    
    void convolve(int & i1, int & i2){
    
    kernel<<<1,1>>>();
    }
    $ cat Makefile
    CC=nvcc
    CX=g++
    IDIR = .
    special_IDIR = /usr/local/cuda-9.1/include
    LDIR = /usr/local/cuda-9.1/lib64
    CFLAGS=-I$(special_IDIR) -L$(LDIR)
    LIBS =
    ODIR = .
    _DEPS = convolve.h
    DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
    _OBJ = main.o convolve.o
    OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
    $(ODIR)/%.o: %.cu $(DEPS)
            $(CC) -c -x cu -o $@ $< $(CFLAGS)
    $(ODIR)/%.o: %.cpp $(DEPS)
            $(CX) -c -x c++ -o $@ $< $(CFLAGS) $(LIBS)
    all: $(OBJ)
            $(CC) -o $@ $^ $(CFLAGS)
    .PHONY: clean
    clean:
            rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~
    $ make clean
    rm -f ./*.o *~ core /*~
    $ make
    g++ -c -x c++ -o main.o main.cpp -I/usr/local/cuda-9.1/include -L/usr/local/cuda-9.1/lib64
    nvcc -c -x cu -o convolve.o convolve.cu -I/usr/local/cuda-9.1/include -L/usr/local/cuda-9.1/lib64
    nvcc -o all main.o convolve.o -I/usr/local/cuda-9.1/include -L/usr/local/cuda-9.1/lib64
    $
    

    change the instances of cuda-9.1 to cuda-9.0 in the above Makefile if you have CUDA 9.0 in your setup. The linker libs (-L) are not really needed for the compile commands, however. When linking with nvcc as we are doing here, it's also unnecessary to pass the -I and -L switches that refer to the CUDA includes and CUDA libraries that are part of the toolkit. nvcc already knows how to find those.

    There may be any number of additional recommendations or tweaks to the Makefile, for instance the -x cu and -x c++ switches are probably unnecessary (at least they are unnecessary for my simplified example) but my objective here is not to create the perfect Makefile, but to give you a roadmap to get past the issue you are currently witnessing.

    0 讨论(0)
提交回复
热议问题