在ptx nvidia cuda(组件)中将x提高到y的幂

时间:2019-01-13 12:33:27

标签: cuda nvidia ptx

我想在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))

1 个答案:

答案 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的情况进行比较。