CUDA, MySQL и CMake - PullRequest
       32

CUDA, MySQL и CMake

1 голос
/ 01 марта 2011

Я пытаюсь создать программу CUDA (в которой я новичок), которая включает в себя сначала получение информации из удаленной базы данных MySQL.Я использую библиотеку Connector / C с веб-сайта MySQL внутри программы до вызова CUDA.

Я могу скомпилировать свою программу с MySQL при использовании gcc (без кода CUDA), но нес nvcc (компилятором CUDA).Пир, знакомый с CUDA, упомянул мне, что ему нужно скомпилировать некоторые файлы libjpg, которые он делал с nvcc, чтобы избежать «неправильной архитектуры» и связывания проблем.Он предложил мне скомпилировать библиотеку Connector / C с помощью nvcc.Тем не менее, библиотека 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

Это всего лишь пара примеров, есть еще много файлов, которые не найдены.Правильно ли я подхожу к этой проблеме?Есть ли более очевидный обходной путь, который я просто не рассматриваю?Если я прав, пытаясь скомпилировать MySQL Connector / C с CUDA, есть ли какие-либо предложения для правильного включения файлов и библиотек, необходимых для Connector / C?

Спасибо за вашу помощь.

1 Ответ

1 голос
/ 02 марта 2011

Если вы можете отделить ядра 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.

...