問題タブ [ptxas]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
cuda - CUDA: sm_20 に対して誤った lmem 統計が表示される?
オプションでコンパイルされた CUDA カーネルは、 GPU アーキテクチャが指定されている場合、--ptxas-options=-v
誤った lmem (ローカル メモリ)統計を表示しているようです。sm_20
同じことで、アーキテクチャに関する意味のある lmem 統計が得られsm_10 / sm_11 / sm_12 / sm_13
ます。
sm_20 lmem 統計を別の方法で読み取る必要があるかどうか、またはそれらが明らかに間違っているかどうかを明確にすることはできますか?
カーネルは次のとおりです。
--ptxas-options=-v
およびsm_20
報告:
--ptxas-options=-v
およびsm_10 / sm_11 / sm_12 / sm_13
報告:
sm_20 は4 バイトの lmem を報告しますが、カーネルで 4x1000 バイト配列が使用されている場合、これは単に不可能です。古い GPU アーキテクチャは、正しい4000 バイトのlmem 統計を報告します。
これはCUDA 3.2で試しました。NVCC マニュアル(v3.2) の「コード生成統計の印刷」セクションを参照しましたが、この異常の説明には役立ちません。
cuda - Fermi GPU (GTX 580) でプロファイルされた実行命令と発行された命令の奇妙な結果
私のカーネルには、次のような ptx バージョンがあります。
私が数えたところ、私のカーネルには 13 個の命令しかありません (ret 命令は含まれていません)。ワークアイテムの数を 5120 に設定すると、ワークグループのサイズは 64 になります。16 個の SM があり、それぞれに 32 個のスカラー プロセッサがあるため、上記のコードは SM で 10 回実行されます。予想どおり、実行された命令の数は 10*13 = 130 になるはずです。しかし、プロファイリングした後の結果は、発行された命令 = 130、実行された命令 = 100 です。1. 発行された命令の数と実行された命令の数が異なるのはなぜですか? 枝がないから対等じゃないの?2. 実行された命令の数が予想よりも少ないのはなぜですか? 少なくとも ptx バージョンのすべての命令を実行する必要がありますか? 3. キャッシュ ミス (L1 および L2) は、発行された命令の数と実行された命令の数に影響を与えますか? ありがとう
cuda - インライン PTX での不要な mov 操作の回避
PTX を別のファイルに書き込む場合、次の方法でカーネル パラメーターをレジスターに読み込むことができます。
ただし、インライン PTX を使用する場合、Using Inline PTX Assembly in CUDA (バージョン 01) アプリケーション ノートでは、パラメーターの読み込みが別の操作に密接にリンクしている構文について説明しています。次の例を示します。
生成するもの:
多くの場合、2 つの操作を分離する必要があります。たとえば、パラメーターをループ外のレジスターに格納し、ループ内でレジスターを再利用して変更したい場合があります。これを行うために私が見つけた唯一の方法は、追加の mov 命令を使用して、パラメーターを暗黙的にロードされたレジスターから、後で使用できる別のレジスターに移動することです。
別のファイルの PTX からインライン PTX に移動するときに、この追加の mov 命令を回避する方法はありますか?
cuda - インライン PTX での 32 ビット アドレス サイズの設定
別ファイルで書かれたPTXをインラインPTXに変換中です。別の PTX ファイルでは、次のように ISA とターゲットを定義していました。
コンパイラによって生成された PTX ファイルでは、PTX をインライン化した後、コンパイラは次のように ISA とターゲットを指定しています。
これ.address_size 64
は、インライン PTX で行うポインター演算を 32 ビットから 64 ビットに更新する必要があることを意味するため、私にとっては問題です。
32 ビットが 4GB をアドレス指定できることを考えると、私のカードが持っているメモリよりも多くのメモリがありますが、ポインタ演算を更新する必要がないように、コンパイラに 32 ビットのアドレス サイズを指定させることは可能ですか?
新しい統一アドレッシング システムでは、32 ビット アドレスは sm_20 でサポートされていますか?
cuda - Parallel Nsight でのインライン PTX のデバッグ
Parallel Nsight でインライン PTX をステップ実行するときに PTX レジスタを表示することはできますか?
インライン PTX にブレークポイントを設定してステップ スルーできますが、PTX レジスタにカーソルを合わせても値が表示されません。SASS をオンにすると、これらのレジスターにカーソルを合わせるとその値が表示されますが、PTX レジスターと SASS レジスターの間の関係を追跡するのは困難です。
c++ - OpenCL:命令とアドレス間の状態空間の不一致
私はOpenCLプログラムを書いていますが、ビルド時に次のエラーが発生します。
対応するptx行(自動生成)は次のとおりです。
これが私が書いた関数です:
エラーの理由は何ですか?どうすれば解決できますか?
cuda - NVIDIA GPU で ptx コードをコンパイルしますか?
NVIDIA GPU で opencl プログラムを PTX レベルでインターセプトしたい。
ルーチンはおそらくこのようになると思います。
まず、NVIDIA コンパイラを使用して、opencl プログラム (ホスト コードとデバイス コードの両方) を作成し、それぞれの ptx コードを生成します。次に、PTX コードを変更して、やりたいことを書きます (デバイスの C コードでこれを行わなかった理由を聞かないでください。いくつかの理由があります)。しかし問題は、変更後、この PTX コードをバイナリ コードにコンパイルするにはどうすればよいかということです。
if-statement - if での余分なレジスタの使用法
私は大規模な cuda カーネルで作業していましたが、カーネルがスレッドごとに 43 個のレジスタを使用していることに気付きました。何が起こっているのかを理解するために、レジスタの使用法を把握する小さなプログラムを作成しました。if
を使用するたびに、レジスタの使用率が上がることに気付きました。小さなコードは次のとおりです。
このコードをコンパイルすると、各スレッドは 5 つのレジスタを使用します
しかし、コメントを外すif
と、各スレッドは 8 つのレジスタを使用します。誰が私に何が起こっているのか説明してもらえますか?
memory - ptxas の詳細出力の解釈、パート I
手書きのカーネルの各 CUDA スレッドのリソース使用量を理解しようとしています。
kernel.cu
ファイルをファイルkernel.o
にコンパイルしましたnvcc -arch=sm_20 -ptxas-options=-v
そして、次の出力を得ました(パススルーc++filt
):
上記の出力を見ると、次のように言うのは正しいですか?
- 各 CUDA スレッドは 46 個のレジスタを使用していますか?
- ローカルメモリに流出するレジスタはありませんか?
出力の理解にも問題があります。
私のカーネルはたくさんの
__device__
関数を呼び出しています。__global__
関数と__device__
関数のスタック フレームのメモリの合計は 72 バイトですか?0 byte spill stores
とはどう違いますか0 bytes spill loads
の情報
cmem
(これは定数メモリであると想定しています) が異なる数値で 2 回繰り返されるのはなぜですか? カーネル内では、定数メモリを使用していません。それは、コンパイラが内部で GPU に一定のメモリを使用するように指示するということですか?
この質問は次のセクションに「続きます」: ptxas の詳細出力の解釈、パート II
c - __internal_trig_reduction_slowpathd の関数プロパティ
現在、いくつかの cuda カーネルを最適化しようとしています...
オプション --ptxas-options=-v でコンパイルすると、レジスタ %co に関する情報が得られます。
私の場合、私は常にいくつかの余分な行を取得しますが、これは私には意味がありません:
1 行目から 4 行目までは明らかですが、最後の行は何ですか?
Googleはここでは役に立ちません....私はすでに試しました。
これらの行の意味を誰か知っていますか? プログラムでコンパイルされたカーネルごとにそれらを取得します