内联PTX比C / C ++代码更有效吗?

时间:2013-09-02 08:53:14

标签: optimization cuda ptx

我注意到PTX代码允许一些具有复杂语义的指令,例如位字段提取(bfe),找到最重要的非符号位(bfind)和人口计数( popc)。

显式使用它们是否更有效,而不是用C / C ++中的预期语义编写代码?

例如:“人口数”或popc表示计算一位。我应该写一下:

__device__ int popc(int a) {
  int d = 0;
  while (a != 0) {
    if (a & 0x1)  d++;
    a = a >> 1;
  }   
  return d;
}

用于该功能,或者我应该使用:

__device__ int popc(int a) {
    int d;
    asm("popc.u32 %1 %2;":"=r"(d): "r"(a));
    return d;
}

?内联PTX会更有效吗?我们应该编写内联PTX以获得最佳性能吗?

另外 - GPU是否有一些与PTX指令对应的额外魔术指令?

2 个答案:

答案 0 :(得分:2)

编译器可以识别您正在做什么并使用花哨的指令来执行此操作,或者可能不会。在一般情况下,唯一知道的方法是使用添加到nvcc-ptx标志来查看ptx汇编中的编译输出。如果编译器为您生成它,则无需自己手动编写内联汇编(或使用instrinsic)。

此外,它是否在一般情况下产生性能差异取决于代码路径是否以显着的方式使用,以及其他因素,例如内核的当前性能限制器(例如,计算限制)或记忆中的。)

答案 1 :(得分:0)

除了@ RobertCrovella的答案之外还有几点:

  • 即使您确实使用PTX - 这种情况很少发生。将其限制为不超过几条PTX线的小功能 - 您可以根据需要将其重复用于多种用途,大部分编码都使用C / C ++。
  • 这个原则的一个例子是中提到的内在函数@njuffa(这不是我认为的文件的正式副本)。请仔细阅读以了解哪些内在函数可供您使用。当然,这并不意味着你应该全部使用它们。
  • 对于您的具体示例 - 您 希望PTX超过第一个版本;它肯定不会造成任何伤害。但是,同样,它也是需要实际编写PTX的示例,因为popc具有相应的__popc内在函数(再次,正如@njuffa所指出的那样) )。
  • 您可能还想查看一些基于CUDA的库的源代码,以了解他们选择使用哪种类型的PTX片段。