web-dev-qa-db-ja.com

CUDAコードをコンパイルしてC ++プロジェクトにリンクするにはどうすればよいですか?

私はCUDAを含むプロジェクトを始めるための助けを探しています。私の目標は、ネイティブg ++コンパイラーでコンパイルできるが、CUDAコードを使用するプロジェクトを持つことです。私はCUDAコードをnvccコンパイラでコンパイルする必要があることを理解していますが、私の理解から、CUDAコードをなんとかしてキュービンファイルまたはptxファイルにコンパイルできます。

私の質問は次のとおりです。

  1. Nvccを使用して、cubinファイルまたはptxファイルにコンパイルするにはどうすればよいですか? -cなどは必要ありませんか?
  2. どのファイルタイプを使用しますか?
  3. プロジェクトを正しくコンパイルおよびリンクするためのg ++​​コマンドとは何ですか?

以下を想定します。

  1. Main関数を持ち、cuda.hを含む「main.cpp」というファイルがあります。
  2. CUDAコードを含む「cudaFunc.cu」という別のファイルがあります。たとえば、main.cppに存在する2つの整数配列を追加したいとします。
46
Matthew

これらを含むいくつかの異なる投稿で問題を解決することができました。 64ビットマシンを使用して64ビットライブラリにリンクしていることを忘れないでください!それは一種の明白な継ぎ目ですが、私のような道化師にとって、それは私が忘れていたものです。私が現在使用しているメイクファイルは...です。このメイクファイルをダイジェストできれば、cudaコードと他のG ++コードの別々のコンパイルである私がしようとしていたことを行うことができるはずです。また、特定のバージョンでgcc、g ++コンパイラが必要であることに注意してください(私はg ++-4.4を使用しており、私のために働いています)とにかく、ここにmakeファイルがあります...

all: program

program: cudacode.o
    g++ -o program -L/usr/local/cuda/lib64 -lcuda -lcudart main.cpp  cudacode.o 

cudacode.o:
    nvcc -c -Arch=sm_20 cudacode.cu 

clean: rm -f *.o program

nvccコンパイラーと.cuオプションを使用して(-cとして保存されている)cudacodeをコンパイルすることが最初にできることを願っています。 -Arch=sm_20)を削除します。これにより、cudacode.oが作成されました。次に、-oオプションを指定してg ++コンパイラを使用し、lib64ライブラリにリンクし、-lcudaおよび-lcudartライブラリをリンクして、main.cppをコンパイルし、cudacode.o。これが誰かを助けることを願っています!

49
Matthew

私の答え この最近の質問に対する はおそらくあなたが必要とするものを説明しています。

追加の注意事項:

  1. .cu.cubinまたは.ptxファイルにコンパイルする必要はありません。 .oオブジェクトファイルにコンパイルし、g ++でコンパイルされた.cppファイルの.oオブジェクトファイルとリンクする必要があります。
  2. CudaカーネルコードをcudaFunc.cuに配置することに加えて、カーネルを起動するファイルにCまたはC++ラッパー関数を配置する必要があります(CUDAドライバーAPIを使用している場合を除きます。 。また、このラッパー関数のプロトタイプにヘッダーファイルを追加して、CUDAコードを呼び出す必要があるC++コードに含めることができます。次に、標準のg ++​​リンク行を使用してファイルをリンクします。
15
harrism

コンパイル済みのcudaオブジェクトコードをg ++とリンクするのは面倒なことがわかりました。次のようにコンパイルしてみてください:

all:
nvcc cudafile.cu mainfile.cpp -o executable

clean: rm -rf *.o
10