0

我有一堆使用动态并行性的 .cu 文件(a.cu、b.cu、c.cu..、e.cu、f.cu),以及一个使用 MPI 从.cu 在多个节点上。我正在尝试编写一个 make 文件来编译可执行文件,但我一直面临以下错误:

cudafiles.o: In function `__cudaRegisterLinkedBinary_66_tmpxft_00001a84_00000000_17_cuda_device_runtime_compute_61_cpp1_ii_8b1a5d37':
link.stub:(.text+0x1fb): undefined reference to `__fatbinwrap_66_tmpxft_00001a84_00000000_17_cuda_device_runtime_compute_61_cpp1_ii_8b1a5d37'

这是我的生成文件:

INCFILES=-I/usr/local/cuda-8.0/include -I/opt/mpi/mvapich2-gnu/2.2/include -I./
LIBFILES=-L/usr/local/cuda-8.0/lib64 -L/opt/mpi/mvapich2-gnu/2.2/lib
LIBS=-lcudart -lcudadevrt -lcublas_device -lmpi 
ARCH=-gencode arch=compute_60,code=sm_60
NVCC=nvcc -ccbin g++


default: all

all: clean final.o

io.o: io.cpp
        g++ -c -std=c++11  io.cpp 


final.o: io.o a.cu b.cu c.cu d.cu e.cu f.cu main.cpp
        $(NVCC) -std=c++11 $(INCFILES) $(LIBFILES) $(LIBS) -g -G -Xptxas -v -dc $(ARCH) a.cu b.cu c.cu d.cu e.cu f.cu
        $(NVCC) -std=c++11 $(ARCH) $(INCFILES) $(LIBFILES) $(LIBS) -rdc=true -dlink a.o b.o c.o d.o e.o f.o io.o -o cudafiles.o
        mpicxx -O3 $(INCFILES) $(LIBFILES) -c main.cpp -o main.o
        mpicxx $(INCFILES) $(LIBFILES) $(LIBS) cudafiles.o a.o b.o c.o d.o e.o f.o io.o main.o -o exec

clean:
        rm -rf *.o exec
4

1 回答 1

0
  1. 报告的原始问题是对main. 这是由以下行引起的Makefile

    $(NVCC) -std=c++11 $(ARCH) $(INCFILES) $(LIBFILES) $(LIBS) -rdc=true a.o b.o c.o d.o e.o f.o io.o -o cudafiles.o
    

    正如构造的那样,这实际上指示nvcc执行完整/最终链接。但是,此行的目的是仅执行 device-link 步骤,在使用-rdc=trueor编译时需要-dc,并且在不使用 执行最终链接时需要nvcc。在这种情况下,最终链接由mpicc/执行mpicxx。要仅执行设备链接步骤,我们需要指定-dlink. 如果没有该开关,nvcc则希望进行最终链接,但由于提供的对象都不包含main函数而失败。-dlink正确的解决方案是使用交换机,因为我们此时不打算进行最终链接。

  2. 我还建议将所有内容都转换为 C++ 样式的链接,因为nvcc这样链接。可以用 C++ 样式的链接来整理 C 样式的链接,但这对我来说似乎很麻烦。因此我建议将唯一的.c文件(main.c)转换为.cpp文件,并从转换mpiccmpicxx

  3. 出现的下一个问题是对 egcudaSetDevice()和的未定义引用cudaFree()。这些是 CUDA 运行时 API 库(“libcudart”)的一部分。使用 执行最终链接时nvcc,这些会自动链接。但是由于最终链接是由mpicxx(基本上是 包装器g++)执行的,因此有必要专门使用-lcudart.

  4. 最后,剩下的问题是链接顺序问题。简而言之,需要在链接器命令行中从左到右满足链接依赖关系。不同的编译器对此或多或少有些挑剔。最后的重新排序更改是以正确的顺序指定要链接的库,并在链接命令行的末尾指定这些库,以便对这些库的任何依赖项,在链接命令行的左侧,使满意。

于 2018-04-03T22:21:33.263 回答