我为主要用C ++编写的大型科学代码设置了Autotools,还设置了一些CUDA。我找到了一个编译和编译的例子。将CUDA代码链接到Autotools中的C代码,但我无法用C ++代码复制该成功。我已经听说使用CMake会更容易,但不幸的是我们已经致力于Autotools。
在我们的旧手写Makefile中,我们只是使用make规则来编译cuda_kernels.cu'进入' cuda_kernels.o'使用nvcc,并将cuda_kernels.o添加到要编译成最终二进制文件的对象列表中。很好,很简单,而且很有效。
另一方面,Autotools的基本策略似乎是使用Libtool将.cu文件编译成&#; libcudafiles.la',然后将其余代码链接到该库。然而,这在链接时失败了,其中包含一大堆未定义的引用..."来自链接器的语句。这似乎可能是g ++与nvcc编译器相关的名称错误问题(这可以解释为什么它适用于C代码),但我不知道此时该怎么做。
所有.cpp和.cu文件都位于top / src目录中,所有编译都在top / obj目录中完成。这里是obj / Makefile.am的相关细节:
cuda_kernals.cu.o:
$(NVCC) -gencode=arch=compute_20,code=sm_20 -o $@ -c $<
libcudafiles_la_LINK= $(LIBTOOL) --mode=link $(CXX) -o $@ $(CUDA_LDFLAGS) $(CUDA_LIBS)
noinst_LTLIBRARIES = libcudafiles.la
libcudafiles_la_SOURCES = ../src/cuda_kernels.cu
___bin_main_LDADD += libcudafiles.la
___bin_main_LDFLAGS += -static
作为参考,我设法在我们的GPU集群上工作的例子可以在clusterchimps.org上找到。
感谢任何帮助!
答案 0 :(得分:1)
libtool
与automake
一起生成foo.lo
(libtool-object metadata)文件,非PIC(静态)对象foo.o
和PIC对象{ {1}}。
对于一致的.libs/foo.o
个文件,我使用的规则如下:
.lo
我不知道nvcc是否或如何处理.cu.lo:
$(LIBTOOL) --tag=CC --mode=compile $(NVCC) [options...] -c $<
标志。更多选项here。我不知道你正在从程序中拨打什么电话,但是你是否正在用C链接声明CUDA代码?如,
-PIC
似乎其他人已经遇到了libtool问题。在最坏的情况下,您可能需要一个&#39;脚本&#39;模仿extern "C" void cudamain (....);
语法和文件位置的解决方案,如clusterchimps网站所述。