在 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

也许有使用 ex2lg2 计算 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 的情况进行比较。