我想在ptx中将x提高到y的幂。
Nvidia具有 ex2 函数,该函数可以计算2 ^ x,而 lg2 函数可以计算log2x,但是没有用于计算x ^ y的函数。
是否存在更聪明,更简单的解决方案,使值相乘?拥有pow(x, y)
的.cu文件中的代码如何转换为.ptx?
使用 ex2 和 lg2 来计算 x ^ y 也许是一个聪明的解决方案?
解决方案:
如@talonmies所述:
如果z = x^y
,则log2(z) = y * log2(x)
所以x^y = 2^(y*log2(x))
答案 0 :(得分:1)
这是nvcc的操作方式。
__global__
void exp(float x, float y, float* z) {
*z = powf(x,y);
}
nvcc --ptx --use_fast_math exp.cu
exp.ptx
.visible .entry _Z3expffPf(
.param .f32 _Z3expffPf_param_0,
.param .f32 _Z3expffPf_param_1,
.param .u64 _Z3expffPf_param_2
)
{
.reg .f32 %f<6>;
.reg .b64 %rd<3>;
ld.param.f32 %f1, [_Z3expffPf_param_0];
ld.param.f32 %f2, [_Z3expffPf_param_1];
ld.param.u64 %rd1, [_Z3expffPf_param_2];
cvta.to.global.u64 %rd2, %rd1;
lg2.approx.ftz.f32 %f3, %f1;
mul.ftz.f32 %f4, %f3, %f2;
ex2.approx.ftz.f32 %f5, %f4;
st.global.f32 [%rd2], %f5;
ret;
}
有必要将此ptx与没有--use_fast_math
的情况进行比较。