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