【问题标题】:CUDA, MySQL, and CMakeCUDA、MySQL 和 CMake
【发布时间】:2011-07-06 16:22:00
【问题描述】:

我正在尝试创建一个 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 Connector/C 是正确的,是否有任何建议可以正确包含 Connector/C 所需的文件和库?

感谢您的帮助。

【问题讨论】:

  • 我对这个了解不多,也没有写我项目的Makefile。但是,对于它的价值,快速浏览一下我的 Makefile 会告诉我,我们使用 nvcc 来处理带有内核的代码和链接,而我们使用 gcc 来处理其他代码。即,您是否尝试过使用 gcc 编译 MySQL 代码,但使用 nvcc 链接?

标签: mysql cuda cmake mysql-connector


【解决方案1】:

如果您可以将 CUDA 内核从您的 mysql 调用中分离出来并将它们放在单独的文件中,您可以使用您的 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

【讨论】:

  • 这似乎有点压倒性。我会看看它,看看我能想出什么。我只是不熟悉我猜的makefile的行为。感谢您的回复,我会尽快回复。
猜你喜欢
  • 2011-02-06
  • 2015-10-31
  • 1970-01-01
  • 2018-09-20
  • 2017-06-01
  • 2016-07-01
  • 2018-11-01
  • 2021-08-19
相关资源
最近更新 更多