我正在研究一个粒子代码,其中大量使用flush to-zero来提取性能。但是,有一个浮点比较语句,我不希望被刷新。一种解决方案是使用内联PTX,但它引入了不必要的指令,因为在PTX中没有布尔类型,只是谓词寄存器: C ++代码:
float a, b;
if ( a < b ) do_something;
// compiles into SASS:
// FSETP.LT.FTZ.AND P0, PT, A, B, PT;
// @P0 DO_SOMETHING
PTX:
float a, b;
uint p;
asm("{.reg .pred p; setp.lt.f32 p, %1, %2; selp %0, 1, 0, p;}" : "=r"(p) : "f"(a), "f"(b) );
if (p) do_something;
// compiled into SASS:
// FSETP.LT.AND P0, PT, A, B, PT;
// SEL R2, RZ, 0x1, !P0;
// ISETP.NE.AND P0, PT, R2, RZ, PT;
// @P0 DO_SOMETHING
有没有办法可以在没有编码整个PTX / SASS的情况下用单个指令进行非FTZ比较?