【问题标题】:Is inline PTX assembly code powerful?内联 PTX 汇编代码功能强大吗?
【发布时间】:2012-09-09 00:53:28
【问题描述】:

我看到一些代码示例,人们在 C 代码中使用内联 PTX 汇编代码。 CUDA toolkit中的文档提到PTX很强大,为什么会这样呢?如果我们在 C 代码中使用这样的代码,我们会得到什么好处?

【问题讨论】:

  • 这个问题有点像问“一段字符串长吗?”。没有一个确定的答案。 可能在某些情况下,明确控制编译器发出的 PTX 指令是有利或必要的,而在其他情况下则不是。 PTX 仍然只是 GPU 将运行的代码的中间表示。
  • 我期待一些可以展示 PTX 力量的例子,这会让我信服。我接受这是一个普遍的问题,但我需要一些例子来说服自己使用 PTX 可以为您提供一些 CUDA-C 无法提供的额外功能
  • 内联 PTX 使您可以访问未通过 CUDA 内在函数公开的指令,并允许您应用编译器中缺少的或语言规范禁止的优化。有关使用内联 PTX 有利的工作示例,请参阅:stackoverflow.com/questions/6162140/128-bit-integer-on-cuda/…
  • 嘿 njuffa@,将该评论提升为答案 :-)
  • @ArchaeaSoftware:谢谢,完成。我错过了原始海报的说明,即他只是在寻找一个具体的例子,而我通过内联 PTX 指向 128 位算术的指针应该很适合。

标签: cuda


【解决方案1】:

内联 PTX 可让您访问未通过 CUDA 内在函数公开的指令,并允许您应用编译器中缺少的或语言规范禁止的优化。有关使用内联 PTX 有利的工作示例,请参阅: 128 bit integer on cuda?

使用内联 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 版本使用的指令数大约是三到四倍。

【讨论】:

  • 性能怎么样?这样的代码注入会提高性能吗?
  • 在我指出的示例中,使用内联 PTX 可以最大限度地减少所需的指令数量。如果应用程序受指令吞吐量限制,这有助于应用程序性能。显然,只有在提供显着好处的情况下才希望使用这种低级接口,但这适用于在任何平台上使用内联汇编。适用于过早优化的标准警告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-17
  • 2012-05-08
  • 2012-06-16
  • 2015-03-17
  • 2016-07-17
相关资源
最近更新 更多