首页 > 解决方案 > 在ptx nvidia cuda(程序集)中将x提高到y的幂

问题描述

我想在 ptx 中将 x 提高到 y 的幂。

Nvidia有一个计算2^x的函数ex2和计算log2x的lg2,但没有计算x^y的函数。

是否有更聪明、更简单的解决方案可以在循环中乘以值?.cu 文件中的代码如何转换为 .ptx pow(x, y)

也许有使用ex2lg2计算x^y的聪明解决方案?

解决方案

正如@talonmies 提到的:

如果z = x^y,log2(z) = y * log2(x) 那么x^y = 2^(y*log2(x))

标签: cudanvidiaptx

解决方案


这是 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.


推荐阅读