在 ptx nvidia cuda(程序集)中将 x 提升为 y 的幂
Raise x to power of y in ptx nvidia cuda (assembly)
我想在 ptx 中计算 x 的 y 次方。
Nvidia 有一个计算 2^x 的函数 ex2 和计算 log2x 的 lg2 但没有计算 x^y 的函数。
有没有比循环乘法更聪明更简单的解决方案? .cu 文件中的代码在具有 pow(x, y)
?
时如何转换为 .ptx
也许有使用 ex2 和 lg2 计算 x^y 的巧妙解决方案?
解决方法:
正如@talonmies 提到的:
如果z = x^y
,则log2(z) = y * log2(x)
所以 x^y = 2^(y*log2(x))
这是 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
的情况进行比较。
我想在 ptx 中计算 x 的 y 次方。
Nvidia 有一个计算 2^x 的函数 ex2 和计算 log2x 的 lg2 但没有计算 x^y 的函数。
有没有比循环乘法更聪明更简单的解决方案? .cu 文件中的代码在具有 pow(x, y)
?
也许有使用 ex2 和 lg2 计算 x^y 的巧妙解决方案?
解决方法:
正如@talonmies 提到的:
如果z = x^y
,则log2(z) = y * log2(x)
所以 x^y = 2^(y*log2(x))
这是 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
的情况进行比较。