1

最初にリモートMySQLデータベースから情報を取得するCUDAプログラム(私は初めてです)を作成しようとしています。CUDA 呼び出しの前に、プログラム内で MySQL Web サイトの Connector/C ライブラリを使用しています。

gcc (CUDA コードなし) を使用すると MySQL でプログラムをコンパイルできますが、nvcc (CUDA コンパイラ) ではコンパイルできません。CUDA に精通しているピアは、「間違ったアーキテクチャ」とリンクの問題を回避するために、nvcc で行っていた libjpg のものをコンパイルする必要があると私に言いました。彼は、Connector/C ライブラリを nvcc でコンパイルすることを提案しました。ただし、Connector/C ライブラリは、通常の Makefile の代わりに CMake を使用します。

そのため、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 に必要なファイルとライブラリを適切に含めるための提案はありますか?

ご協力いただきありがとうございます。

4

1 に答える 1

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

使いやすさのために、次の 3 つの関数も含めました。

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 に答える