2017-08-27 6 views
0

私はC++ GPU上で実行するためのCUDAコードにのみプロジェクトを変換しようとしています。cuda - nvccは__host__コードをどのようにコンパイルしますか?

私はCUDAプログラミングに新たなんだと、私はこのような状況で何をするか分からない:

私は非常に複雑なクラス定義を持っているし、今私は、デバイスへのクラスのインスタンスを渡し、実行したい場合デバイス上のメンバ関数のいくつかを、私は.cppファイル全体を書き直す必要があります。デバイス上で実行されるこれらの機能を__host__ __device__にするだけでいいですか、それともすべての機能を書き直す必要がありますか?

私は__host__として機能なしタイプ修飾子を持つnvcc御馳走機能だと思います。ホストコードをどのようにコンパイルするのですか? g++とまったく同じようにコンパイルしますか?

答えて

1

私は非常に複雑なクラス定義を持っているし、今私は、デバイスに クラスのインスタンスを渡すと、デバイス上でそのメンバ関数の一部 を実行したい場合は、私はその後、私の全体の.cppファイルを書き換える必要があります。私はすべての機能を書き換える必要があります私は __host__ __device__または にデバイス上で実行これらの機能を有効にする必要がありますか?あなたのコードに完全に依存し

。 CUDAは、C++言語の機能(完全hereを文書化)の限定されたサブセットをサポートしており、ほとんどのC++標準ライブラリがサポートされていません。したがって、一般的な答えはありませんが、GPUで呼び出したい場合は、クラスメンバー関数コードの少なくとも一部を書き直す必要があります。

nvccは、ファンクションタイプの修飾子を持たない関数を__host__として扱うと思います。ホストコードをどのようにコンパイルするのですか? g ++とまったく同じようにコンパイルしますか?

理解するための最初のものは、それがコンパイラドライバで、NVCCコンパイラではないということです。 .cuファイル拡張子のないファイルのプレーンC++コードは、既定で変更なしで事前定義されたコンパイラオプションのセットを使用してホストコンパイラに直接渡されます。 .cu拡張ファイル内の

ホストコードCUDAの構文を探すために、CUDA C++フロントエンドによって解析された後、ホストコンパイラに渡されます。このプロセスは、非常に複雑なテンプレート定義やエッジ言語機能の欠如で失敗する可能性があります。 nvccにはCUDAヘッダーも自動的に含まれており、これらのヘッダーは独自のコードの内容と競合する可能性があります。しかし、最終的にホストコードはホストC++コンパイラに到達しますが、別のルートになります。

関連する問題