1

我正在尝试创建一个 CUDA 程序(我是新手),该程序首先从远程 MySQL 数据库中获取信息。在 CUDA 调用之前,我在程序内部使用 MySQL 网站的 Connector/C 库。

使用 gcc(没有任何 CUDA 代码)时,我可以使用 MySQL 编译我的程序,但不能使用 nvcc(CUDA 编译器)。一位熟悉 CUDA 的同行向我提到,他必须编译一些他用 nvcc 做的 libjpg 东西,以避免“错误的架构”和链接问题。他建议我用 nvcc 编译 Connector/C 库。但是,Connector/C 库使用 CMake 而不是常规的 Makefile。

因此,作为 CMake 的新手,我研究了一些东西并找到了听起来很像我需要的工具链文件(在此处找到)。但是,我在编译期间遇到了问题,其中所有默认包含和连接器/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 连接器/C 是正确的,是否有任何建议可以正确包含连接器/C 所需的文件和库?

谢谢你的帮助。

4

1 回答 1

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

  $(call source-dir-to-build-dir, $(subst .cu,.ptx, $2)): $(call generated-source,$2)
    $(NVCC) -ptx $(CUBIN_ARCH_FLAG) $(NVCCFLAGS) $(INCFLAGS) $(DEFINES) $(SMVERSIONFLAGS) -o $$@ $$<
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

于 2011-03-02T19:01:45.210 回答