#prog #article
Provably Space-Efficient Parallel Functional Programming
<...> Using functional languages also helps the programmer with an important safety concern — data races — by allowing greater control over effects.
<...>
Implicitly-parallel functional programming can therefore be a game changer for parallelism, but there is the elephant in the room: poor performance. The primary reason for poor performance is memory.
<...>
We have been working on this problem by utilizing a memory property of parallel functional programs called disentanglement. <...> Using disentanglement, we partition memory into heaps and distribute heaps among threads with a heap scheduler. Each thread manages its assigned heap independently, in parallel, and without communicating with other threads.<...> We implemented these techniques in the MPL compiler for parallel ML and were able to obtain impressive speedups: up to 50x on 70 cores with respect to our sequential baseline
Provably Space-Efficient Parallel Functional Programming
<...> Using functional languages also helps the programmer with an important safety concern — data races — by allowing greater control over effects.
<...>
Implicitly-parallel functional programming can therefore be a game changer for parallelism, but there is the elephant in the room: poor performance. The primary reason for poor performance is memory.
<...>
We have been working on this problem by utilizing a memory property of parallel functional programs called disentanglement. <...> Using disentanglement, we partition memory into heaps and distribute heaps among threads with a heap scheduler. Each thread manages its assigned heap independently, in parallel, and without communicating with other threads.<...> We implemented these techniques in the MPL compiler for parallel ML and were able to obtain impressive speedups: up to 50x on 70 cores with respect to our sequential baseline
https://ura.news/news/1052582394
Ученикам одной из курганских школ велели закупить дневники с изображением государственной символики. Дневники с изображениями котят и супергероев даже для начальных классов запрещены, сообщили URA.RU родители школьников.
«На родительском собрании в школе нам заявили, что дневники должны быть только с российской символикой, с флагом или гербом. Дневники с котиками и суперменами нельзя. Первый класс, еще ладно, если уже купили, но начиная со второго класса для всех строго — только символика РФ», — рассказала мама младшеклассника.
Россия для грустных.
---
Правда, в этой истории смущает отсутствие деталей ("одной из курганских школ"). Возможно, это просто выдумка.
Ученикам одной из курганских школ велели закупить дневники с изображением государственной символики. Дневники с изображениями котят и супергероев даже для начальных классов запрещены, сообщили URA.RU родители школьников.
«На родительском собрании в школе нам заявили, что дневники должны быть только с российской символикой, с флагом или гербом. Дневники с котиками и суперменами нельзя. Первый класс, еще ладно, если уже купили, но начиная со второго класса для всех строго — только символика РФ», — рассказала мама младшеклассника.
Россия для грустных.
---
Правда, в этой истории смущает отсутствие деталей ("одной из курганских школ"). Возможно, это просто выдумка.
ura.news
Курганским ученикам запретили покупать дневники с котятами
Читайте на URA.RU
💩5👍1
Forwarded from Сельский блог 🍁
я, когда не прогаю: блин, хочу, но таааак лень, пойду на ютубчик чтоли
я, когда прогаю: блин в смысле уже 2 часа прошло
я, когда прогаю: блин в смысле уже 2 часа прошло
❤15👍4🤡2
Блог*
#prog #js #typescript #abnormalprogramming github.com/jamiebuilds/json-parser-in-typescript-very-bad-idea-please-dont-use
GitHub
GitHub - dmjio/type-level-json: RFC8259 compliant JSON parser, at the type level.
RFC8259 compliant JSON parser, at the type level. Contribute to dmjio/type-level-json development by creating an account on GitHub.
Блог*
#prog #cpp C++ iceberg fouronnes.github.io/cppiceberg
Интересно, выходит, приличную долю из этого я и так знаю
#article
Не трогайте разработчиков. Отстаньте. Просто не беспокойте
Или про процесс разработки, который хорошо работает на практике, но сложно повторить. Комментарии тоже ценны.
Не трогайте разработчиков. Отстаньте. Просто не беспокойте
Или про процесс разработки, который хорошо работает на практике, но сложно повторить. Комментарии тоже ценны.
Хабр
Не трогайте разработчиков. Отстаньте. Просто не беспокойте
Всем привет! Меня зовут Ян, я руководитель разработки Департамента ИТ инвестиционного бизнеса Газпромбанка. Совершенно неожиданно я занял первое место на конференции Highload++ с докладом про то, как...
#prog #rust #rustasync #rustlib #article
Как известно, в настоящий момент трейты в Rust не могут иметь асинхронные методы. Причины для этого описаны в статьеНикитоса Niko Matsakis why async fn in traits are hard, и если коротко, они связаны с кучей нерешённых вопросов и недопиленных фич — это примерно так же, как в Rust до версии 1.26.0 нельзя было нормально вернуть из функции замыкание.
Для обхода этой проблемы есть несколько путей, которые так или иначе сводятся к стиранию типов. Первый — как и в случае с замыканиями, просто забоксить футуру. Это именно то, что делает async-trait. Второй путь — разместить футуру в некоем байтовом массиве, который хранится инлайн, а не в куче. Именно это делают stackfuture и name-it. Вторая библиотека вычисляет размер футуры и хранит его в байтовом массиве в точности нужного размера, а также (не) реализует все те же авто-трейты, что и исходная футура. Первой нужно наперёд указывать размер хранилища под футуру, но зато она не полагается на макросы для работы.
(thanks @goldsteinq, которому, кстати, и принадлежит авторство второй библиотеки)
Как известно, в настоящий момент трейты в Rust не могут иметь асинхронные методы. Причины для этого описаны в статье
Для обхода этой проблемы есть несколько путей, которые так или иначе сводятся к стиранию типов. Первый — как и в случае с замыканиями, просто забоксить футуру. Это именно то, что делает async-trait. Второй путь — разместить футуру в некоем байтовом массиве, который хранится инлайн, а не в куче. Именно это делают stackfuture и name-it. Вторая библиотека вычисляет размер футуры и хранит его в байтовом массиве в точности нужного размера, а также (не) реализует все те же авто-трейты, что и исходная футура. Первой нужно наперёд указывать размер хранилища под футуру, но зато она не полагается на макросы для работы.
(thanks @goldsteinq, которому, кстати, и принадлежит авторство второй библиотеки)
🔥7👍1
#prog #cpp
Если вам по каким-то причинам нужно сделать порядковый индекс итерации в range-based for loop и при этом нету возможности или желания использовать ranges, то можно накостылить такое:
Ещё может возникнуть вопрос, почему не что-то попроще в духе:
Если вам по каким-то причинам нужно сделать порядковый индекс итерации в range-based for loop и при этом нету возможности или желания использовать ranges, то можно накостылить такое:
size_t i = 0;
for (auto & elem : collection) {
struct IncrementOnDrop {
size_t old;
size_t& assign_to;
IncrementOnDrop(size_t& i): old(i), assign_to(i) {}
~IncrementOnDrop() {
assign_to = old + 1;
}
} inc{i}
// каким бы сложным не был поток управления
// в теле цикла, i будет инкрементировано всегда
// в конце итерации, когда будет вызван
// деструктор inc
...
}
Разумеется, не обязательно объявлять IncrementOnDrop
по месту, но если это требуется лишь единожды — почему нет?Ещё может возникнуть вопрос, почему не что-то попроще в духе:
struct IncrementOnDrop {
size_t& i;
~IncrementOnDrop() {
++i;
}
} inc{i};
Это тоже работает, но в этом случае, если i
меняется в теле цикла, число итераций будет подсчитано неверно. Вариант выше защищает от этого.👏5🔥1