問題タブ [ptx]
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.
assembly - CUDA/GPU での SASS 解析結果の見方
CUDA Binary Utilities の 1 つである cuobjdump を使用して SASS コードを生成しました。サンプルの結果は次のとおりです。これらのコードは、グローバル メモリからロードしようとします。
各命令の意味を説明する SASS コードの完全なマニュアルはどこで入手できますか。「cuda binary utility」では、命令の意味の一般的な説明のみを提供します。たとえば、「R1.cc」、「IMAD.HI.X」、および LD.e の意味を説明していません。
2番目の指示の意味. 最初の命令は各スレッドがロードするメモリアドレスを計算することであり、3番目の命令はグローバルメモリをレジスタにロードすることだと思います。2番目の指示の意味がわかりません。
cuda は、グリッド サイズ、ブロック サイズ、配列のベース アドレスなどのパラメータ情報を定数メモリに保存していると思います。この場合、c[0x0][0x20] は配列のベースアドレスです。私の質問は、どうすればそれらの情報を取得できるかです。
cuda - CUDA PTX f32.f32 テクスチャ読み取り
浮動小数点インデックスを直接使用して CUDA テクスチャから読み取ることは可能ですか?たとえば、tex.1d.v4.f32.f32
.
これにより、ファイルを見ると 2 つの命令が節約されているように見え.ptx
、これはベンチマーク時のパフォーマンスの向上に反映されています。ただし、かなり重大な欠点は、これが問題なく実行されているように見えても、望ましい結果が得られないことです。
以下のコードは、この問題を示しています。
いくつかのカード (K40、C2070) といくつかの CUDA バージョン (6.0、7.0) でこれを試しましたが、すべて同じ出力が得られます。
これは可能ですか、それとも間違ったツリーを吠えていますか?
assembly - Cudaの同じレジスタへの「冗長な」移動操作
CUDA SASS コードを表示していて、同じレジスターへの大量の移動操作に気付きました。元:
これらの移動操作の目的は何ですか? それはタイミングのためであり、彼らは「ノー」のように振る舞いますか、それともそれほど明白ではありませんか?
注: これらは PTX コードには含まれず、SASS のみに含まれます。I と assume は、PTX 操作中ではなく、操作の合間に使用されます。ただし、文脈上、PTX は次のとおりです。
実際のc++
コードは、上記の ptx のインライン アセンブリです。
更新:
を使用してコンパイルされ、Cuda Toolkit 7.5 を使用sm_52
しcompute_52
てx64
Visual Studio 2013 でコンパイルされました。デバイス: GTX 970 (Maxwell GPU)。
Debug
からに切り替えると、Release
この非効率性が解消されます。
cuda - Cuda符号付き128ビット乗算エラー
符号付き整数を使用して cuda PTX で 128 ビットの符号付き乗算を行うときに問題を発見したと思います。ここに私のサンプルコードがあります:
これにより、結果が生成されresult_lo = 0x0, result_hi = 0x0
ます。ただし、これは結果を生成します。これは、間違いがなく、明らかにゼロでない場合result_lo = 0x0, result_hi = 0xFFFFFFFFFFFFFFFF
の実際の値です。2^127 - (2^126 - 1)
まず、私の理解が正しいことを確認したいのですが、これを回避する方法はありますか?
更新Debug
mod からモードに変更するRelease
と、この問題が修正されますが、これは cuda のバグなのかどうかまだ疑問に思っていますか?
Update 2 このバグを NVIDIA に報告しました
x64 Debug
Visual Studio 2013でCuda ツールキット 7.5 を使用しましsm_52
たcompute_52
。
cuda - CUDA: -arch と -code および SM と COMPUTE の使用方法
nvcc でビルドするときに、コード生成用のアーキテクチャを適切に指定する方法がまだわかりません。マシン コードと PTX コードがバイナリに埋め込まれており、これはコントローラー スイッチ-code
と-arch
(または を使用して両方の組み合わせ-gencode
) を介して制御できることを認識しています。
これによれば、2 つのコンパイラ フラグsm_XX
とは別に、アーキテクチャを指定する 2 つの方法もありcompute_XX
ます。フラグは仮想アーキテクチャ ( など) の識別子のみを取得しますが、フラグは実際のアーキテクチャと仮想アーキテクチャの両方の識別子を取得します。compute_XX
sm_XX
-arch
compute_XX
-code
ドキュメントには-arch
、入力ファイルがコンパイルされる仮想アーキテクチャを指定することが記載されています。ただし、この PTX コードはマシン コードに自動的にコンパイルされるのではなく、むしろ「前処理ステップ」です。
では-code
、PTX コードがアセンブルおよび最適化されるアーキテクチャを指定することになっています。
ただし、どの PTX またはバイナリ コードがバイナリに埋め込まれているかは明確ではありません。たとえば を指定した場合-arch=compute_30 -code=sm_52
、コードは最初に機能レベル 3.0 PTX にコンパイルされ、その後、機能レベル 5.2 のマシン コードが作成されるということですか? そして、何が埋め込まれますか?
何が起こるかを指定した場合はどうなります-code=sm_52
か?V5.2 PTX コードから作成された V5.2 用のマシン コードのみが組み込まれますか? との違いは-code=compute_52
何ですか?
cuda - CUDA - PTX キャリー伝搬
CUDA PTX に 2 つの 32 ビット符号なし整数を追加したいのですが、キャリーの伝播も処理したいと考えています。以下のコードを使用してそれを実行していますが、結果は期待どおりではありません。
ドキュメントによると、add.cc.u32 d, a, b
は整数加算を実行し、キャリーアウト値を条件コード レジスタに書き込みますCC.CF
。
一方、キャリーインでaddc.cc.u32 d, a, b
整数加算を行い、キャリーアウトした値をコンディションコードレジスタに書き込みます。この命令のセマンティクスは. 私も違いなしで試しました。
d = a + b + CC.CF
addc.u32 d, a, b
私の知る限り、結果が変数に収まらない場合はキャリーが発生します。これはここで発生し、符号ビットが破損している場合はオーバーフローしますが、符号なしの値で作業しています。
上記のコードは に追加しようとして0xFFFFFFFF
います0x2
が、もちろん結果は 32 ビットに適合しません。なぜ__uaddc(0,0)
呼び出し後に 1 を取得しないのですか?
編集
Nvidia Geforce GT 520mx
Windows 7 Ultimate、64 ビット
Visual Studio 2012
CUDA 7.0
cuda - PTX コードのパフォーマンス
私は CUDA (悪くはない) を知っていますが、 PTXを知らないので、私の質問は次のとおりです。
- ptx コードを学習すると、gpu (CUDA) コードのパフォーマンスが向上しますか?
- はいの場合、パフォーマンスを向上させるために CUDA コードと組み合わせることができる ptx コードを作成する方法はありますか?