2012-02-23 15 views
36

私はCUDAを含むプロジェクトを開始するための助けを募集しています。私の目標は、ネイティブg ++コンパイラでコンパイルできるが、CUDAコードを使用するプロジェクトを作ることです。私はnvccコンパイラでCUDAコードをコンパイルする必要があることを理解していますが、私の理解から、CUDAコードを何らかの形でcubinファイルまたはptxファイルにコンパイルできます。CUDAコードをコンパイルしてC++プロジェクトにリンクする方法はありますか?

ここに私の質問は以下のとおりです。

  1. どのように私はCUBINファイルまたはPTXファイルにコンパイルするNVCCを使用していますか? -cや何か必要ない?
  2. どのファイルタイプを使用しますか?
  3. プロジェクトを正しくコンパイルしてリンクするためのg ++​​コマンドとは何ですか?

次のことを想定します

  1. 私はそれの主な機能を有しており、cuda.h.を含む「main.cppに」というファイルを持っています
  2. 私はCUDAコードを持った "cudaFunc.cu"と呼ばれる別のファイルを持っています。たとえば、main.cppに存在する2つの整数配列を追加したいとしましょう。

答えて

39

私はこれらのものを含むいくつかの異なる投稿で私の問題を解決することができました。 64ビットマシンを使用して64ビットライブラリにリンクしている場合は、忘れないでください!それは明らかなような縫い目ですが、私のようなピエロのために、私が忘れたものです。ここで私が使っているmakeファイルは...あなたがこのmakeファイルをダイジェストできれば、私はしようとしていたことをできるはずです。これはcudaコードと他のG ++コードの別々のコンパイルです。また、特定のバージョンのG ++コンパイラはgccを持っている必要があることに注意しておく(私が使用しています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 -rf *o program 

うまくいけば、あなたをnvccコンパイラと-cオプションを使用してcudacode(.cuとして保存されている)をコンパイルすることがわかります(-arch = sm_20を削除することもできます)。これでcudacode.oが作成されました。次に、g ++コンパイラを-oオプションで使用してlib64ライブラリにリンクし、main.cppをコンパイルしてlcudaとlcudartファイルをリンクしてから、cudacode.oをリンクします。これが誰かを助けることを願って!

+0

テストした最小の '.cu'ファイルと' .cpp'ファイルを提供できますか?特にinclude、cpp、特にカーネルの '__global__'関数を' .cu'からどのように見るかについて興味があります。 –

+1

そこに注意すると、きれいなターゲットは 'o'で終わるすべてのファイルを削除します。おそらく、 'clean:rm -rf * .o program' – gerowam

+1

ありがとうございました。これはとても役に立ちました。ありがとうございました(Matthew:https://stackoverflow.com/users/1226843/matthew)。 – SRG

8

私の回答to this recent questionは、必要なものを説明している可能性があります。

追加のノートのカップル:

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

私はother answerを繰り返し始めていますので、読んでみることをお勧めします。 :)

+0

ハリスム、あなたの答えをありがとう。私は今、もっと近くにいる。私はnvccコンパイラと.cuファイル(私はcudacode.cuに名前を変更しました)を使ってうまくコンパイルできますし、cudacode.oオブジェクトを持っていますが、今はg ++でコンパイルしようとするとcudacode.o:In関数'wrapper(int *、int *、int *、int)': tmpxft_00000d3a_00000000-1_cudacode.cudafe1.cpp :(。テキスト+ 0x30):未定義の 'cudaMalloc 'への参照 – Matthew

+0

libcudartをリンクする必要があります。最初にlibcudart.soがどこにあるのか分かります。 - デフォルトでは/ usr/local/bin/cudaに入ると思いますが、それはインストールによって異なります。パスを見つけたら、これをリンク行に追加してください: '-L -lcudart'。 – harrism

+0

あなたは私のヒーローです!ありがとうございました。私が持っていた追加の問題は、私は64ビットマシン上にあるので、私はlib64ファイルにリンクしなければなりませんでした。ちょうど3時間前に私はg ++を使う方法を知らなかった。私はmakeファイルが何であるか分からず、リンクする方法を知らなかった。私はそれが私が窓で育つために得るものだと思います。 – Matthew

7

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

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

clean: rm -rf *.o 
+0

* .oファイルは通常のファイルでなければならないので、私はrm -rfではなくrm -fを使用します。致命的なエラーが発生するのは怖いです:https://www.theregister.co.uk/2015/01/17/scary_code_of_the_week_steam_cleans_linux_pcs / –

関連する問題