2016-10-26 24 views
1

CUDAについて言えば、私は総じて「初心者」です。だから私の質問が些細なものなら、私を許してください。CUDAデバイス側コードのC/C++ "inline"キーワード

nvccはinline Cキーワードの意味を理解していますか?
私は__forceinline__と同様のnvcc "マクロ"を知っているので、私はinlinecudaデバイス側のコードを書く方法を尋ねていません。
私のコードは、nvccとc/C++コンパイラ(私はVisual Studio IDEを使用しています)の間で "分割"されています。
これは、__device__または__global__カーネルの横にあるときに、inlineキーワードがnvccによって無視されることを意味しますか?

編集:
P.S.私はcudaプログラミングガイドを検索しました。 inlineのエントリの下で有用なものが見つからなかった場合、同様の「タグ」も役に立ちません。

+1

あなたが何を求めているのかわかりません。 CUDAのドキュメントはC++標準のドキュメントを複製していません。ISO C++では、「インライン」指定子は、呼び出し時の関数本体のインライン置換が通常の関数呼び出しメカニズムよりも優先されることをインプリメンテーションに指示します。コール; [...] "。 'nvcc'は、標準で要求されているように' inline'の提案を受け入れます。 – njuffa

答えて

3

CUDAはC++ファミリのプログラミング言語です。したがって、CUDAのドキュメントは一般的に、標準的なC++のドキュメントを複製するものではなく、単に相違点と拡張機能を指摘しています。 CUDAドキュメンテーションの関数でinline指定子を使用した説明が見つからない場合は、標準C++形式で処理されていることを示す良い指標です。

質問のさまざまな部分を補間すると、inlineの使用が、生成されたコードの関数の実際のインライン展開にどのように影響するかが大抵懸念されているようです。

ISO C++ 11標準では、セクション7.1.2の関数属性としてinlineが指定されています。リンケージと重複定義に関する規定に加えて、それはinline指定子を持つ関数の実際のインライン化について次のように述べている:

インライン指定子はコールの時点で、関数本体のインライン 置換であること実装に示し通常の関数呼び出しメカニズムよりも好ましいのは です。呼び出し時にこのインライン置換を実行する必要がない実装は です。

のでinlineは単にそれを無視して自由であるコンパイラへ提案です。 CUDAコンパイラは、パフォーマンス上の理由からデフォルトでデバイスコード内の関数を積極的にインライン化するため、inlineの使用はデバイスコードにとってはかなり冗長なようですが、プログラマは自由に使用できます。

CUDAコンパイラで使用されるインライン・ヒューリスティックは、プログラマがあらゆる状況下でインライン展開したい特定の関数のインライン展開を妨げる可能性があります。この目的のために、CUDAは非標準の__forceinline__関数属性を提供します。この指定子は、nvccがMSVCの場合は__forceinlineなど、ホストコードの同等のホストコンパイラ特有の属性に変換するため、デバイスコードとホストコードの両方に影響します。これは、nvccがホストコンパイラに送信する中間C++ファイルをダンプして検査することで確認できます。

+0

ありがとうございました。それが私が探していたものです。ソーリー不明な質問。そしてbtw。私は '__forceinline__'がホストとデバイスのコードに影響を与えることを知らなかった。これは些細なように思えるかもしれませんが、結局それは私がcudaをよく理解するのを助けました。 – cukier9a7b5

関連する問題