Optimization 内联PTX是否比C/C+更高效+;密码?

Optimization 内联PTX是否比C/C+更高效+;密码?,optimization,cuda,ptx,Optimization,Cuda,Ptx,我注意到PTX代码允许一些具有复杂语义的指令,例如位字段提取()、查找最重要的非符号位()和填充计数() 显式使用它们比用C/C++编写具有预期语义的代码更有效吗 例如:“总体计数”或popc,表示对一位进行计数。所以我应该写: __device__ int popc(int a) { int d = 0; while (a != 0) { if (a & 0x1) d++; a = a >> 1; } return d; } 对于该

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

显式使用它们比用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指令相对应的额外魔法指令?

编译器可能会识别您正在做什么,并使用一条奇特的指令来完成,也可能不会。在一般情况下,了解的唯一方法是使用添加到的
-ptx
标志查看ptx汇编中的编译输出。如果编译器为您生成内联程序集,则无需自己手工编写内联程序集(或使用instrinsic)


此外,在一般情况下,它是否会产生性能差异取决于代码路径是否被有效使用,以及其他因素,如内核的当前性能限制(例如,计算限制或内存限制)。

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

  • 即使你确实使用了PTX,这种情况也应该很少发生。将其限制为不超过几行PTX的小函数,然后您可以根据自己的需要将其重新用于多种用途,大多数代码都是C/C++
  • 这一原则的一个例子是在中提到的intrinsics@njuffa(我认为这不是该文件的正式副本)。请通读一遍,看看你可以使用哪些本质。当然,这并不意味着你应该全部使用它们
  • 对于您的具体示例,您确实希望PTX超过第一个版本;这当然不会有什么坏处。但是,这也是一个不需要实际编写PTX的例子,因为
    popc
    具有相应的
    \uuupopc
    内在特性(同样,正如@njuffa所指出的)
  • 您可能还希望查看一些基于CUDA的库的源代码,以了解他们选择使用哪种PTX代码段

可能与“内核中的原始代码”重复?@Jackolanten这些问题之间可能会有一些不同。我想知道编译器是否足够聪明,我想做的只是计算位数。。我更新了问题。请注意,CUDA提供了设备功能
\uuuuPOPC()
\uuuPOPCLL()
,因此在这种情况下不需要手动编码的内联PTX。这些本质是在sm_20及更高版本平台上硬件加速的。通常,在下潜到PTX级别之前,首先查找设备功能(例如
\uuu ffs
\uuu clz()
,以查找最低/最高有效1位)。某些PTX操作不通过内部函数公开,例如整数乘加进位,它是多精度整数乘的构造块。分析编译器发出的PTX和SASS的反汇编是了解编译器中有什么惯用语分析以及它是否真的对性能有任何影响的唯一方法。