4

C コードでインライン PTX アセンブリ コードを使用するコード サンプルをいくつか見ました。CUDA ツールキットのドキュメントに、PTX は強力であると記載されていますが、その理由は何ですか? このようなコードを C コードで使用すると、どのような利点が得られるでしょうか?

4

1 に答える 1

10

インライン PTX を使用すると、CUDA 組み込み関数を介して公開されていない命令にアクセスでき、コンパイラに欠けている最適化や言語仕様で禁止されている最適化を適用できます。インライン PTX の使用が有利な実例については、次を参照してください: cuda の 128 ビット整数?

インライン PTX を使用した 128 ビットの加算では、キャリー フラグに直接アクセスできるため、必要な命令は 4 つだけです。HLL として、C/C++ にはキャリー フラグの表現がありません。特定のハードウェア プラットフォームには、キャリー フラグがない (MIPS など)、単一のキャリー フラグ (x86、sm_2x など)、または複数のキャリー フラグさえある場合があるためです。128 ビットの加算と減算の 4 命令 PTX バージョンとは対照的に、これらの演算は次のように C でコーディングできます。

#define SUBCcc(a,b,cy,t0,t1,t2) \
  (t0=(b)+cy, t1=(a), cy=t0<cy, t2=t1<t0, cy=cy+t2, t1-t0)
#define SUBcc(a,b,cy,t0,t1) \
  (t0=(b), t1=(a), cy=t1<t0, t1-t0)
#define SUBC(a,b,cy,t0,t1) \
  (t0=(b)+cy, t1=(a), t1-t0)
#define ADDCcc(a,b,cy,t0,t1) \
  (t0=(b)+cy, t1=(a), cy=t0<cy, t0=t0+t1, t1=t0<t1, cy=cy+t1, t0=t0)
#define ADDcc(a,b,cy,t0,t1) \
  (t0=(b), t1=(a), t0=t0+t1, cy=t0<t1, t0=t0)
#define ADDC(a,b,cy,t0,t1) \
  (t0=(b)+cy, t1=(a), t0+t1)

unsigned int cy, t0, t1, t2;

res.x = ADDcc  (augend.x, addend.x, cy, t0, t1);
res.y = ADDCcc (augend.y, addend.y, cy, t0, t1);
res.z = ADDCcc (augend.z, addend.z, cy, t0, t1);
res.w = ADDC   (augend.w, addend.w, cy, t0, t1);

res.x = SUBcc  (minuend.x, subtrahend.x, cy, t0, t1);
res.y = SUBCcc (minuend.y, subtrahend.y, cy, t0, t1, t2);
res.z = SUBCcc (minuend.z, subtrahend.z, cy, t0, t1, t2);
res.w = SUBC   (minuend.w, subtrahend.w, cy, t0, t1);

上記の加算と減算は、対応するインライン PTX バージョンで使用される命令の数の約 3 ~ 4 倍にコンパイルされる可能性があります。

于 2012-09-17T05:26:15.357 に答える