Size: a a a

Rust — русскоговорящее сообществo

2020 December 06

AZ

Alexander Zaitsev in Rust — русскоговорящее сообществo
Kirill (Cykooz) Kuzminykh
Ну тогда буду считать что llvm ещё просто не дорос. Например gcc в коде на C делает 4 умножения, там где llvm - 5:
#include <math.h>
float calc(float x)
{
   float a = fabs(x);
   return 9.0 * (a * a * a) - 15.0 * (a * a);
}
Но в Rust хотя бы радует, что он вызов powi() смог скомпилять в операции умножения, а gcc вызов powf() компиляет как вызов подпрограммы. (хотя powf конечно же не аналог powi - что-то с ходу не нашёл на C аналог)
в любом случае ни от gcc, ни от clang(llvm. rustc соотв. тоже) ждать не стоит никаких сильных оптимизаций математики что с fast-math для плавающей точки, что для целочисленных. Хотите именно оптимизировать - берёте и упрощаете сами. Потом смотрите asm и если чот не нравится - думаете, как уговорить компилятор на что-то лучшее или лупите inline asm
источник
2020 December 07

MS

Max Syskov in Rust — русскоговорящее сообществo
Интересно, а можно тут
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=6ff12e3b3ab1e1ddcf141a816f5c50c4
как-нибудь вывернуться, и указать тип для fn process<T> что бы компилятор все понял?
источник

r

red75prime in Rust — русскоговорящее сообществo
Max Syskov
Интересно, а можно тут
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=6ff12e3b3ab1e1ddcf141a816f5c50c4
как-нибудь вывернуться, и указать тип для fn process<T> что бы компилятор все понял?
Да, если следовать подсказкам компилятора. https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=0d422c1463d6ede53f04b54c6c4820fa
источник

MS

Max Syskov in Rust — русскоговорящее сообществo
red75prime
Да, если следовать подсказкам компилятора. https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=0d422c1463d6ede53f04b54c6c4820fa
Спасибо большое!
источник

KK

Kirill (Cykooz) Kuzm... in Rust — русскоговорящее сообществo
А как в расте принято работать с переполнением памяти? Например, судя по коду, Vec будет кидать панику если не удалось выделить память. Как понимаю кроме нестабильных методов Vec::try_reserve и Vec::try_reserve_exact остаётся только вариант с отловом и обработкой паники?
источник

霧龍 in Rust — русскоговорящее сообществo
Добрый день
Кто-то пытался как-то кешировать таргет, чтобы разные ветки на CI не так долго собирались?
Нашёл такую штуку, как --target-dir, но очевидные проблемы при запуске нескольких билдов параллельно…
источник

AL

Andrey @ozkriff Lesn... in Rust — русскоговорящее сообществo
霧龍
Добрый день
Кто-то пытался как-то кешировать таргет, чтобы разные ветки на CI не так долго собирались?
Нашёл такую штуку, как --target-dir, но очевидные проблемы при запуске нескольких билдов параллельно…
В гитхабовмком ci довольно стандартно в ключ сразу включать ось и конфигурацию

key: ${{ runner.os }}-${{ matrix.build }}-cargo-${{ hashFiles('**/Cargo.lock') }}
источник

霧龍 in Rust — русскоговорящее сообществo
Andrey @ozkriff Lesnikóv
В гитхабовмком ci довольно стандартно в ключ сразу включать ось и конфигурацию

key: ${{ runner.os }}-${{ matrix.build }}-cargo-${{ hashFiles('**/Cargo.lock') }}
Надо было мне уточнить, что в Jenkins
источник

S

Staaaaaa in Rust — русскоговорящее сообществo
Emmanuel Goldstein
Возможно, LLVM по какой-то причине предпочитает делать лишний mulsd, чем лишний movsd? Хотя интуитивно mov должен быть дешевле.
источник

ΑZ

Αλεχ Zhukovsky in Rust — русскоговорящее сообществo
Kirill (Cykooz) Kuzminykh
Я почему-то считал, что современные компиляторы умеют хорошо оптимизировать математические выражения. Например в таком выражении:
9.0 * x.powi(3) - 15.0 * x.powi(2)
достаточно выполнить 4 умножения:
x2 = x * x; 
x3 = x2 * x;
9.0 * x3 - 15.0 * x2
Но я удивился когда увидел, что в Rust это выполняется в 5 умножений - он куб и квадрат от x считает независимо.
Это компилятор пока не дорос, или тут есть какие-то подводные камни из-за которых выбирается такое не оптимальное решение?
Потому что в флоатах результат может отличаться, кроме случаев когда переменая одна
источник

ΑZ

Αλεχ Zhukovsky in Rust — русскоговорящее сообществo
А для одной думаю просто не завезли оптимизации
источник

ΑZ

Αλεχ Zhukovsky in Rust — русскоговорящее сообществo
Emmanuel Goldstein
Может, что-то с IEEE 754? Я не уверен, что должно получиться, если x2 это Infinity или NaN, например.
Или просто недостаточно умный компилятор, да.
Недостаточно
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Kirill (Cykooz) Kuzminykh
А как в расте принято работать с переполнением памяти? Например, судя по коду, Vec будет кидать панику если не удалось выделить память. Как понимаю кроме нестабильных методов Vec::try_reserve и Vec::try_reserve_exact остаётся только вариант с отловом и обработкой паники?
Там не паника, а вызов alloc_error_hook. Отловить его в стейбле не получится
источник

ΑZ

Αλεχ Zhukovsky in Rust — русскоговорящее сообществo
Kirill (Cykooz) Kuzminykh
А как в расте принято работать с переполнением памяти? Например, судя по коду, Vec будет кидать панику если не удалось выделить память. Как понимаю кроме нестабильных методов Vec::try_reserve и Vec::try_reserve_exact остаётся только вариант с отловом и обработкой паники?
Есть оом хендлер, и собственно все. С переполнение ничего особо не сделать нигде в общем случае
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Ну и вроде все равно после хука abort() вызывается
источник

S

Staaaaaa in Rust — русскоговорящее сообществo
Но таки да,  https://godbolt.org/z/esMvKh
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Обработка OOM с помощью паники это довольно вероятностная штука. Если не повезет и чей-нибудь деструктор захочет сделать какую-то аллокацию, то все равно придется делать abort.
источник

KK

Kirill (Cykooz) Kuzm... in Rust — русскоговорящее сообществo
Αλεχ Zhukovsky
Есть оом хендлер, и собственно все. С переполнение ничего особо не сделать нигде в общем случае
Я просто переписываю на Rust код C-шной библиотеки, и там malloc просто возвращает пустой указатель если не удалось выделить память. На это стоит проверка и функция возвращает соответствующий результат. Т.е. на C библиотека не роняет полностью всё приложение из-за того что ей не хватило памяти.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Растовый аналог функции malloc (std::alloc::alloc) тоже не роняет ничего при OOM. А вот стандартные коллекции аккуратной обработкой OOM пока не особо занимаются
источник

ΑZ

Αλεχ Zhukovsky in Rust — русскоговорящее сообществo
Screenshot (7 дек. 2020 г. 11:05:41)
источник