commit -m "better"
3.23K subscribers
1.02K photos
149 videos
3 files
2.38K links
just random thoughts
Download Telegram
https://www.phoronix.com/scan.php?page=news_item&px=More-Apple-M1-For-Linux-5.17

Вот тут вот пишут, что в ядро добавили еще больше M1. В mesa я никакой активности про драйвер не вижу, увы. И, если уж начал про mesa и аппаратное ускорение, то я осилил статически слинкованный opengl и аппаратно ускоренные драйвера в одном бинаре.

pg@:~/sources/mix ls -la /home/pg/mix/store/
106d22493865f8686a8eb38db12e4711
-b-shell-sway/bin/sway
-rwxr-xr-x 1 pg pg 206469240 Dec 10 17:10
/home/pg/mix/store/
106d22493865f8686a8eb38db12e4711
-b-shell-sway/bin/sway
pg@:~/sources/mix strip
/home/pg/mix/store/
106d22493865f8686a8eb38db12e4711
-b-shell-sway/bin/sway
pg@:~/sources/mix ls -la
/home/pg/mix/store/
106d22493865f8686a8eb38db12e4711
-b-shell-sway/bin/sway
-rwxr-xr-x 1 pg pg 78393840 Dec 10 18:51
/home/pg/mix/store/
106d22493865f8686a8eb38db12e4711
-b-shell-sway/bin/sway

Я думал, будет раза в 3 больше. Впрочем, я нашел интересный способ не линковать #LLVM в каждый бинарь.

https://docs.mesa3d.org/drivers/zink.html - реализация opengl поверх vulkan. #zink
https://www.opennet.ru/opennews/art.shtml?num=51026 - компилятор шейдеров от Valve, который не требует LLVM. Все #хорошее в графическом стеке Linux делают корпорации!

Совместно это дает ускоренный OpenGL, не зависящий от LLVM.

К сожалению, Vulkan мне пока не удалось завести. Разработчики Khronos Group - какие-то невменозы. Я тут уже однажды писал, что делают разрабы, когда у них заканчиваются задачи. Ответ - начинают их себе выдумывать на ровном месте. Вот это и делает Khronos Group. Мегабайты кода аццкого качества, задача которого - загрузить .so, экспортировать из нее функцию, которая вернет структуру, заполненную коллбеками(короче, интерфейс). Где-то там происходит нечто, из-за чего какой-то коллбек от драйвера становится nullptr, и все падает. Копипаста между разными репозиториями одного проекта, где-то заголовки используются из системы, в виде библиотеки, где-то их нужно положить рядышком, во время сборки. Разные репозитории имеют не совместимые друг с другом версии. Там 4 важных репозитория, если взять их последние релизы, они не совместимы друг с другом. У этих гондонов даже есть файлик с номерами ревизий, с которыми, типа, работает. Не с зарелиженными версиями, с ревизиями! https://github.com/KhronosGroup/Vulkan-ValidationLayers/blob/master/scripts/known_good.json

Стык загрузчика от Khronos Group и кода Mesa - это жесть. Им там не хватает информации в передаваемых контекстах, поэтому там вовсю всякие пертредные хештаблицы со всякими недостающими запчастями.

Зато я впервые трассировал графический драйвер, это интересно.

