我注意到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指令对应的额外魔术指令?
答案 0 :(得分:2)
编译器可以识别您正在做什么并使用花哨的指令来执行此操作,或者可能不会。在一般情况下,唯一知道的方法是使用添加到nvcc的-ptx
标志来查看ptx汇编中的编译输出。如果编译器为您生成它,则无需自己手动编写内联汇编(或使用instrinsic)。
此外,它是否在一般情况下产生性能差异取决于代码路径是否以显着的方式使用,以及其他因素,例如内核的当前性能限制器(例如,计算限制)或记忆中的。)
答案 1 :(得分:0)
除了@ RobertCrovella的答案之外还有几点:
popc
具有相应的__popc
内在函数(再次,正如@njuffa所指出的那样) )。