2 つの事実: CUDA 5.0 では、後でリンクするために CUDA コードをさまざまなオブジェクト ファイルにコンパイルできます。CUDA アーキテクチャ 2.x では、関数が自動的にインライン化されなくなりました。
C/C++ ではいつものように、関数__device__ int foo()
を に実装し、functions.cu
そのヘッダーを に配置しましたfunctions.hu
。関数foo
は、他の CUDA ソース ファイルで呼び出されます。
を調べると、それがローカル メモリに流出してfunctions.ptx
いることがわかります。foo()
テストの目的で、私は の肉のすべてをコメントし、foo()
それreturn 1;
を作成しました.ptx
. (関数は何もしないので、それが何であるか想像できません!)
しかし、実装をfoo()
ヘッダー ファイル に移動して修飾子functions.hu
を追加すると、__forceinline__
ローカル メモリには何も書き込まれません。
ここで何が起こっているのですか? CUDA がこのような単純な関数を自動的にインライン化しないのはなぜですか?
個別のヘッダーと実装ファイルの全体的なポイントは、コードの保守を容易にすることです。しかし、ヘッダーとそれらに一連の関数 (またはそれらすべて) を貼り付ける必要がある場合は__forceinline__
、CUDA 5.0 のさまざまなコンパイル ユニットの目的を無効にします...
これを回避する方法はありますか?
シンプルで実際の例:
functions.cu:
__device__ int foo
(const uchar param0,
const uchar *const param1,
const unsigned short int param2,
const unsigned short int param3,
const uchar param4)
{
return 1; //real code commented out.
}
上記の関数は、ローカル メモリにスピルします。
functions.ptx:
.visible .func (.param .b32 func_retval0) _Z45fooPKhth(
.param .b32 _Z45foohPKhth_param_0,
.param .b64 _Z45foohPKhth_param_1,
.param .b32 _Z45foohPKhth_param_2,
.param .b32 _Z45foohPKhth_param_3
)
{
.local .align 8 .b8 __local_depot72[24];
.reg .b64 %SP;
.reg .b64 %SPL;
.reg .s16 %rc<3>;
.reg .s16 %rs<4>;
.reg .s32 %r<2>;
.reg .s64 %rd<2>;