内联PTX汇编代码功能强大吗?

use*_*567 3 cuda

我看到了一些代码示例,人们在C代码中使用内联PTX汇编代码.CUDA工具包中的Doc提到PTX很强大,为什么会这样?如果我们在C代码中使用这些代码,我们会获得什么好处?

nju*_*ffa 9

内联PTX使您可以访问未通过CUDA intrinsincs公开的指令,并允许您应用编译器中缺少或语言规范禁止的优化.对于使用内联PTX是有利的工作示例,请参阅: cuda上的128位整数?

使用内联PTX的128位加法仅需要四条指令,因为它可以直接访问进位标志.作为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);
Run Code Online (Sandbox Code Playgroud)

上面的加法和减法可能编译为相应的内联PTX版本使用的指令数的大约三到四倍.

  • 在我指出的示例中,使用内联 PTX 可以最大限度地减少所需的指令数量。如果应用程序的指令吞吐量有限,这有助于应用程序性能。显然,人们只希望在提供显着好处的情况下才使用这种低级接口,但这适用于在任何平台上使用内联汇编。有关过早优化的标准警告适用。 (2认同)