2011-03-01 78 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