2011-03-01 79 views
1

我试图创建一个CUDA程序(我是新手),它涉及到第一次从远程MySQL数据库获取信息。在CUDA调用之前,我正在使用程序内部的MySQL网站上的Connector/C库。CUDA,MySQL和CMake

我可以在使用gcc(没有任何CUDA代码)的情况下使用MySQL编译我的程序,但不能使用nvcc(CUDA编译器)。熟悉CUDA的同行向我提到,他必须编译一些他正在用nvcc做的lib.jpg,以避免“错误的架构”和链接问题。他建议我用nvcc编译连接器/ C库。但是,Connector/C库使用CMake而不是常规的Makefile。因此,作为CMake的新手,我研究了一些东西,并找到了很多像我需要的东西(在这里找到)的工具链文件。不过,我在编译期间遇到了问题,其中包含Connector/C中使用的所有默认包含和库都未包含在内。具体

-- Looking for include files HAVE_ALLOCA_H 
-- Looking for include files HAVE_ALLOCA_H - not found. 

-- Looking for strstr 
-- Looking for strstr - not found 

这些只是几个例子,有很多未发现的多个文件。 我正确接近这个问题吗?有没有更明显的解决方法,我只是不考虑?如果我正确地尝试使用CUDA编译MySQL Connector/C,那么对于正确包含Connector/C所需的文件和库是否有任何建议?

感谢您的帮助。

+0

我对这个知之甚少,而且我没有编写我的项目的Makefile。但是,对于它的价值,快速查看我的Makefile向我显示,我们使用nvcc来处理内核和链接的代码,而我们使用gcc作为其他代码。即,您是否尝试过使用gcc编译MySQL代码,但是使用nvcc链接? – jmilloy 2011-03-01 22:01:28

回答

1

如果您可以从您的mysql调用中分离出CUDA内核并将它们放在单独的文件中,那么您可以使用Makefile。

我把所有的CUDA内核,并在这样的.CU文件,然后我有一个定义:

# 
# CUDA Compilation Rules 
# 

define cuda-compile-rule 
    $1: $(call generated-source,$2) \ 
    $(call source-dir-to-build-dir, $(subst .cu,.cubin, $2)) \ 
    $(call source-dir-to-build-dir, $(subst .cu,.ptx, $2)) 
    $(NVCC) $(CUBIN_ARCH_FLAG) $(NVCCFLAGS) $(INCFLAGS) $(DEFINES) -o [email protected] -c $$< 

    $(call source-dir-to-build-dir, $(subst .cu,.cubin, $2)): $(call generated-source,$2) 
    $(NVCC) -cubin -Xptxas -v $(CUBIN_ARCH_FLAG) $(NVCCFLAGS) $(INCFLAGS) $(DEFINES) $(SMVERSIONFLAGS) -o [email protected] $$< 

    $(call source-dir-to-build-dir, $(subst .cu,.ptx, $2)): $(call generated-source,$2) 
    $(NVCC) -ptx $(CUBIN_ARCH_FLAG) $(NVCCFLAGS) $(INCFLAGS) $(DEFINES) $(SMVERSIONFLAGS) -o [email protected] $$< 
endef 

我也包括易于使用的三个功能:

generated-source = $(filter %.cpp, $1) $(filter %.c, $1) $(filter %.f, $1) $(filter %.F, $1) $(filter %.cu, $1) 
source-dir-to-build-dir = $(addprefix $(BUILDDIR)/, $1) 
source-to-object = $(call source-dir-to-build-dir, \ 
      $(subst .f,.o,$(filter %.f,$1)) \ 
      $(subst .F,.o,$(filter %.F,$1)) \ 
      $(subst .c,.o,$(filter %.c,$1)) \ 
      $(subst .cpp,.o,$(filter %.cpp,$1)) \ 
      $(if $(filter 1,$(USE_CUDA)),$(subst .cu,.cu.o,$(filter %.cu,$1)))) 

然后你需要做的是建立一个源文件列表和呼叫:

$(foreach f,$(filter %.cu, $listOfFiles),$(call cuda-compile-rule,$(call source-to-object,$f),$f)) 

请注意,在函数source-to-object有一个变量,我用它来有条件地禁用CUDA编译USE_CUDA

+0

这似乎有点压倒性。我会看看它,看看我能想出什么。我只是不熟悉我猜测的makefile的行为。感谢您的回复,我会尽快回复。 – 2011-03-07 14:05:45