2

CUDA Binary Utilities の 1 つである cuobjdump を使用して SASS コードを生成しました。サンプルの結果は次のとおりです。これらのコードは、グローバル メモリからロードしようとします。

/*0028*/ IMAD R6.CC, R3, R5, c[0x0][0x20]; 
/*0030*/ IMAD.HI.X R7, R3, R5, c[0x0][0x24]; 
/*0040*/ LD.E R2, [R6]; //load
  1. 各命令の意味を説明する SASS コードの完全なマニュアルはどこで入手できますか。「cuda binary utility」では、命令の意味の一般的な説明のみを提供します。たとえば、「R1.cc」、「IMAD.HI.X」、および LD.e の意味を説明していません。

  2. 2番目の指示の意味. 最初の命令は各スレッドがロードするメモリアドレスを計算することであり、3番目の命令はグローバルメモリをレジスタにロードすることだと思います。2番目の指示の意味がわかりません。

  3. cuda は、グリッド サイズ、ブロック サイズ、配列のベース アドレスなどのパラメータ情報を定数メモリに保存していると思います。この場合、c[0x0][0x20] は配列のベースアドレスです。私の質問は、どうすればそれらの情報を取得できるかです。

4

1 に答える 1

7
  1. 各命令の意味を説明する SASS コードの完全なマニュアルはどこで入手できますか。

私が知る限り、そのようなことはありませんが、アーキテクチャによって異なるため、SASS はほとんど文書化されていません (基本的なリファレンスしかありません)。ただし、PTX は完全に文書化されており、多くの SASS 命令には PTX に相当するものがあるため、そこから意味を推測できます。何が起こっているのかをよりよく理解するために、ソース情報を含む SASS をダンプすることもできます。

しかし、これら 2 つのドキュメントがあれば、多かれ少なかれ SASS を PTX に変換して、指示の意味を推測することができます。

/*0028*/ IMAD R6.CC, R3, R5, c[0x0][0x20];

拡張精度整数積和: R3 を R5 で乗算し、バンク 0 の定数と合計し、オフセット 0x20 を実行し、キャリーアウトを使用して R6 に格納します。

/*0030*/ IMAD.HI.X R7, R3, R5, c[0x0][0x24];

抽出による整数積和: R3 と R5 を乗算し、上半分を抽出し、その上半分をバンク 0 の定数 (オフセット 0x24) と合計し、キャリーインで R7 に格納します。

/*0040*/ LD.E R2, [R6]; //load

Load : レジスタ ペア R7:R6 が指すものを R2 にロードします。

@njuffaが以下のコメントで説明しているように

計算全体で R3 と R5 を乗算し、64 ビット積を c[0][24]:c[0][20] の 64 ビット定数に加算し、結果の 64 ビット アドレスを使用して R2 を取得します。

  1. cuda は、グリッド サイズ、ブロック サイズ、配列のベース アドレスなどのパラメータ情報を定数メモリに保存していると思います。[...] 私の質問は、どうすればそれらの情報を入手できるかということです。

ビルトイン ( threadIdxblockIdxblockDimgridDimなど) が存在する場所は指定されておらず、アーキテクチャ間で異なる場合があります。実際には、それらのいくつかは専用レジスターにあり、他のいくつかは共有メモリーにあります。しかし、それは実装の詳細です。

: @njuffa のコメントを統合するために編集されました。

于 2016-01-28T07:58:45.770 に答える