問題タブ [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.
cuda - ファンネルシフトとは?
CUDA 5.0 プログラミング ガイドを読んでいるときに、3.5 コンピューティング対応デバイスには存在するが 3.0 には存在しない「ファンネル シフト」と呼ばれる機能に出くわしました。「リファレンスマニュアルを参照してください」という注釈が含まれていますが、マニュアルで「ファンネルシフト」という用語を検索しても何も見つかりません。
グーグルで検索してみましたが、 http://www.cudahandbook.comの第8章でしか言及が見つかりませんでした:
8.2.3 ファンネルシフト (SM 3.5)
GK110 では、次の組み込み関数でアクセスできる 64 ビットの「漏斗シフト」命令が追加されました。
__funnelshift_lc(): 左ファンネル シフトの上位 32 ビットを返します。
__funnelshift_rc(): 右漏斗シフトの最下位 32 ビットを返します。
これらの組み込み関数は、sm_35_intrinsics.h で (インライン PTX アセンブラーを使用して) インライン デバイス関数として実装されます。
...しかし、「左漏斗シフト」または「右漏斗シフト」が何であるかはまだ説明されていません。
それで、それは何ですか、そしてどこでそれが必要ですか?
c++ - Nvidia PTX から bool (C++11) の配列にアクセスするポータブルな方法
CPUメモリ(C++ 11コードを使用)で作成され、または同様の方法でGPUにコピーされたブール配列bool[]
( ではないことに注意)でGPU計算を行う必要があります。std::vector<bool>
cuMemCpy
最初の質問:
sizeof(bool)
1 バイトを報告します。これは C++11 標準で保証されていますか?
2 番目の質問:
true
( )はfalse
常に ( ) として表され1
ます0
か (unsigned char
表現で)、またはコンパイラーはここで自由を持っていますか? (必要に応じて、256 未満のゼロ以外の整数を使用できます)
3 番目の質問 (PTX 固有):
PTX 論理演算or
では、xor
、 などは 8 ビットより大きい型でのみ動作します。つまり、unsigned int
withに対して論理演算を実行できますor.u32 <out>,<in1>,<in2>
。ただし、C++11型は 8 ビットのように見えるため、これは、CPU から GPU メモリに直接コピーさbool
れた の配列を操作できないことを意味するので、最初の配列をいくつかの型 PTX 論理演算に変換する必要がありますか? 、 、などで動作しますか?bools
bools
u32
u16
assembly - PTX「ビットバケット」レジスタ
... PTX マニュアルに記載されています。それらが何に適しているか、またはどのように使用するかについてのヒントはありません。
誰かもっと知っていますか?共通の概念が欠けているだけですか?
cuda - 共有メモリ内の PTX 可変長バッファ
スレッド ブロック内のリダクションに共有メモリを使用するグローバル リダクション カーネルを PTX に実装しようとしています (そこにあるすべての CUDA C の例のように)。CUDA C では、共有メモリに可変長配列を定義する可能性があります。
PTX で同等のものを取得するにはどうすればよいですか?
適切と思われないのは、次のような固定長配列です
カーネルをさまざまな入力配列の長さで再利用できるようにしたいので。
私ができることは、1つの変数を定義することです
配列のベースアドレスとして使用します。共有メモリの先頭に割り当てられることを期待して。次に、次のような配列要素にアクセスできます
sdata
また、は として定義されているため、これは少しおかしく見えますfloat
。しかし、実際には float のアドレスです。この意味で、上記の行は確かに正しいです。ただし、オフセットがカーネルの起動時に指定された共有メモリ サイズを超えない限り、これが正しいことが保証されているかどうかはわかりません。
PTX のマニュアルでは、共有メモリ内の可変長バッファーについて説明していません。
PTX に可変長バッファを実装する方法を知っている人はいますか?
arrays - オペランドとしてのPTX配列が機能しない
PTXマニュアル(バージョン2.3)(http://developer.download.nvidia.com/compute/DevZone/docs/html/C/doc/ptx_isa_2.3.pdf)6.4.2の状態:
配列要素には、明示的に計算されたバイトアドレスを使用するか、角括弧表記を使用して配列にインデックスを付けることでアクセスできます。角括弧内の式は、定数整数、レジスタ変数、または単純な「定数オフセット付きレジスタ」式のいずれかです。オフセットは、レジスタ変数に加算または減算される定数式です。より複雑なインデックスが必要な場合は、使用前にアドレス計算として記述する必要があります。
これを試してみると、バージョンポインタとバイトオフセットのみが機能します[a+0]
。
このコードはロードに失敗します:
これは正常にロードされますが:
バイトオフセットバージョンの問題は、それが実際にはバイトオフセットであるということです。したがって、型の基本的なサイズを考慮に入れる必要があります。つまり、2番目の要素は[a+4]
です。あなたa[1]
のためにこれを解決することになっているのに対して。
何が問題になっているのか?
編集
そして、ここにはさらに深刻な問題があります。上記のテキストは、レジスタ変数を使用して配列にインデックスを付けることができると述べています。
ここで、u0
はおそらく.reg.u32
または他の互換性のある整数です。
ただし、ポインタとバイトオフセットの方法では、これは不可能です。次のようなことをすることは違法です。
現在、これは厳しい制限です。ただし、loadステートメントの前に別のアドレス計算を行うことができます。しかし、これは物事を複雑にします。
c - 対数基数2のみが使用可能な場合の自然対数の実装
PTXで自然対数を実装しようとしています。PTXはlg2.approx.f32
、2を底とする対数を実装するもののみをネイティブに提供します。したがって、単純な数学を適用すると、2を底とする対数と、オイラー数eの2を底とする対数を乗算するだけで自然対数を得ることができます。
log_e(a) = log_2(a) / lg_2(e)
最初の近似1/lg_2(e)
は0.693147
です。だから、私はこの数を掛けるだけです。
関数(CUDA Cから)をPTXにnvcc
コンパイルしましたlog
(以下の出力を見つけてください)。最後に数値定数を掛けているのがわかります。しかし、もっとたくさんのことが起こっています。これは重要ですか?なぜこれほど多くのオーバーヘッドがあるのか誰かが説明できますか?
* 編集 *
完全にするためだけに。上記のPTXにコンパイルしたCUDACカーネルは次のとおりです。
c - acosf実装のCUDA__float_as_int
CUDA Cの数学関数の実装(cuda/math_function.h
)にacosf
は、次のパッセージが含まれています。
ここで、およびa
はt1
、以前は数学定数Piに近い数値に設定されていました。条件付き(if-clause)が何をテストしているのか、それと同等のCまたは関数/マクロは何であるのかを理解しようとしています。私はの実装を探しましたが、成功しませんでした。NVIDIANVCCに組み込まれているマクロまたは関数のようです。NVCCが上記のパッセージから生成するPTXを見てください。floats
CUDART_PI_F
float
__float_as_int(a)
__float_as_int()
__float_as_int()
丸めで__float_as_int()
はないfloat
ことが明らかになります。int
(これにより。が生成されcvt.s32.f32
ます。)代わりにfloat %f1
、ビットコピー(b32
)として%r1
(注意:%r1
はu32
(unsigned int)!!)に割り当てられ、 (signed int、紛らわしい!!)で%r1
あるかのように比較されます。 (誰の値は)。s32
%r2
0
私にはこれは少し奇妙に見えます。しかし、明らかにそれは正しいです。
誰かが何が起こっているのかを説明できますか、特に__float_as_int()
否定的であるためのif-clauseテストのコンテキストで何が起こっているのかを説明できますか(<0
)?..そしてif節および/または__float_as_int()
marcoと同等のCを提供しますか?
cuda - CUDA PTX コード %envreg<32> 特殊レジスタ
CUDA ドライバー API を使用して、.cl カーネルによって生成された PTX アセンブリ コードを実行しようとしました。私が行った手順は次のとおりです(標準のopencl手順):
1) .cl カーネルをロードする
2) JITコンパイルする
3) コンパイルされた ptx コードを取得して保存します。
ここまでは順調ですね。
ptx アセンブリ内にいくつかの特殊なレジスタ、%envreg3、%envreg6 などがあることに気付きました。ドライバー API。そのため、コードは無限ループに陥り、正しく実行できません。しかし、値を手動で設定した場合 (正確には %envreg6 を ptx 内のブロックサイズに置き換えます)、コードが実行され、正しい結果が得られます (CPU の結果と比較して正しい)。
これらのレジスタに値を設定する方法を知っている人はいますか? つまり、これらのレジスタに値を設定する cuLaunchKernel のフラグですか?
java - OpenCl での PTX からターゲットへの翻訳
OpenCL では、「PTX (Java のバイトコードなど) からターゲット コンバーターへ」はインタープリター (Java のバイトコードのようなもの) または事前アセンブラーですか?
cuda - 8 ビット変数の L1 キャッシュを無効にするために、8 ビット変数の CUDA インライン PTX 制約文字が欠落している (bool)
前書き
この質問では、1 つの変数に対して L1 キャッシュを無効にする方法を学習できます。受け入れられた答えは次のとおりです。
上記のように、インライン PTX を使用できます。以下に例を示します。
.f64 を .f32 (float) または .s32 (int) などに交換することで、これを簡単に変更できます。 (addr) の前の最後の制約 - "l" - は 64 ビット アドレッシングを示します。32 ビット アドレッシングを使用している場合は、"r" にする必要があります。
ただし、浮動小数点ではなくブール値 (1 バイト) をロードしたいと考えています。だから、私はこのようなことができると思いました(アーキテクチャ> = sm_20の場合):
、 どこ "???" は、ブール値、8 ビットの符号なし整数それぞれに適切な制約文字である必要があります ( >= sm_20の場合、ブール値には「u8」が使用されることに注意してください)。ただし、nvidias のドキュメント「Using inline PTX Assembly in CUDA」に適切な制約文字が見つかりません (6 ページにいくつかの制約文字がリストされています)。だから私の質問は:
質問
タイプのいずれかに CUDA インライン PTX 制約文字はありますか。
- ブール値
- 符号なし 8 ビット整数
- またはevtl 8ビットバイナリ変数
そうでない場合、私の場合はどうすればよいですか (イントロダクションで説明されています)。-ここで簡単に説明したパラメータ「b0」、「b1」などは役に立ちますか?
ヘルプやコメントをお寄せいただきありがとうございます。
アップデート
また、グローバル メモリの代わりに L2 キャッシュから読み取るストア関数も必要です。つまり、上記の ld_gbl_cg 関数を補完するストア関数です(この関数を取得して初めて、njuffa の回答が機能することを完全に確認できます)。以下のnjuffaの答えに基づく私の最善の推測は次のとおりです。
ただし、コンパイラは「パラメーター "addr" が設定されていましたが、使用されていません」という警告を出し、プログラムは実行時に「不特定の起動エラー」で失敗します。また、.u8 の代わりに .u16 を試してみました。正確に何を参照しているのかわからないからです。それでも結果は同じです。
(追加情報) PTX 3.1 ドキュメントの次の段落は、この質問にとって重要なようです。
5.2.2 サブワード サイズの使用制限 .u8、.s8、および .b8 命令タイプは、ld、st、および cvt 命令に制限されています。.f16 浮動小数点型は、.f32 および .f64 型との間の変換でのみ許可されます。すべての浮動小数点命令は、.f32 および .f64 タイプでのみ動作します。便宜上、ld、st、および cvt 命令では、ソースおよびデスティネーション データ オペランドを命令タイプのサイズよりも広くすることができるため、通常幅のレジスタを使用して狭い値をロード、格納、および変換できます。たとえば、8 ビットまたは 16 ビットの値は、ロード、格納、または他の型やサイズへの変換時に、32 ビットまたは 64 ビットのレジスタに直接保持される場合があります。