非常に長くまとまりのない関数を避けるために、カーネルから多くのデバイス関数を呼び出しています。カーネル呼び出し (スレッド ブロックごと) の開始時に共有バッファーを割り当て、カーネルでいくつかの処理ステップを実行しているすべてのデバイス関数にポインターを渡します。
私は次のことについて疑問に思っていました:
グローバル関数で共有メモリ バッファを割り当てた場合、ポインタを渡す他のデバイス関数は、ポインタが参照できる可能性のあるアドレス タイプ (グローバル デバイスまたは共有メモリ) をどのように区別できますか。
「CUDA プログラミング ガイド」に従って、共有修飾子で仮パラメータを装飾することは無効であることに注意してください。imhoit を実装できる唯一の方法は
a)割り当てられたメモリにマーカーを配置する b)呼び出しで非表示のパラメーターを渡す。c) グローバルメモリと共有メモリ用に別々のセグメントを持つ仮想統合アドレス空間を持ち、ポインタのしきい値チェックを使用できますか?
だから私の質問は次のとおりです:私はそれについて心配する必要がありますか、それともすべての関数をメインカーネルにインライン化せずに別の方法で進める必要がありますか?
================================================== =========================================
一方、私は今日、CUDA Toolkit 3.0 を使用した NVCC が、いわゆる「グローバル関数からの外部呼び出し」を許可せず、インライン化する必要があることに恐怖を感じました。これは、事実上、すべてのデバイス関数をインラインで宣言する必要があり、ヘッダーとソース ファイルの分離が壊れていることを意味します。これはもちろん非常に醜いですが、代替手段はありますか?