Нашел странную упячку в Mesa - там есть шейдерный кеш, и там есть часть ключа в этом кеше, которая зависит от dl_iterate_phdr на какую-то определенную функцию в библиотеке(https://github.com/mesa3d/mesa/blob/main/src/util/build_id.c#L118). Мне кажется, они таким странным способом хотели сказать, что кеш нужно инвалидировать при смене версии библиотеки, очень интересным способом(название исходника как бы намекает на это).

Дело осложнилось тем, что на границе кода #Mesa <-> Khronos Group происходит потеря информации в возвращаемой ошибке, поэтому драйвер просто возвращал "не могу проинициализироваться", без указания из-за чего, и где. Кстати, как эта проблема решается в языках без динамических исключений, типа Rust, когда коллбек имеет более богатую ошибку, чем вызывающий код может прокинуть наверх?

Отдельно, конечно, хочу сказать, что все эти графические API делают люди, которые вообще ничего не понимают в дизайне систем. Компилятор шейдеров в виде библиотеки, которая линкуется в каждую программу? Ну такое. О том, что можно и нужно для этого запустить демон - не, не слышали.
commit -m "better"
https://www.phoronix.com/scan.php?page=news_item&px=More-Apple-M1-For-Linux-5.17 Вот тут вот пишут, что в ядро добавили еще больше M1. В mesa я никакой активности про драйвер не вижу, увы. И, если уж начал про mesa и аппаратное ускорение, то я осилил статически…
https://suricrasia.online/no-knowledge.html

Какая-то очень крутая тема(НЕ zero knowledge proof, это тоже красивое, но другое) - решение задачи "как бы передать кому-то строку, которая выглядит как hash, но не является хешом от каких-то известных тебе данных". Зачем это надо я ХЗ, но прикольно.

———

Продолжение темы про #Mesa и Vulkan. Я таки заставил его работать, это мне стоило 6 часов напряженной отладки. Бага причудливая. Товарищи сделали такой хак - пометили 100 экспортируемых функций как weak, но реализовали только те, что нужны. Драйвер вулкана в такой ситуации получал непустые реализации + nullptr для пустых. В случае статической линковки weak сработал не так, и в качестве реализаций взялись первые нулевые weak символы.

Vulkan, в целом, работоспособен, Sway с ним - нет. Если включить WLR_RENDERER=vulkan, то получаю черный экран, и это неудивительно, поддержка Vulkan в Sway появилась месяц назад. Если делаю MESA_LOADER_DRIVER_OVERRIDE=zink(фактически, форсирую реализацию OpenGL, которая работает поверх Vulkan), то получаю слегонца битую картинку. Неудивительно, думаю, Sway в таком интересном setup запускал только я.

Надо сказать, своей цели "собрать LLVM-free hardware accelerated stack" я достиг, бинарник Sway стал занимать 20 мегабайт.

Немного в сторону - прикольно осознавать, что подобную инсталляцию(musl + static build + clang + #zink + vulkan + sway) на этой планете, скорее всего, соорудил только 1 человек, хотя это тот еще неуловимый Джо.

Узнал прекрасное - в Linux есть 3 драйвера для AMD(Mesa, #AMDVLK, AMDVLK + proprietary code). https://www.linux.org.ru/forum/talks/16466478 Попробовал завести AMDVLK, но он требует X.

Valve топит за Mesa, потому что LLVM генерит медленные шейдеры.
👍1
commit -m "better"
https://suricrasia.online/no-knowledge.html Какая-то очень крутая тема(НЕ zero knowledge proof, это тоже красивое, но другое) - решение задачи "как бы передать кому-то строку, которая выглядит как hash, но не является хешом от каких-то известных тебе данных".…
Good news, everyone!

Я прочел https://www.phoronix.com/scan.php?page=article&item=zink-sub-alloc&num=2, установил себе #Mesa посвежее, и у меня заработала связка Sway + #zink + Vulkan!

Вообще, имею вам сказать, что аппаратные драйвера OpenGL, скорее всего, просто умрут, потому что зачем? По словам разработчиков Mesa Vulkan - это такой Gallium 2.0(не могу найти цитату), поэтому логично реализацию OpenGL строить поверх них. Ну и в MacOS будет рулить MoltenVK(https://moltengl.com/moltenvk/, + OpenGL поверх него), потому что никто в своем уме на Metal разрабатывать не будет.

———
https://www.ee.ryerson.ca/~elf/hack/recovery.html

Очень старый текст, напомнил мне ситуацию, в которой приходится запускать скрипты для сборки самых ранних пакетов. Например, первую сборку musl приходится делать в ситуации, когда у меня есть только dash + компилятор. Нет даже cat, echo.

Зацените, как я ловко вывожу блок текста в файл, пользуясь только shell builtin!

https://github.com/pg83/mix/blob/main/pkgs/boot/1/lib/musl/mix.sh#L18

Или как ловко, сразу после сборки libmusl.a, собираю себе с ним подручный вариант cat, чтобы заполнить все файлы, требующиеся для пакета:

https://github.com/pg83/mix/blob/main/pkgs/boot/1/lib/musl/mix.sh#L96
https://github.com/pg83/mix/blob/main/pkgs/boot/1/lib/musl/mix.sh#L121

Самый главный хак этого сборочного скрипта - что сборку сразу ведем в outdir, чтобы не заморачиваться с копированием файлов после сборки(команда cp появится позже).

Я считаю, что за этот файл мне нужно дать Нобелевку по posix sh!

———
https://www.kernel.org/doc/html/latest/admin-guide/syscall-user-dispatch.html

Читал тут про Wine 7.0, и случайно узнал, что современный Linux умеет обрабатывать любой способ захода в ядро, чтобы более хорошо эмулировать всякие чужеродные системы.

———
https://arxiv.org/abs/2110.01098

Говорят, что, если в Rust добавить GC, то студенты быстрее его осваивают. Норм же тема!
https://twitter.com/nicuveo/status/1469963644775682049

Красивое, просто показываю.

———
https://www.phoronix.com/scan.php?page=article&item=bsd-linux-eo2021&num=4

Не люблю perf тесты, которые делаю не сам. Вот zstd на FreeBSD - это что? Так же не бывает, что cpu intensive задача на разных OS в 10 раз отличалась.

———
https://github.com/NixOS/nixpkgs/issues/136926 - сломана кросс-сборка #Mesa.

https://habr.com/ru/post/591979/ - про основы кросс-компиляции в разных OSS системах сборки. Спойлер - Meson OK, #autohell и CMake - жесть.

Представление о 6 действиях, как собрать cross-gcc https://preshing.com/20141119/how-to-build-a-gcc-cross-compiler/

Про CMake скажу отдельно - у него разных способов контролировать пути поиска тех или иных артефактов штук 10, разных, странных - поштырьте по ссылкам(https://cmake.org/cmake/help/latest/variable/CMAKE_SYSTEM_PREFIX_PATH.html#cmake-system-prefix-path).

Насколько я понимаю, для Mix это нормальное дело. Я строю Nix так, что он всегда кросс-компилирует, даже когда host == target. Это приводит к следующему:

1) Собрать программу полностью в debug/asan/msan/etc - плевое дело. Пользователи интерпрайзных систем сборки к этому привыкли, для OSS это внове.

2) Несколько необычный режим сборки промежуточных артефактов - каждый таргет может быть собран в 3 режимах - lib, bin, data. Нужно это потому, что разные артефакты нужны под host и target платформы, а еще библиотека может зависеть сама от себя, но от своих данных(это достаточно странно, но больше никак не сделать возможность удаления .a файлов, оставляя данные для них(кстати, вот как раз с динамической сборкой это проще - никого не удивляет, что .so живет рядом с share/)).

https://github.com/pg83/mix/blob/main/pkgs/lib/wayland/protocols/mix.sh - вот прекрасный пример, программа может зависеть от библиотеки lib/wayland, от бинарников из lib/wayland, и во время работы ей тоже нужны бинарники из lib/wayland. Если посчитать, то это 3 разных таргета в случае кросс-сборки. В случае host == target часть можно пооптимизировать, но я пока не занимался.
https://www.opennet.ru/opennews/art.shtml?num=56295 #lust
http://harmful.cat-v.org/software/c++/linus

С одной стороны, перестать писать ядро на C - это must have, это давно понимают все большие корпорации(которые и пишут ядро). С другой - для Линуса начать использовать C++ означало бы потерять лицо. Поэтому это будет Rust. Нет, я не думаю, что Rust для этой цели подошел бы значительно лучше С++, но это неважно, оба подходят для этой задачи существенно лучше, чем С.

———
https://github.com/harfbuzz/harfbuzz/issues/2524

Столкнулся тут с прекрасным. Коллеги, на самом деле, еще не поняли, что там по настоящему происходит. Цикл включает в себя не только freetype и #harfbuzz, но и cairo, и #fontconfig.

"Another problem is that currently we include hb-ft in libharfbuzz.so. So removing it will be an ABI break for linux distros. I suggest we do that for harfbuzz 4.0.0. We are just about to release harfbuzz 3.0.0. That gives us about a year to figure out what to do."

"And sadly our package manager cannot automatically do the first-without-then-with-harfbuzz shuffle."

Им разрешение кольцевых зависимостей в пакетных менеджерах подавай. "Дебилы, бл;%:" (с), слов нет.

———
https://github.com/inconvergent/weird

Красивые картинки. Их автору бы познакомиться со Стивеном "Наше все" Вольфрамом(https://habr.com/ru/post/518206/).
1👎1
https://chromium.googlesource.com/angle/angle/

#ANGLE

Я, давеча, писал про #zink - это OpenGL, реализованный поверх Vulkan(у меня сейчас на нем крутится Sway). Вот это похожая штука, только от Гугла. Я люблю код от Гугла, он у меня не вызывает неприятных эмоций(кроме ограничения на длину строки, но это лечится clang-format). Поэтому надо попробовать! Вырисовывается такой Mesa-free stack - ANGLE + #AMDVLK, или дрова от #Mesa для Vulkan + ANGLE.

———
Меня раздражают фанатики Rust.

Вернее, нет. Меня раздражают фанатики, фанатики Rust в том числе, никаких исключений.

Фанатики Rust хотят, чтобы все было через Rust, никаких исключений. Поэтому они, например, оборачивают C-код в свои crate. Например, libgit2 в Rust - это обернутый C libgit2. При этом, так как это же, все таки, фанатики, они хотят делать вид, что никакого C там нет, поэтому эмбеддят исходники libgit2 прямо в свой crate. А чо, удобно, не нужно возиться с пакетным менеджером, все сделает cargo. Проблемы maintainer никого не волнуют, конечно.

Так как я не люблю фанатизм ни в каком виде, то я такую деятельность не одобряю. К счастью, есть GPL(враг моего врага - мой друг!), поэтому обернуть libiconv таким образом нельзя. Поэтому я очень радуюсь, как у меня обламывается cargo, и просит libiconv из системы.

Ну, и, к счастью, есть проекты, до которых Rust вряд ли когда-нить доберется, типа Qemu. Желание писать на верхнеуровневых безопасных языках чаще всего антикореллирует с желанием копаться в хардверных мануалах, это хуже чем C.

"К счастью", "радуюсь" - потому что я против фанатизма, а вот эти конкретные факты этому конкретно фанатизму мешают. Забавно, что эти факты сами по себе мне тоже не очень ОК, GPL я не люблю, и в Qemu не помешало бы немного C++/Rust.

Это НЕ анти-Rust пост, я уверен, что однажды Rust и его поклонники переживут эти детские болезни, и не будут бояться(а то, вдруг, кто-то ткнет пальцем, и скажет, что чей-та у вас эта либа не на Rust!) использовать код из системы(и из системного пакетного менеджера).
https://asahilinux.org/2021/12/progress-report-oct-nov-2021/

Срочно в номер! #asahi

Красивое, интересное(правда!), но только показывают. C GPU я не понимаю, что происходит. "Userspace in good shape, kernel work starting soon". Вот совершенно не понимаю. Казалось бы, ядерная часть должна быть проще - фактически, в ядре живет диспатчер буферов для отрисовки, kms(довольно сложная часть), и диспетчер очереди команд на буфера для отрисовки. Сложная часть(компиляция шейдеров в код для GPU) живет как раз в user space. Возможно, у Apple GPU есть какой-то прообраз(Mali?), для которого уже есть готовая реализация шейдеров, но я этого не заметил.
1
https://github.com/rui314/mold

Вышла версия 1.0 самого быстрого linker. Поддержки Mach-O все еще нет, в случае батч-сборки Mold, скорее, не нужен(потому что линковка в 1 поток проще ложится на параллельную сборку). Ну и чувак "странноват" - он хочет этот linker продать. https://github.com/rui314/mold/blob/main/LICENSE

Никто не хочет себе прикупить личный linker?

———
https://github.com/tsujan/Kvantum/tree/master/Kvantum

В Linux, оказывается, завезли Display Post Script SVG для отрисовки.

———
https://3dnews.ru/1056018/tsmc-zaprosila-u-intel-avans-za-rezervirovanie-moshchnostey-dlya-proizvodstva-3nm-produktsii

Легкий троллинг Intel. Интересно, как Intel собирается вылезать из этой жопы? Последнее поколение процессоров у нее снова провальное.

Кстати, я тут хотел снова написать, какой же классный Xiaomi, но вместо этого напишу вот что - я продаю MacBook Pro(2021, 16 inch, начальная конфигурация, незадорого, если интересно - напишите), и покупаю себе 2 - 3 Mac Mini вместо. Будут у меня выполнять роль сборочного сервера.

CI для Mix я решил строить на Mac Mini, они в 5 раз быстрее на 1 ядро на задачах сборки. Никакие облака сейчас рядом с M1 в плане CI даже и рядом не стоят. Тем более, я умею кросс-компилировать с Darwin на Linux.
#cross #cmake В CMake нет кросс-компиляции. Видимо, ее было сложно добавить постфактум(ну, не знаю, не глобальную переменную с набором environment завести, а сделать два экземпляра класса - для target, и для host). Вообще, добавить кросс-компиляцию в систему, которая для этого не дизайнилась изначально, сложно.

Ну и что же делать? Вот, вместо того, чтобы таки запилить кросс-компиляцию, товарищи запилили страничку, на которой, на голубом глазу, утверждают, что кросс-компиляция в CMake есть!

https://cmake.org/cmake/help/book/mastering-cmake/chapter/Cross%20Compiling%20With%20CMake.html

Конечно есть! Только вам надо 1 раз прогнать cmake, собрать все провалившиеся вызовы TRY_RUN, записать их предполагаемые результаты в файлик, и прогнать это говно еще раз!

https://cmake.org/cmake/help/book/mastering-cmake/chapter/Cross%20Compiling%20With%20CMake.html#using-compile-checks

Вдумчивый читатель спросит - а как в сборке запустить собранный host бинарь? А точно так же! Собираешь бинарь отдельно(твои проблемы, как), и подсовываешь его в cmake!

https://cmake.org/cmake/help/book/mastering-cmake/chapter/Cross%20Compiling%20With%20CMake.html#running-executables-built-in-the-project

Так же несколько раз по тексту эти господа прозрачно намекают на wine, qemu, и прочие достижения прогресса, чтобы TRY_RUN таки работал.

Я подумал, что это какая-то outdated хрень, но вот, пжалста, инструкции по кросс-сборке #LLVM:

https://bcain-llvm.readthedocs.io/projects/llvm/en/latest/HowToCrossCompileLLVM

-DLLVM_TABLEGEN=<path-to-host-bin>/llvm-tblgen
-DCLANG_TABLEGEN=<path-to-host-bin>/clang-tblgen

Удобные переменные, чтобы передать путь к заранее предсобранным бинарничкам, чтобы CMake не перенапрягся. Вообще, удивительно, что у программы, которая облегчила кросс-компиляцию в 100500 раз, такая отстойная кросс-компилирующая сборка.

"Cross-compiling is fully supported by CMake, ranging from cross-compiling from Linux to Windows; cross-compiling for supercomputers, through to cross-compiling for small embedded devices without an operating system (OS)."

Феерические долбоебы.

———
Ну и вот вам еще душераздирающих историй. У меня тут свалилась сборка glslang, компилятора шейдеров от Khronos Group. Эти негодяи попросту поменяли файл по релизной ссылке:

Было:

https://github.com/KhronosGroup/glslang/
archive/refs/tags/master-tot.tar.gz
f51c4b12ac0c8f9dee2067dc207a4fca

Стало:

md5sum master-tot.tar.gz 
71c7f379d1d73eebdce3fd05c7727af4
master-tot.tar.gz

Не, по ссылке(и по предыдущему опыту взаимодействия) было понятно, что ссылка не жилец, но все же. Кстати, к тому, что по github commit id данные часто приезжают с другим md5, я уже давно привык, это какое-то общее место.
#gold #terminal #foot #perf

https://zed.dev/

CRDT - прикольно, tree sitter - тоже(хочу его интегрировать в свой редактор), GPU accelerated GUI - ну такое. Я вот раньше думал, что GPU accelerated GUI это что-то очень крутое, а потом понял, что ерунда это все. IMHO c GPU GUI нужно собрать всего 3 программы - wayland compositor(потому что он много туда-сюда гоняет пикселей), browser, terminal(уже опционально).

Знаете, какая самая дорогая для CPU задача при отрисовке html странички в браузере?

Залить страницу белым фоном!

Ладно, это не совсем так(думаю, отрисовать много текста ЧУТЬ дороже), но мне же нужен шок-контент. Это очень дорогая операция для CPU, потому что он ограничен в своей полосе по памяти, и пишет нолики(или 0xFF) один за другим. Прикиньте, выполнить цикл 3000*2000*3*60rps раз - это сколько нужно тактов? GPU это делает очень быстро - у нее более широкий доступ к памяти, и дофига тупых ядер, которые медленно(но суммарно ОЧЕНЬ быстро(можно разбить всю заливаемую область по числу ядер GPU)) выполняют цикл for (i = x1; i < x2; ++i) mem[i + y*dimx] = 0xFF;

Cобственно, это самый важный факт, который нужно знать про GPU, чтобы понимать, почему они рулят в ML и прочей подобной нечисти, но об этом в другой раз.

Отрисовка текста - это просто bit blit(https://en.wikipedia.org/wiki/Bit_blit, а кто-то помнит, что это?) нескольких текстур на GPU. (Ладно, не совсем так, в оригинальном bit blit не было смешивания с альфа-каналом).

Вообще, конечно, рендер GUI на GPU - это из пушки по воробьям, тупой аппаратный bit blit справился не хуже бы, и стоил бы при той же скорости в 100 раз дешевле. Но имеем, что имеем.

Terminal emulator Foot, например, делает эту задачу во все мои 16 потоков CPU, и работает сравнимо с alacritty(https://codeberg.org/dnkl/foot/wiki/Performance). #foot

"Крутизна" 2D GPU рендеринга несколько преувеличена. Тупой 2D render для консоли(отрисовать сетку из прямоугольничков с текстом) - 20 строк кода(если не считать setup текстур со шрифтами, и все такое). Я однажды их даже написал - https://github.com/pg83/ted/blob/3c3f54a69b806bd7eb96f4c56189ce2a7f0507c5/gl#L325 Вот, inner loop 2D GPU accelerated rendering, не хуже, чем в Alacritty. Не такой sexy, конечно, на fixed pipeline, но я люблю тупые решения. Зачем я это сделал? Мне было интересно, насколько generic я сделал widget для редактирования текста. Вот, я перенес его из консоли в OpenGL, за 100 строк кода. Пользоваться не стал, незачем :)
Некоторое количество вводных к моему сегодняшнему монологу: #strong_ai #gold

https://en.wikipedia.org/wiki/Fermi_paradox
https://en.wikipedia.org/wiki/Gray_goo
https://en.wikipedia.org/wiki/Echopraxia_(novel)
https://www.alexirpan.com/2018/02/14/rl-hard.html (украдено у Плахова)
https://ru.wikipedia.org/wiki/%D0%A2%D1%91%D0%BC%D0%BD%D1%8B%D0%B9_%D0%BB%D0%B5%D1%81_(%D1%80%D0%BE%D0%BC%D0%B0%D0%BD)
https://ru.wikipedia.org/wiki/%D0%91%D0%BE%D0%BB%D1%8C%D1%86%D0%BC%D0%B0%D0%BD%D0%BE%D0%B2%D1%81%D0%BA%D0%B8%D0%B9_%D0%BC%D0%BE%D0%B7%D0%B3

Давайте я тезисно:

* Разум сложно отличить от самосознания(self-awareness). Одно не требуется для наличия другого.

* Самосознание невозможно обнаружить, или доказать наличие, потому что все наши средства познания мира направлены на объективный, проверяемый, опыт, а самосознание - вещь исключительно субъективная.

* Непонятно, будет ли разумная машина обладать самосознанием в человеческом понимании этого смысла(правда, я вот не могу гарантировать, что мои собеседники им обладают, но это отдельная тема).

* Практики AI считают, что это неинтересная тема - "shut up and calc". Этой темой занимаются философы, довольно нерезультативно.

* Я считаю, что не любая среда, которая может показывать признаки разумности, обладает возможностью самосознания. Такая среда нам известна только одна(живые кожаные мешки), а вот сред, способных поддержать разум - сколько угодно(любая машина Тюринга сгодится). Этот тезис молчаливо предполагает, что мы сумеем построить разумные машины на текущих технологиях, в чем я нисколько не сомневаюсь.

* Из того, что разумных сред нам известно дофига, а самосознающих - только одна, я делаю вывод, что среднестатистический разум в нашей вселенной не осознает себя.

* Человечество не остановится перед тем, чтобы создать AI. Потому что это огромный профит, а люди никогда не могут устоять перед низковисящими фруктами.

* Спорный тезис - я считаю, что AI, рано или поздно, take over. Это может произойти сотней возможных способов - глюк в Матрице, человечество просто устанет, не захочет лететь к звездам(мы это уже много раз проходили, во что скатываются люди, когда они полностью сыты). Короче, к звездам полетят разумные машины.

Лю Цисинь представил нам концепцию Темного Леса - страшной вселенной.

Я представлю вам концепцию "скучной вселенной" - огромные "шары" "экспоненциальной экспансии", которые ведут супер-разумные, но совершенно себя не осознающие, механические, AI, которые, так или иначе, поглотили своих создателей. И крохотные, постоянно затухающие, огоньки настоящего самоосознания.

Почему это скучно? А почему кому-то могут быть интересны "звездные войны" между разумными, но не осознающими себя машинами? Чем это отличается от игры Alpha Go сама с собой?
1😢1
https://groups.google.com/g/llvm-dev/c/HxXbT3qKYgg/m/kvNdxP0oAgAJ #maskray

Впервые с товарищем я столкнулся, когда он пришел в уютненький тредик про busybox style multicall binary для #LLVM(я очень ХОТЕТ). Он, соответственно, рассказывал, что это не нужно, и что это не дает перфа, и что размер не улучшится. Потом я узнал, что он один из авторов LLD, и ведет блог про линкер(не, реально, пишет много про линковку) - http://maskray.me/, правда, половина там на китайском. Короче, неудивительно, что человек, постигший все тайны динамической линковки не хочет оставаться не у дел, потому что статическая линковка проста, как 3 копейки. Пчелы против меда. Ульриха Дреппера про динамическую линковку не стоит слушать по той же причине(https://gavinhoward.com/2021/10/static-linking-considered-harmful-considered-harmful/).

Правда, потом он исправился, и даже зачинил несколько багов для multicall binary(ссылку не дам, лень искать).

А вот на днях он опубликовал пост про LLD, сравнение с #mold(кстати, Mold особенно хорошо идет с Rust, хехе), и все такое. Коллега совершает стандартную ошибку тех, кто не занимается перфом профессионально - он не делает прямых измерений(perf record), а только косвенные, и строит по ним предположения, как же работает программа.

http://maskray.me/blog/2021-12-19-why-isnt-ld.lld-faster

———
Short news - последнее время вместо HN я читаю lobste.rs, чего и вам желаю. Никакой политоты, только технически интересные штуки.

———
https://tom-kaitchuck.medium.com/designing-a-new-prng-1c4ffd27124d

Товарищ решил, что ему хочется не только посмотреть на срачик Мелиссы О'Нил и автора Хороширо, но и присоединиться к ним. Еще один PRNG.

Я однажды тоже запилил свой PRNG, он был норм, и по скорости, и даже проходил DieHard, Test01, и BigCrush, но у меня хватило ума не внедрять его никуда. Ну был он на 10% лучше, чем тогдашний конкурент? Но если что пойдет не так - не отмоешься же потом(как и произошло с автором Хороширо).

(срачик его с Мелиссой я уже в этом блоге кидал)
Набор ссылок, про log4j:

https://www.gwern.net/Turing-complete
https://drwho.virtadpt.net/files/mov.pdf
https://www.youtube.com/watch?v=pdmODVYPDLA
https://matt.might.net/articles/c++-template-meta-programming-with-lambda-calculus/
https://github.com/osnr/horrifying-pdf-experiments
https://www.youtube.com/watch?v=uNjxe8ShM-8
https://en.wikipedia.org/wiki/TrueType#Hinting_language
https://github.com/jbangert/trapcc#readme

———
https://github.com/google/gitiles/issues/84 #googlesource

Я тут обнаружил, что tar.gz с googlesource.com нестабильны - для одной и той же ревизии может быть разный tgz. Это, конечно, жесть.

Даже авторы Bazel это понимают:

"Prefer http_archive to git_repository and new_git_repository. The reasons are:"

https://docs.bazel.build/versions/main/external.html

Гарантировать целостность git checkout очень сложно(надо правильно трекать не только контент, но и кучу метаинформации про файлы, консистентно с тем, как это делает git(а если ты чекаутишь в систему, в которой нет тех пофайловых атрибутов, которые положили в git? с md5 от tar это работает прозрачно)).

Почему-то одни гуглоиды это прекрасно понимают, а другие - ломают возможность получить код по http. Наверное, Bazel занимаются более умные люди, чем googlesource.com.

Я, конечно, написал код по пересчету чексуммы для tgz, но это жесть. https://github.com/pg83/mix/blob/main/core/misc_cmd.py#L47

———
продолжается неделя линкера!

https://www.linux.org.ru/news/development/16695497?cid=16699902

Годный комментарий в теме про Mold анонимуса с ЛОРа, очень странное явление.
Кстати, каналу 3 месяца(я таки удивлен своему упорству), и наступило время традиционной просьбы закинуть на Патреон дать фидбеку и поделиться ссылкой на канал в доступных лично вам медиа!

(чувствую себя Jimmy Wales, если вы понимаете, о чем я)
https://justine.lol/cosmopolitan/index.html #justine
https://justine.lol/ape.html

Какая-то очень крутая штука, позволяет рожать портабельные нативные выполняемые файлы(под Unix это не очень сложно, с помощью https://en.wikipedia.org/wiki/Shar, но оно работает и под винду). Я только не понял, это больше стеб, или у нее есть реальные применения.

———
http://tree-sitter.github.io/tree-sitter/

Есть такая библиотека для парсинга, tree sitter. И все бы ничего, но для работы(генерации парсеров) ей требуется node.js, а код для highlight написан на Rust. Я лично бы взял С++ и Python, ровно то же самое, только смузи поменьше, но вот описание правил для хайлайтера на scheme меня уже добило. Столько смузи я не выжру.

https://tree-sitter.github.io/tree-sitter/syntax-highlighting

———
https://habr.com/ru/news/t/596425/

Не могу не упомянуть продолжение истории про Apple и поиск ею всякой запрещенки на ваших девайсах. Писал, пишу, и буду писать, что это зло во плоти. (кстати, недовольные политикой Apple могут использовать вот это, например - https://www.opennet.ru/opennews/art.shtml?num=56382)

———
У нас продолжается неделя линкера! На этот раз красивое от автора Mold:

"A classic way to use #mold:

clang before 12.0: pass -fuse-ld=<absolute-path-to-mold-executable>;
clang after 12.0: pass --ld-path=<absolute-path-to-mold-executable>;
gcc: --ld-path patch has been declined by GCC maintainers, instead they advise to use a workaround: create directory <dirname>, then ln -s <path-to-mold> <dirname>/ld, and then pass -B<dirname> (-B tells GCC to look for ld in specified location)."

https://gcc.gnu.org/pipermail/gcc-patches/2021-June/573833.html

Ну, с таким подходом товарищи еще быстрее окажутся на свалке истории. Реально, такое ощущение, что любое упоминание clang для них - это красная тряпка.
Про scheduler в Linux. #sched #gold

Я знал, что шедулер в Linux хуйовый(мат intended), но что на десктопе все сломано настолько, я не понимал. У меня во время компиляции тормозит браузер(любой). И я ничего не смог с этим сделать.

Вот команда запуска компиляции(IO я не трогаю, все в памяти):

chrt --idle 0 cpulimit -l 1400 -i nice -n 20 ./mix realm upgrade

Я ограничиваю число ядер для компиляции(14 из 16), я выставляю nice, я помечаю треды на idle, чтобы они вытеснялись любым более приоритетным кодом.

Команда запуска браузера примерно такая же, только - заменяем на +, —idle на —rr, etc. Команда запуска композитора тоже(все, что затрагивает user facing процессы, запущено с повышенными scheduling privileges).

И это не помогает. На минуточку, я для браузера оставил полноценное ядро(2 гипертреда), у меня число процессов в очереди на выполнение < CPU CORES, и все равно, шедулер как-то умудряется просрать(сука! ненавижу!) все полимеры. Почему так? Я вам расскажу!

Первое соображение - про процессы разработки.

Я уже много раз рассказывал, ядро Linux пишут красноглазые хакеры. Без нормального процесса разработки, тикетов, тестов, etc. Код соответствующего качества. Как нормальный разраб бы оформил шедулер? А вот так:

IScheduler* scheduler = new WorkStealingScheduler(
some kernel interfaces)...
...
auto job = sheduler->nextWorkItem();

Отметим наличие интерфейсов, чтобы можно было мокать тесты, инкапсуляцию(шедулер имеет доступ только к тем частям ядра, что ему явно передали), etc.

В ядре Linux это лапша без четкого интерфейса, что на входе, что на выходе, с кучей side effect по всему ядру, с доступом по всему ядру, полной невозможностью написать эмулятор и тесты.

Есть, типа, описание, как должен работать шедулер:

https://en.wikipedia.org/wiki/Completely_Fair_Scheduler
https://blog.acolyer.org/2016/04/26/the-linux-scheduler-a-decade-of-wasted-cores/

Господа, да если бы он работал по этому алгоритму, было бы счастье! Этот алгоритм by design не допускает лаги, когда у меня число выполняющихся процессов < CPU CORES! Так он уже давно по нему не работает.

Все люди, которых я знал, которые патчили шедулер, делали это примерно так - засучивали рукава, добавляли какую-то совершенно безумную ручку, которая позволяла снаружи крутить какой-то неочевидный параметр, а потом 5 лет внедряли это в mainline.

Шедулер в Linux пишут крупные корпорации - операторы облаков, или разработчики гипервизоров, вот по алгоритму, который я описал выше. Поэтому шедулер в Linux - это 100500 несвязанных(и конфликтующих! между собой) ручек, которые никто не умеет нормально крутить. Стройность CFS там уже давно и рядом не стояла.

Кстати, Con Kolivas отказался от идеи запилить нормальный scheduler для Linux. https://www.phoronix.com/scan.php?page=news_item&px=Con-Kolivas-EOL-MuQSS-CK Я бы, на его месте, послал всю эту пиздобратию еще раньше, когда Ingo Molnar, вместо того, чтобы признать, что Con лучше справился с работой, просто потырил его идеи в свою реализацию.

Второе соображение - пошедулить браузер существенно сложнее, чем пошедулить Apache. Прямо на порядок сложнее. Когда ты шедулишь Apache, тебе пофиг, что ты там где-то просрал квант времени. Когда ты шедулишь браузер, тебе надо выдавать стабильный RPS в 120, и просер одного кванта времени заметен. Тебе нужно реализовывать сложные алгоритмы, что, если ты отпустил lock, то твой квант времени доедает тот, кто этот lock получит(то же самое про запись в pipe). Почему это важно? Потому что тебе нужно, чтобы композитор моментально начал свою работу после того, как ты ему просигнализировал, что твой буфер с окном готов.

Под что тюнят облачные корпорации Linux scheduler? Вопрос риторический.

Итак.

* Шедулер в Linux сломан давно и навсегда(для десктопа, да и для серверов, если вы не большая корпорация со штатом крутильщиков ручек)
* Лучше всего(для десктопа) он работал в 2006 - 2008 году, пока его разработчики тюнили его под свои же workstation. Вот тогда реально все было плавненько.
* Чего там ищет Valve для гейминга в Linux - я не понимаю. https://www.opennet.ru/opennews/art.shtml?num=56390
👍5
https://www.phoronix.com/scan.php?page=news_item&px=Sway-1.7-rc1

Вышел новый rc Sway. Самое заметное нововведение - больше не нужно указывать для ./configure —my-next-gpu-wont-be-nvidia

По нынешним меркам хорошо, что не заставили извиняться(только вот кого, Sway или Nvidia?)

А чо, у меня вот шаблон для gnu-тых проектов называется autohell.sh, чего уж тут.

———
https://github.com/endrazine/wcc

Неделя линкера продолжается(я думаю, самые сообразительные мои читатели уже поняли, что в конце этой недели я просто расскажу, как линкер, собственно, работает, и не отговаривайте меня)!

Прекрасная, прекрасная вещь. Позволяет превратить .exe в .so, .so в .o, ну а то, что можно с помощью lua превратить любой .exe в shell с возможностью вызова любой функции - я уж вообще молчу.

Полагаю, мне это будет полезно, когда я захочу статически слинковаться с NVidia libGL.so

———
https://systemfolder.wordpress.com/2015/01/17/about-box/

А вот коллекция splash screen всякого старого софта. Prehistoric porn, все, как мы любим.

———
В свете поста про scheduler #sched нам пишут телезрители - оказывается, большие компании проблему понимают, и пытаются ее решить. Шедулер в user space - это прекрасно, у меня просто полно идей, как можно сделать хорошо.

https://lwn.net/Articles/869433/
https://dl.acm.org/doi/10.1145/3477132.3483542

———
Ну и выжимка текста про "починку" одного бага в шедулере(ссылка в прошлом сообщении, https://blog.acolyer.org/2016/04/26/the-linux-scheduler-a-decade-of-wasted-cores/):

"The original rationale for the behaviour was to maximise cache reuse – but for some applications waiting in the runqueue for the sake of better cache reuse does not pay off. The bug was triggered by a widely used commercial database configured with 64 worker threads.

To fix this bug, we alter the code that is executed when a thread wakes up. We wake up the thread on the local core – i.e. the core where the thread was scheduled last – if it is idle; otherwise if there are idle cores in the system, we wake up the thread on the core that has been idle for the longest amount of time. If there are no idle cores, we fall back to the original algorithm to find the core where the thread will wake up."

Вдумчивый читатель обнаружит, что починка добавляет еще 1 баг. Надо не longest amount, а shortest amount, потому что иначе возможна ситуация, когда будет 10 медленных ядер(напомним про тротлинг CPU) вместо 5 быстрых. Впрочем, возможно, нужно именно longest amount, просто я не понимаю, почему.
https://pythoninsider.blogspot.com/2021/12/python-3110a3-is-available.html

Пишут, что Python 3.11 уже на 20% быстрее, чем 3.10. Не знаю, у меня, кажется, медленнее, будет время - проведу пару тестов.

———
https://habr.com/ru/post/596193/

Если убрать оригинальное исследование автора текста, то прямо очень годный текст про разные архитектуры процессоров, я даже узнал что-то новое. Пример отличного Хабра.

———
https://www.brian.jp/2021/12/24/exiled-from-the-metaverse-before-it-even-started-the-dangers-of-relying-on-facebook/

Писал, пишу, и буду писать, что это(отключение от услуги) не должно быть в компетенции провайдера услуги. #law #provider #yeswecan

———
https://lwn.net/Articles/879739/
Вышел юбилейный systemd.

https://www.opennet.ru/opennews/art.shtml?num=56393
И не столь юбилейный s6.

Из этих двух, я, конечно, выбрал бы s6, а так - ни тот, ни другой.

Я еще сильно не думал про систему инициализации в MixOS, мне, если честно, пофиг, или, как сейчас модно говорить, unopinionated. Скорее всего, это будет божественный runit, потому что он реализует ровно ту модель запуска сервисов, которую я считаю правильной.

Про #systemd:

* Он слишком сложный. Если я бы хотел не знать, как работает моя система, я бы взял систему с launchd, если вы понимаете, о чем я.

* Он слишком всеобъемлющий. Я не верю, что такой комбайн может работать хорошо, и это, простите, не unix-way. Я предпочту набор хорошо сопрягаемых независимых компонент(в каждом из которых можно разобраться по отдельности).

* Он не решает ни одной моей задачи. В облаках сервисами управляет, условно говоря, снаружи K*, внутри или ничего, или что-то очень простое, типа runit. На десктопе модель systemd слишком сложна. Redhat, скорее всего, пилит systemd для отдельно стоящего сервера с apache/mysql/1c, ну так я не целевая аудитория.

* Мне никто так и не сумел ответить, как systemd должен поднять систему, в которой написано, что B поднимается после A, и должен работать только если работает А, но A находится в состоянии "10 секунд работает, 10 секунд упал".

Я считаю, что зависимости в системе управления локальными сервисами - зло. Управлялка должна оперировать bag of services, и просто пытаться поднять их все, возможно, с exponential backoff(потому что сервисы, в момент запуска, часто жрут больше CPU, чем в процессе работы).

Если вы пытаетесь перенести часть логики по обеспечению надежности своего сервиса в systemd("апач не должен отвечать на запросы, если не поднят mysql"), то вы попали, и мне даже лень подробно объяснять, почему.

Собственно, поэтому это и будет runit, возможно, с несколькими кастомными скриптами(для обеспечения exponential backoff, для управления cgroup, etc).
commit -m "better"
https://pythoninsider.blogspot.com/2021/12/python-3110a3-is-available.html Пишут, что Python 3.11 уже на 20% быстрее, чем 3.10. Не знаю, у меня, кажется, медленнее, будет время - проведу пару тестов. ——— https://habr.com/ru/post/596193/ Если убрать оригинальное…
А, совсем забыл, за что глаз зацепился-то в релизе #systemd:

"Для долго запускаемых или останавливаемых unit-ов в дополнение к показу анимированного индикатора выполнения операции предоставлена возможность вывода сведений о состоянии, позволяющих понять, что именно происходит с сервисом в данный момент и завершения выполнения какого сервиса ожидает в данный момент системный менеджер."

То есть, "анимированный индикатор" запилили раньше, чем вывод сведений о состоянии. Такие дела.
Небольшое продолжение про #systemd, конкретно, про #udev(который какого-то хера стал частью systemd).

https://github.com/illiliti/libudev-zero

"Another udev problem is non-portable home-grown language called "udev rules". Udev authors definitely don't know(or care) why it's better to avoid reinventing the wheel. Strictly speaking, I think they did that on purpose to overcomplicate udev as much as possible. Why? So that only authors(RedHat/IBM) can rule and dictate the future of udev. The recent eudev death only proves that it's really hard to support such unmaintainable mess."

Забавно, но я пришел к таким же выводам, весь этот ваш systemd - это классический vendor lock-in, со стороны IBM/RedHat.

———
https://lists.llvm.org/pipermail/llvm-dev/2021-December/154371.html #loongson

В #LLVM приземляют поддержку loongarch. Это ОЧЕНЬ странно. LLVM, на моей памяти, отказали почти ВСЕМ, в их желании поддержать новую архитектуру в LLVM. Их позиция - лучше меньше, но лучше. Почему этот принцип не сработал в данном случае, и кому занесли китайские товарищи(или на кого собрали компромат, хотя какой в современном западном обществе возможен компромат, когда все можно и все, что можно, - хорошо)?

———
https://justine.lol/sectorlisp2/

Lisp, на этот раз с GC, за 436 байта.

Еще ссылок от #Justine:

https://justinetunney.com/dox/unicode.html
https://justinetunney.com/endian.html

Хотел на ее примере написать что-то типа "вот есть же нормальные тетки-программисты, и без всяких этих ваших SJW-конференций https://www.youtube.com/watch?v=xOmQFBirbOg", а потом передумал.
https://hellosystem.github.io/docs/developer/application-bundles.html#making-an-application-load-privately-bundled-libraries

Я тут решил посмотреть, как в helloSystem(писал про нее недавно) сделали поддержку бандлов. Свое исследование я прекратил вот на этом замечательном сниппете текста:

If an application is supposed to load privately bundled libraries, one must patch it so that it loads privately bundled libraries from a path relative to itself ($ORIGIN) rather than from /usr/local/lib:

sed -i -e 's|/usr/local/lib|$ORIGIN/../lib|g' usr/local/bin/falkon
ln -s usr/local/lib .
rm usr/local/bin/falkon-e

This works because by coincidence the string /usr/local/lib has the exact same length as $ORIGIN/../lib. If this was not the case, one would need to either specify the rpath at compilation time, or use a tool such as patchelf.

Всегда было интересно, что у таких людей творится в голове.

———
Мне кажется, что, в последнее время, я вижу по 2 новости в день, что вышло обновление того или иного ответвления от Ubuntu/Debian.

За вчера:

https://www.opennet.ru/opennews/art.shtml?num=56413
https://www.opennet.ru/opennews/art.shtml?num=56415
https://www.opennet.ru/opennews/art.shtml?num=56414

Мне интересно, неужели вот это вот все находит своего пользователя, и зачем это кому-то может быть надо?

И отдельно вопрос про https://www.opennet.ru/opennews/art.shtml?num=56414

Товарищи пишут, что их GUI адаптируется к планшетам и телефонам. Мне интересно, доживу ли я до момента, когда размеры элементов в gui будут указываться в сантиметрах, а не пикселях?

20 лет этого жду, нет, серьезно.

———
https://marc.info/?l=git&m=124111702609723&w=2

Недавно писал про то, что JGit не умеет делать bitwise identical tgz со снепшотами кода.

Пока грепал интернеты про это, наткнулся на эту заметку. Как обычно, коллеги излагают свои идеи, почему БЫ оно могло БЫ быть медленнее, а не результаты прямых измерений.
🔥1