Поднимите x на степень y в ptx nvidia cuda (сборка) - PullRequest
0 голосов
/ 13 января 2019

Я хочу поднять x до степени y в ptx.

У Nvidia есть функция ex2 , которая вычисляет 2 ^ x и lg2 , которая вычисляет log2x, но нет функции для вычисления x ^ y.

Есть ли более умное и простое решение, чем умножение значения в цикле? Как код из .cu файла конвертируется в .ptx, когда он имеет pow(x, y)?

Может быть, есть умное решение с использованием ex2 и lg2 для вычисления x ^ y ?

Решение

Как упомянуто @talonmies:

если z = x^y, то log2(z) = y * log2(x) итак x^y = 2^(y*log2(x))

1 Ответ

0 голосов
/ 20 января 2019

Вот как это делает 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.

...