#prog #rust #article
Офигенно!
Rust's standard library on the GPU
Офигенно!
Rust's standard library on the GPU
GPU code can now use Rust's standard library. We share the implementation approach and what this unlocks for GPU programming.
This works because of our customhostcallframework. A hostcall is analogous to a syscall. A hostcall is a structured request from GPU code to the host CPU to perform something it cannot execute itself. You can think of it like a remote procedure call from the GPU to the host to achieve syscall-like functionality.
To end users, Rust's std APIs appear unchanged and act as one would expect.
❤12👍8
#prog #c #article
You (probably) don’t need to learn C
You (probably) don’t need to learn C
I’m all for learning C if it will be useful for the job at hand, but you can write lots of great software without knowing C. [выделение моё]
A few people repeated the idea that C teaches you how code “really” executes. But C is an abstract model of a computer, and modern CPUs do all kinds of things that C doesn’t show you or explain. Pipelining, cache misses, branch prediction, speculative execution, multiple cores, even virtual memory are all completely invisible to C programs.
C is an abstraction of how a computer works, and chip makers work hard to implement that abstraction, but they do it on top of much more complicated machinery.
Nedbatchelder
You (probably) don’t need to learn C
I’m tired of this: “You have to learn C so you can understand how a computer really works.”
❤5👍3💩3😁2
#math #article
Hobby’s algorithm for aesthetic Bézier splines
Разновидность сплайнов для "гладкой" интерполяции точек, которая быстро работает (пропорционально числу точек) и зачастую даёт эстетически приятные результаты. Из недостатков: передвижение опорных точек меняет форму всей кривой, и малое передвижение опорной точки может привести к радикальной смене формы кривой в районе этой точки.
В самом начале есть интерактивная демонстрация.
Hobby’s algorithm for aesthetic Bézier splines
Разновидность сплайнов для "гладкой" интерполяции точек, которая быстро работает (пропорционально числу точек) и зачастую даёт эстетически приятные результаты. Из недостатков: передвижение опорных точек меняет форму всей кривой, и малое передвижение опорной точки может привести к радикальной смене формы кривой в районе этой точки.
В самом начале есть интерактивная демонстрация.
🤔2
#prog #article
A Tale Of Four Fuzzers
Восхитительная статья от matklad-а, в частности, хорошая демонстрация того, как писать фаззеры.
A Tale Of Four Fuzzers
Восхитительная статья от matklad-а, в частности, хорошая демонстрация того, как писать фаззеры.
Some time ago we overhauled TigerBeetle’s routing algorithm to better handle varying network topologies in a cluster. That turned out to be an interesting case study of practical generative testing (or fuzzing) for non-trivial, real-world code. We ended up adding not one, not even two, but four very different new fuzzers to the system! Let’s talk about why just one fuzzer is not enough.
👍6
#prog #article
BTW PVS-Studio развивают версию своего анализатора для #go, и хотя для широкой публики анализатор ещё не доступен (в апреле будет бета-версия), он уже находит множество ошибок, которые не находит
BTW PVS-Studio развивают версию своего анализатора для #go, и хотя для широкой публики анализатор ещё не доступен (в апреле будет бета-версия), он уже находит множество ошибок, которые не находит
go vet. Все найденные ошибки при этом на Go не завязаны, так что, возможно, в будущем анализатор станет ещё полезнее конкретно для Go.👍9
#prog #rust #article
В стандартной библиотеке Rust есть несколько ассоциативных контейнеров:
Возьмём в качестве примера HashMap::get:
Как видно из кода, тип для поиска (
В процессе поиска значения на хранимых ключах вызывается метод
Но у этого API есть недостаток. Именно, оно требует, чтобы предоставляемое значение было ссылкой и чтобы из ссылки на ключ можно было получить ссылку на
В короткой статье Borrowed tuple indexing for HashMap рассказывается, как с некоторым количеством бойлерплейта можно обойти это ограничение.
Для сравнения, hashbrown (поверх которого сделаны мапы в std) от подобных ограничений не страдает, поскольку там в API используется более гибкий трейт Equivalent:
В стандартной библиотеке Rust есть несколько ассоциативных контейнеров:
HashMap, HashSet, BTreeMap и BTreeSet. Часто на практике в качестве ключей в них хранятся строки — String. Требовать от пользователя для поиска значение типа String неудобно и чревато проблемами в производительности. Потому у этих структур данных есть API, позволяющие использовать для поиска ключи других, "похожие" на те, что хранятся в контейнере.Возьмём в качестве примера HashMap::get:
fn get<Q>(&self, k: &Q) -> Option<&V>
where
K: Borrow<Q>,
Q: Hash + Eq + ?Sized,
Как видно из кода, тип для поиска (
Q) не обязан совпадать с типом хранимых ключей (K), но на K есть ограничение K: Borrow<Q>. Трейт Borrow выглядит таким образом:trait Borrow<Borrowed>
where
Borrowed: ?Sized,
{
fn borrow(&self) -> &Borrowed;
}
В процессе поиска значения на хранимых ключах вызывается метод
<K as Borrow<Q>>::borrow, и результат возвращаемого значения сравнивается со значением, переданным в get. Именно благодаря этому API (и реализациям в std, разумеется) коллекцию HashMap<String, Thing> можно индексировать значениями типа &str.Но у этого API есть недостаток. Именно, оно требует, чтобы предоставляемое значение было ссылкой и чтобы из ссылки на ключ можно было получить ссылку на
Q. Это ограничивает применимость API. Если, например, в мапе в качестве ключей хранятся (String, String), то логичный невладеющий эквивалент для индексации (&str, &str) не будет работать, потому что это кортеж ссылок, а не ссылка.В короткой статье Borrowed tuple indexing for HashMap рассказывается, как с некоторым количеством бойлерплейта можно обойти это ограничение.
Для сравнения, hashbrown (поверх которого сделаны мапы в std) от подобных ограничений не страдает, поскольку там в API используется более гибкий трейт Equivalent:
trait Equivalent<K>
where
K: ?Sized,
{
fn equivalent(&self, key: &K) -> bool;
}
👍10🤯3🤡1
Блог*
#prog #rust #article Офигенно! Rust's standard library on the GPU GPU code can now use Rust's standard library. We share the implementation approach and what this unlocks for GPU programming. This works because of our custom hostcall framework. A hostcall…
Vectorware
Async/await on the GPU
GPU code can now use Rust's async/await. We share the reasons why and what this unlocks for GPU programming.
🔥8😱3❤1😭1
#prog #rust #article
Making cargo-semver-checks faster - Google Summer of Code 2025
Making cargo-semver-checks faster - Google Summer of Code 2025
Overall, I reduced the typical runtime on very large crates down to ~2s from ~8s - nearly an 80% speedup - without compromising performance on smaller crates. Along the way I reduced test time from ~7min to ~1min.
❤6
#article
2025 Recap: so many projects
нравоучительная сказка от Амоса про опасности безконтрольного yak shaving
2025 Recap: so many projects
fasterthanli.me
2025 Recap: so many projects
I’ve been working on so many projects in 2025, I thought it was important for me to make a recap, if only just to clear my head.
There are many, many, many things to go through and we don’t have a ...
There are many, many, many things to go through and we don’t have a ...
❤2🤔2
#prog #article
Compendium: A Linux Syscall Tracer
Compendium: A Linux Syscall Tracer
Having a love-hate relationship with strace I ended up yearning for something new.
Enter Compendium: a friendlier strace-like tool, with sane defaults, that optionally produces a clean html report that you can view in your browser of choice.
It tracks file descriptors across their lifetime, distinguishes files from sockets, aggregates I/O stats, registers events for memory operations (both vm and actual page faults), threads/subprocesses and more in real time and produces a summary at the end.
👍13