Интересная книга "The Internals of PostgreSQL" с картинками! По краткому прочтению - must have для разработчиков. #postgres
👍7
Тут на соседнем канале зашла речь про ускорение некоторых алгоритмов с помощью SIMD и я побыстрому накидал реализацию двух - косинусное сходство и корреляцию Пирсона (на скриншоте бенчи для него, для косинусного сходства - в камментах в gist). Алгоритмы как будто прямо таки созданы для Single Instruction/Multiple Data :)
Первый блок на скриншоте - просто мап на Vector<double> и дальнейшие операции, ничо сложного, но даже это даёт 6-кратный буст. Второй блок с float, тут ещё побыстрее, просто потому что элемент в 2 раза тоньше и за один чпок забирается в два раза больше элементов по сравнению с double.
Но вот дальше там был ещё один кейс, когда входные данные короче И double И float - например short. И вот тут становица всё ещё интереснее: отмапленый в Vector256<short> забирает сразу 16 элементов входного массива. Напрямую в Vector256<float> такое не смапиш конечно, поэтому операция двухэтапная - сначала GetLower/GetUpper по 8 элементов экспандяца до int (32 бита = 256 бит), а потом кастяца до float (тоже 256 бит).
Вроде выглядит некоторыми костылями, но это даёт 14-кратный буст даже на длинных массивах, которые гарантированно не влезают в L2 кэш. Если кастить в 32-битный float конечно, с double ситуация пожиже - там буст ровно в два раза хуже (~x7), что вполне логичо :))
Судя по всему выполнение SIMD инструкций тут отлично сочетается с асинхронностью L1/L2-кэша - пока локальные данные кастяца, множаца и складываюца - в кэш подтягиваются следующие порции данных и к моменту следующей итерации они уже там. #simd
Первый блок на скриншоте - просто мап на Vector<double> и дальнейшие операции, ничо сложного, но даже это даёт 6-кратный буст. Второй блок с float, тут ещё побыстрее, просто потому что элемент в 2 раза тоньше и за один чпок забирается в два раза больше элементов по сравнению с double.
Но вот дальше там был ещё один кейс, когда входные данные короче И double И float - например short. И вот тут становица всё ещё интереснее: отмапленый в Vector256<short> забирает сразу 16 элементов входного массива. Напрямую в Vector256<float> такое не смапиш конечно, поэтому операция двухэтапная - сначала GetLower/GetUpper по 8 элементов экспандяца до int (32 бита = 256 бит), а потом кастяца до float (тоже 256 бит).
Вроде выглядит некоторыми костылями, но это даёт 14-кратный буст даже на длинных массивах, которые гарантированно не влезают в L2 кэш. Если кастить в 32-битный float конечно, с double ситуация пожиже - там буст ровно в два раза хуже (~x7), что вполне логичо :))
Судя по всему выполнение SIMD инструкций тут отлично сочетается с асинхронностью L1/L2-кэша - пока локальные данные кастяца, множаца и складываюца - в кэш подтягиваются следующие порции данных и к моменту следующей итерации они уже там. #simd
👍11🤯5🔥4
В продолжение поста, теперь на столе коэффициент детерминации R² (gist). Тут что-то пошло не совсем так: если использовать прямой подход с мапом в Vector256<T> - то буст всего х4 на double и x6 на float (причем повторяемость практически не зависит от размера массива, а значит дело не в кэше который всё успевает и никак не влияет на перф, а в вычислениях).
Однако, если сделать финт ушами (второй скриншот) - и смапить в Vector512<T> - то всё становица чуточку лучше. И тут неважно, что процессор не умеет нативно AVX512, Vector512<T> здесь просто как контейнер для двух Vector256<T>. Здесь получается.... классический loop unrolling, когда за одну итерацию забирается два Vector256<T> (lower/upper) и дальше они ровно также как в ручном loop unrolling складываюца/умножаются в цикле в по прежнему в Vector256<T>.
Это помогает больше чем в 1.5 раза к обычному способу с Vector256 - буст с х4 до ~х5.5 (на double) и с х7.6 до ~x12.5 (на float). Причем на массивах больших, которые не помещаются в L1 кэш - разрыв в перфе больше. Подозреваю, что по причине как в предыдущем посте. #simd
Однако, если сделать финт ушами (второй скриншот) - и смапить в Vector512<T> - то всё становица чуточку лучше. И тут неважно, что процессор не умеет нативно AVX512, Vector512<T> здесь просто как контейнер для двух Vector256<T>. Здесь получается.... классический loop unrolling, когда за одну итерацию забирается два Vector256<T> (lower/upper) и дальше они ровно также как в ручном loop unrolling складываюца/умножаются в цикле в по прежнему в Vector256<T>.
Это помогает больше чем в 1.5 раза к обычному способу с Vector256 - буст с х4 до ~х5.5 (на double) и с х7.6 до ~x12.5 (на float). Причем на массивах больших, которые не помещаются в L1 кэш - разрыв в перфе больше. Подозреваю, что по причине как в предыдущем посте. #simd
🔥3👍1
Тут пишут что GitHub Copilot стал бесплатным... https://x.com/satyanadella/status/1869445091213095140
X (formerly Twitter)
Satya Nadella (@satyanadella) on X
GitHub Copilot Free for VS Code has arrived.
🔥8
Ещё один no code AI web design generator - на удивление генерит приличные странички (на мой непрофессиональный дизайнерский взгляд). И отметил бы что очень грамотно построенный маркетинг с точки зрения перевода в платность :))) бесплатных кредитов хватает на 2-3 страницы, а дальше за деньги :))
UI чем-то похож на фигмовский и генеряца именно макеты, а не странички. Но с другой стороны можно очень быстро слепить лендинг для чего-нибудь типа пет-проекта.
#ai
UI чем-то похож на фигмовский и генеряца именно макеты, а не странички. Но с другой стороны можно очень быстро слепить лендинг для чего-нибудь типа пет-проекта.
#ai
👍3
О вот ещё посты по перфу с соседнего канала, я что-то упустил что SkipLocalsInit даёт в некоторых местах приличный буст. Надо не забывать это поюзать при случае в бенчах при оптимизации.
Ещё один пост оттуда же про SkipLocalsInit и структуры
в рамках кросс-поста рекомендуется к подписке :))
Ещё один пост оттуда же про SkipLocalsInit и структуры
в рамках кросс-поста рекомендуется к подписке :))
Telegram
C# Heppard
Структура как Span #решение #память #скорость
Разобравшись с InlineArray и SkipLocalsInit мы можем пойти дальше. Например, мы можем представить любую структуру как Span. Напомню, что Span это простой указатель на адрес в памяти + отступ, умноженный на размер…
Разобравшись с InlineArray и SkipLocalsInit мы можем пойти дальше. Например, мы можем представить любую структуру как Span. Напомню, что Span это простой указатель на адрес в памяти + отступ, умноженный на размер…
👍6
Проект с забавным названием Picoc и не очень забавной сутью - интерпретатор Си. И что особенно интересно: It was originally written as a script language for a UAV on-board flight system 😮
Да, проект не оч живой (последний коммит 7 лет назад).
Да, проект не оч живой (последний коммит 7 лет назад).
Storing currency values: data types, caveats, best practices - то что надо знать, когда хранишь деньги в базе :) #howto
🔥9👍1
Тут nVidia релизнула несколько моделей на гитхабе Text to visual world generation (картинка / video). Должно быть это прекрасные модели, но... ресурсы...
Ну и initialization time на Single H100 CPU 14B модели 590 секунд... Вобщем копите бабки :) #llm
Ну и initialization time на Single H100 CPU 14B модели 590 секунд... Вобщем копите бабки :) #llm
👍2
В интернетах пишут, что 512-битные DKIM ключи уже небезопасны. Да, подобранная подпись работает не со всеми почтовыми серверами, но на достаточно крупных типа Yahoo Mail - работает.
👍2
Интересная статья от Cloudflare про Multi-path TCP - для использования множества каналов доступа к данным
The Cloudflare Blog
Multi-Path TCP: Revolutionizing connectivity, one path at a time
Multi-Path TCP (MPTCP) leverages multiple network interfaces, like Wi-Fi and cellular, to provide seamless mobility for more reliable connectivity. While promising, MPTCP is still in its early stages, with limited support and practical use cases. This post…
Интереснейшее часовое видео по протоколу Iridium и его сообщениям (для RTL-SDR например) #rtlsdr
rtl-sdr.com
CCC Conference Talk: Investigating the Iridium Satellite Network
Over the years, we've posted numerous times about the work of “Sec” and “Schneider,” two information security researchers who have been investigating the Iridium satellite phone network using SDRs. Iridium is a constellation of 66 satellites in low Earth…
👍1🤔1
Пара статей (раз, два) про интересные индексы в Postgres типа BRIN (Block Range Index) - когда в индексе сохраняется мин/макс значения для блока страниц. Такой подход позволяет получить очень маленький объем индекса - единицы мегабайт даже для сотен миллионов записей (и можно поиграть с размером блока, основываясь на конкретных данных, чтобы понять какой вариант наиболее выгоден).
Но не забываем, что каждый инструмент имеет свои возможности и ограничения. #postgres
Но не забываем, что каждый инструмент имеет свои возможности и ограничения. #postgres
🤔2🔥1
Всё никак не могу добраться, чтобы попробовать Aspire на каком-то живом проекте, но регулярно попадаюца статьи про то, как там всё удобно :)) в т.ч. для гетерогенных микросервисов #dotnet
DEV Community
Orchestrating Distributed Apps (Spin/Rust and .NET/C#) with .NET Aspire/Dapr
Introduction If you have followed me long enough, then you know that I strongly believe...
🤔6
Очередная статья (12-я) из серии про Source Generators. Помоему это самая большая серия статьей про source gen, которые мне попадались. #dotnet
Andrew Lock | .NET Escapades
Reading compilation options and the C# version in source generators: Creating a source generator - Part 12
In this post I show how to read details of a target project from a source generator, such as assembly name, the current configuration, or the c# version
🔥12
Тут на арену выходит новая нейронка DeepSeek, которая вроде как даже лучше Claude, и в половине тестов - лучше GPT-4o.
Русский понимает неплохо (несмотря на то что сама модель китайская) и весьма быстрая, а также что немаловажно - API (насколько я посмотрел) совместимо с OpenAI.
Ценники: $0.27 per million input tokens and $1.10 per million output tokens. #llm
Русский понимает неплохо (несмотря на то что сама модель китайская) и весьма быстрая, а также что немаловажно - API (насколько я посмотрел) совместимо с OpenAI.
Ценники: $0.27 per million input tokens and $1.10 per million output tokens. #llm
Deepseek
DeepSeek | 深度求索
深度求索(DeepSeek),成立于2023年,专注于研究世界领先的通用人工智能底层模型与技术,挑战人工智能前沿性难题。基于自研训练框架、自建智算集群和万卡算力等资源,深度求索团队仅用半年时间便已发布并开源多个百亿级参数大模型,如DeepSeek-LLM通用大语言模型、DeepSeek-Coder代码大模型,并在2024年1月率先开源国内首个MoE大模型(DeepSeek-MoE),各大模型在公开评测榜单及真实样本外的泛化效果均有超越同级别模型的出色表现。和 DeepSeek AI 对话,轻松接入 API。
👍3