Войти
ПрограммированиеФорумОбщее

Избавится от корня (2 стр)

Страницы: 1 2
#15
14:32, 1 янв. 2021

Zab
> Для чего вычисляешь? Насколько важна точность?
Трение. Так что точность не важна.


#16
1:18, 2 янв. 2021

MikeNew
> Вот что накопал,
Этот код менее точный, и медленнее, чем rsqrtss.

void calc(float x1,float y1,float a,float *x2,float *y2)
{
    float c,d=x1*x1+y1*y1;
    _mm_store_ss(&c,_mm_rsqrt_ss(_mm_load_ss(&d)));
    c*=a;
    x2=c*x1;
    y2=c*y1;
}

> Математическое решение:
Походу, у тебя опечатка. Либо \(b^2 = x_2^2/y_2^2\), либо \(y_2=\pm a / \sqrt{1+b}\)

Ну и да, не так уж корень и тормозит, можно зачастую юзать как есть. Если хочется скорости - так логично SIMD.

#17
16:53, 2 янв. 2021

Не пойму как так получается, но с -Ofast умножение, деление и квадратный корень одинаковы по скорости: https://quick-bench.com/q/aZ1_l8dPtAawnMy0xAgYxtBXeBE
С -O3 корень медленнее, а если ещё уменьшить оптимизацию, то и деление будет медленнее умножения.

#18
19:44, 2 янв. 2021

gammaker
> Не пойму как так получается
У тебя везде константы, поэтому компилятор все нафиг выкидывает.

#19
21:22, 2 янв. 2021

}:+()___ [Smile]
> У тебя везде константы, поэтому компилятор все нафиг выкидывает.
Там глобальные переменные, их компилятор не может выкинуть и вынужден читать каждую итерацию. Можно в асме посмотреть, что там реально деления, умножения и корень в цикле. Благодаря -Ofast компилятор смог заменить одно из двух делений на умножение: "/b/b" на "/(b*b)".

#20
21:31, 2 янв. 2021

gammaker
> Там глобальные переменные, их компилятор не может выкинуть и вынужден читать каждую итерацию.
С чего бы это?

> Можно в асме посмотреть, что там реально деления, умножения и корень в цикле.

7.76%  addps  %xmm3,%xmm1
68.59% addps  %xmm4,%xmm0
23.65% cmp    %rdx,%rax
Во всех 3х функциях.

#21
23:00, 2 янв. 2021

FordPerfect
> С чего бы это?
Да, напутал. Я не понял, что это вынесено за цикл. Меток в асме не видно и я больше к интелловскому формату привык, а на проценты слева не обратил внимания.

Получил теперь вроде правдоподобные результаты: https://quick-bench.com/q/7PKyQ3OGMg3I2SzAwlgBcXeUr44

#22
23:29, 2 янв. 2021

gammaker
Там rcpps, rsqrtps, судя по дизасму.

#23
23:39, 2 янв. 2021

gammaker
> Там rcpps, rsqrtps, судя по дизасму.
Вроде, с итерацией Ньютоном для уточнения. Если сделать -O3 будут честные divss/sqrtss и скорость сравняется.
Кстати, тест все равно плохой, умный компилятор может избирательно векторизовать и время опять будет левое.

Страницы: 1 2
ПрограммированиеФорумОбщее