2012-09-05 4 views
7

我々はこのような何かを参照してくださいxptxasを使用することにより、レジスタの使用状況を確認した場合:CUDA一定のメモリバンクは、

ptxas info : Used 63 registers, 244 bytes cmem[0], 51220 bytes cmem[2], 24 bytes cmem[14], 20 bytes cmem[16] 

現在、明確に[X] CMEMを説明する任意のドキュメントがある場合、私は疑問に思います。定数メモリを複数のバンクに分けるポイント、合計でいくつのバンクがあるのか​​、そして0,2,14,16以外の他のバンクは何に使用されていますか?

サイドノート、@njuffa(あなたに特別な感謝は)以前に銀行0,2,14,16が何であるかをNVIDIAのフォーラムに説明したように:

使用される定数メモリは(一定のプログラムの変数の中で仕切られていますバンク1)、およびコンパイラ生成定数(バンク14)を含む。

CMEM [0]:カーネル引数

CMEM [2]:ユーザ定義の定数オブジェクト

CMEM [16]:リテラルに対応することができるコンパイラ生成定数(そのうちのいくつかソースコード内の定数)

+5

大歓迎です。 NVIDIAのフォーラムで私のポストで言及したのは、銀行の割り当てと同じように、GPUアーキテクチャ間で一定の銀行の数が異なるということです。言い換えれば、プログラマがプログラミングモデルの一部ではないので、プログラマが心配するべきではない実装の詳細です。複数のバンクを使用する1つの理由は、常時メモリの使用の矛盾する可能性を最小限に抑えることです。特に、プログラマーが見える定数バンクの多くをユーザーコードに使用できるようにしてください。 – njuffa

+0

@njuffa私はこれをあなたのフォーラムの投稿の引用符と一緒に答えに変換するべきだと思います。 :) – harrism

+0

@njuffa私はフォローアップの質問があります。プログラミングガイドによると、実際の関数の引数や関数の引数のようなものが実行される前に、実行コンフィギュレーションの引数が評価されています。共有メモリを介して現在デバイスに渡されています._私の理解はコンパイル時です。引数はcmem [0 ]で実行されますが、実行時には、新しいブロックが開始する直前にcmemからsmemにコピーされます。あれは正しいですか? –

答えて

4

CUDAによるGPU定数バンクの使用は、私の知る限り正式には文書化されていません。定数バンクの数と使用方法は、GPUの世代によって異なります。これはプログラマが心配する必要のない低レベルの実装の詳細です。

定数バンクの使用法は、必要に応じて、特定のプラットフォーム用に生成されたマシンコード(SASS)を参照することによって、逆に設計することができます。実際、これは元の質問で引用された情報を思いついたものです(この情報はNVIDIAの開発者向けフォーラムの投稿です)。私がそこに述べた情報は、フェルミクラスのデバイスに特別に適用されたアドホックリバースエンジニアリングに基づいていましたが、現時点ではフォーラムにアクセスできないため、現時点では確認できません。

複数の定数バンクを持つ理由の1つは、CUDAプログラマを使用するための可視の定数メモリをユーザに予約し、追加の定数バンクにハードウェアまたはツールによって提供される追加の読み出し専用情報を格納することです。

CUDA数学ライブラリはソースファイルとして提供され、関数はユーザコードにインライン展開されるため、CUDA数学ライブラリ関数の一定のメモリ使用量は、ユーザが見ることができる定数メモリの統計情報に含まれています。

0

Miscellaneous NVCC Usage」を参照してください。 彼らは、一定の銀行配分はプロファイルに特有であると述べています。

PTX guideには、64KBの定数メモリとは別に、10個の固定メモリバンクがあります。ドライバは、これらの領域内の定数バッファを割り当て、初期化し、バッファへのポインタをカーネル関数パラメータとして渡すことができる。

nvccに与えられたプロファイルは、どのような定数がどのメモリに格納されるかを考慮していると思います。とにかく、それぞれの定数メモリcmem [n]が64KB未満であると心配する必要はありません。各バンクのサイズは64KBで、グリッド内のすべてのスレッドに共通です。

関連する問題