Эндометриоз — невероятно интересное заболевание ( owlposting.com )
Source: news.ycombinator.com
ИИ — это не магия, это математика ( zerofluff.substack.com )
Замечание о том, что LLM занимаются только математикой, ни к чему вас не приведет, все занимаются только математикой.
Source: news.ycombinator.com
Chrome удалил боковую панель, чтобы конкурирующий ИИ не съел свой обед Обсуждение ( self.chrome )
отправлено 33 минуты назад пользователем Gettogether212
Google понял, что так много людей используют боковую панель для chatgpt, и количество поисковых запросов так сильно упало, что они просто полностью удалили боковую панель, чтобы предотвратить смерть поиска. К счастью, EDGE знал, насколько это важно, и сохранил ее. Пользовательский опыт Chrome теперь ужасен, потому что вы не можете работать над чем-то одним, одновременно исследуя боковую панель. Добавление препятствия отсрочит смерть поиска…..
Исследование красного бриллианта Уинстона: новый бриллиант из коллекции Смитсоновского института Fancy Red ( gia.edu )
> тщательный баланс … пластической деформации*… [и низкой концентрации] азотных дефектов
*точный механизм поглощения/люминесценции неизвестен (см. комментарий для линии 550 нм в Таблице 3, стр. 29)
Source: news.ycombinator.com
Simulink (Matlab) Copilot ( github.com/kaamuli )
Большинство других поставщиков узкоспециализированного «профессионального» программного обеспечения просто показывают средний палец любителям и хотят, чтобы вы выложили тысячи долларов за годовую подписку.
Я думаю, что совершенно нормально сказать: «Мне это не нужно, мне подходят инструменты с открытым исходным кодом». Точно так же, как вы можете использовать KiCad вместо Cadence для проектирования печатных плат. Но злиться на Mathworks за то, что он хочет денег от коммерческих пользователей, кажется странным.
Я студент 2-го курса по специальности «авиационная инженерия» в Имперском колледже Лондона, мне нравится решать проблемы (получил BPhO — золото и UKMT Gold). Я полный разработчик (или, по крайней мере, пытаюсь быть таковым, lol), который хакнул Bloxi, второго пилота с искусственным интеллектом, который находится поверх Simulink и превращает простые английские подсказки в рабочие модели систем управления и может легко отлаживать их в реальном времени. Я сам почувствовал боль в этом семестре, наблюдая, как студенты высшего уровня сжигают часы на монтаже блоков вместо проектирования. С сегодняшними мультимодальными LLM, наконец, способными «видеть» диаграммы, это первый момент, когда может существовать такой помощник, как Bloxi, и самый быстрый способ дать миллионам инженеров тот же скачок производительности, который только что получили кодеры.
Я создал это в основном для того, чтобы освоиться с LLM и «инженерией подсказок», и я думаю, что я достиг точки, когда я закончил возиться — особенно теперь, когда MathWorks объявили, что работают над своей собственной версией. Поэтому я решил поделиться тем, что у меня есть, на случай, если кто-то захочет развить это дальше, а также просто чтобы поделиться этим с миром, не так ли?
Как это работает
Два скрипта + простой бэкэнд: 1. Один создает модель Simulink. 2. Другой обрабатывает чат + простой пользовательский интерфейс. 3. Бэкэнд, который склеивает API OpenAI и фронтэнд.
Вставьте свой собственный ключ API OpenAI и все готово. Я использовал его для отладки и сборки нескольких моделей uni-project, и он оказался на удивление удобным.
Сначала он просто выдал готовый файл Simulink, но я хотел, чтобы эта атмосфера «прохода» ChatGPT делала его «волшебным». Поэтому я добавил пару циклов for: один для пошаговой загрузки блоков, а другой для их подключения.
Поскольку сырой код не виден в Simulink (насколько мне известно), в одном из моих скриптов я заставил его пройти по файлу simulink и сделать снимок экрана на каждом этапе, используя тот факт, что API OpenAI является многомодальным, передать их через LLM и позволить ему обнаружить несоответствия. Работает лучше, чем я ожидал. Может быть, кто-то сможет сделать лучше или найти лучший способ?
Видео на Youtube, где я его использую: https://youtu.be/TX0fviaFSyg
Вот ссылка на GitHub, если вы хотите поиграться с ним, поковыряться или заняться его разработкой: https://github.com/Kaamuli/Bloxi
Чтобы использовать скрипты загрузки и открытия, просто выполните openChatbox().
Source: news.ycombinator.com
Ловушка параллелизма: как атомарный счетчик остановил конвейер ( conviva.com )
Сложность здесь (которую автор решил с помощью rcu) заключается в том, что здесь ОЧЕНЬ легко создать состояние гонки.
Представьте, что поток A и поток B хотят добавить новое значение в хэш-карту. Они приходят одновременно. Наивное использование arc_swap в конечном итоге приведет к победе одного из потоков и исчезновению значения из другого потока. Не очень здорово.
Но еще одна вещь, которую следует учитывать при использовании этого подхода, заключается в том, что он является дорогостоящим при любом виде конкуренции за запись. Как только записи начинают резко расти, количество выделений увеличивается потенциально очень плохим образом. Если у вас есть 3 потока, которые хотят писать одновременно, один поток создаст 1 полную копию. 1 создаст 2 полных копии, а 3-й поток создаст 3 полных копии. Если вашей базовой структуре данных выделена какая-либо память, это становится довольно плохим компромиссом.
Забавно, но один из простых способов решить эту проблему — снова ввести блокировки, но только для писателя. Возможно, это хорошая идея, если вы тратите более ~1000 циклов на создание структуры данных.
Вот где побеждают древовидные структуры данных. Git, Subversion и чистые функциональные языки не заменяют всю структуру данных. Они создают новый элемент и присоединяют его к дереву, создавая новую версию предполагаемого родителя и новую версию его родителя вплоть до корневого элемента.
Так что где-то есть место для гибрида ArcSwap и DashMap, который использует sharded copy on write. Этим ребятам это, вероятно, не нужно, учитывая их низкую скорость записи, но shards должны помочь с конкуренцией записи для других вариантов использования.
Слева-направо — это опция, которая позволяет избежать цикла CAS, поскольку это примитив с одним писателем.
Для проблем в памяти есть B-деревья, которые являются более старым решением многих проблем, чем большинство пользователей HN, включая меня. Тогда у вас все еще есть шардинг, который, как я фактически указал, был бы частью лучшего гибридного решения.
Мне бы хотелось, однако, иметь похожую постоянную структуру, где указатели узлов на каждом уровне были бы общими для потоков, вместо использования, например, атомарных. Мутация на ветке могла бы записать, что мутация “только” для потока ID X, который сделал мутацию. В какой-то более поздний момент “коммит” мог бы согласовать хранилище с глобальным, возможно
Если убедиться, что переменная счетчика сидит одна на своей собственной строке кэша, это полностью устранит чрезмерное поведение пинг-понга. Строка кэша со счетчиком, конечно, все еще будет пинг-понгом, поскольку она мутирует, но не чрезмерно.
Все потоки, многократно обращающиеся к одному и тому же участку памяти, способны поставить любой процессор на колени.
Важнейшей частью исправления является то, что читателям больше не придется изменять какие-либо разделяемые области памяти и полагаться на отложенное освобождение.
И способ решения этой проблемы заключается в использовании отдельного счетчика для каждого ядра, по крайней мере на одну строку кэша друг от друга, чтобы гарантировать, что все они получат отдельные строки кэша. Недостатком является то, что вы теряете возможность считывать счетчик атомарно, но если счетчик увеличивается достаточно быстро, и вам нужны счетчики для каждого ЦП, то значение на определенный момент времени в любом случае по сути бессмысленно.
Но для многократного чтения и исключительной записи это никогда не сработает. Или, по крайней мере, без дополнительного кремния. Что, возможно, должно быть чем-то. Проблема, конечно, в том, что многословная атомная инструкция суммы фактически должна будет пересекать строки кэша, чтобы избежать ложного обмена. Так что вы получите счетчики на смежных строках кэша, но занимающие по 64 байта каждая, что очень много.
Это фактически потребовало бы создания специальной области памяти с другим поведением когерентности кэша, и я не вижу, чтобы это было просто, быстро или обеспечивало обратную совместимость, возможно, поэтому мы этого и не делаем.
[1] Существуют RWMutex с полной блокировкой без записи, но они значительно сложнее и требуют обнаружения эпох, как ArcSwap, поэтому существенных преимуществ нет.
Ну, если бы они мутировали счетчик ссылок, я бы назвал их писателями, а не читателями. =P
Но да. Многие ошибочно полагают, что запись atomic_int из многих потоков — это очень быстро. Я имею в виду, что это атомарно! Это не может быть меньшим атомом работы! Увы, это невероятно неверно. Даже атомарные int могут быть чрезвычайно медленными.
*к спорной общей памяти
Громоподобные стада сделают это. Теория очередей. Когда очередь выстраивается, ее расчистка занимает гораздо больше времени, чем подсказывает интуиция.
Честно говоря, я долго думал об этом. Но сейчас эти методы хорошо известны, так что теперь стало проще «копировать» ход мыслей других, а именно ход мыслей — это и есть трудная часть.
Функция set не сделает недействительными какие-либо значения, видимые функцией get, на которые все еще могут ссылаться, но новое значение будет видно всем последующим функциям get.
Старые значения будут уничтожены, если на них больше не будет ссылок.
Для чтения-копирования-обновления вам нужно будет установить блокировку (которую читатели не устанавливают), получить текущее значение (оно будет текущим, поскольку вы блокируете других записывающих), скопировать его, изменить копию, а затем установить новое значение.
Вам не нужно читать-копировать-обновлять, если новые значения не зависят от предыдущих значений. Так что мой API не заставляет читать-копировать-обновлять, но вы можете сделать RCU с ним.
Ну, во-первых, чтение очень дешево, так что это не большая проблема. В некоторых системах читатели вообще не поворачиваются, чтобы записать, так что это нормально, а в других они не изменяют текущее значение. Например, в одной из систем, которую я построил, мы используем файлы TinyCDB, и когда новые файлы переименовываются на место, мы открываем их и устанавливаем дескриптор на одну из этих потокобезопасных переменных — здесь нет чтения-изменения.
> А если выбрать структуру данных, для которой копирование не является дешевой операцией, это может оказаться медленнее, чем классический RCU.
В любом случае это RCU. Лучше всего публиковать неизменяемые данные с помощью RCU и проектировать структуры данных, где изменения копирования при записи не должны копировать всю структуру данных, а только небольшие ее части. Например, в дереве вам нужно будет копировать только внутренние узлы из того, который вы изменяете, в корень.
Всегда можно построить хеш-таблицу, где каждая ячейка представляет собой одну из этих потокобезопасных переменных (или обычный старый RCU), хотя для этого придется сделать эти потокобезопасные переменные более легкими, чтобы сделать реалистичным их большое количество (в настоящее время в моей реализации на каждую переменную приходится pthread_key_t, который не масштабируется).
В TFA ArcSwap по сути неотличим от хэш-таблицы, доступной только для чтения, опубликованной в чем-то вроде одной из моих потокобезопасных переменных, и для TFA это сработало лучше, чем доступные альтернативы, несмотря на нагрузку копирования при записи.
Кстати, я изначально создал эту штуку, чтобы глобальная конфигурация была доступна потокам, которые в противном случае ничем не делятся, и чтобы служба могла быть перенастроена во время выполнения. Без чего-то вроде этого (или просто старого доброго RCU) ваши возможности ограничены такими вещами, как использование блокировок чтения-записи (которые намного хуже всего, что вы можете себе представить, чтобы быть плохим в RCU, используемом с неизменяемыми структурами данных). Я был очень недоволен блокировками чтения-записи, когда мне нужно было решить эту конкретную проблему в Sun, но я не создавал эту штуку, пока не ушел из Sun (Oracle).
В настоящее время библиотеки RCU-ish довольно широко доступны. OpenSSL 3.3 (или это был 3.4?) имеет что-то вроде этого после провалов в производительности потоков 3.0. В частности, OpenSSL имеет хэш-таблицу RCU-ish. Она может вас заинтересовать. IIRC (но прошло много времени с тех пор, как я смотрел), она использует один указатель опасности на поток для получения стабильной ссылки на ключ или значение, достаточно длинной, чтобы затем увеличить счетчик ссылок — довольно умно, и это, по сути, способ сделать «потокобезопасную переменную» достаточно легкой, чтобы можно было использовать одну для каждого слота в хэш-таблице.
Все, что касается “debt”, касается дизайна ArcSwap, который использует “debt” вместо “hazard pointers”. Идея в том, что каждый поток отслеживает последнюю версию hashmap, которую он видел, и это “debt” (ссылки, которые в конечном итоге должны быть освобождены), и этот долг является локальным объектом потока, который связан со всеми долгами других потоков, что по сути позволяет собирать мусор “debt” (сбор долгов?) или что-то в этом роде. Смотрите https://github.com/vorner/arc-swap/blob/master/src/docs/inte…
Я сам реализовал нечто подобное. Вместо реализации RCU пользовательского пространства (что, возможно, мне следовало сделать) я реализовал «потокобезопасную переменную», где чтения не требуют блокировок и ожидания, а писатели оплачивают все расходы. Мой API потокобезопасных переменных очень прост и интуитивно понятен: `create(value_destructor) -> thread_safe_var`, `set(thread_safe_var, value)`, `get(thread_safe_var) -> value`, `release(thread_safe_var)` и `destroy(thread_safe_var)` (предположительно, только во время вызова обработчика atexit() или деструктора разделяемого объекта, если вообще есть). У меня есть две реализации: одна со связанным списком указателей опасностей для каждого потока, а другая с кортежем из {следующая/текущая, текущая/предыдущая} «ячеек» и протоколом, который дает читателям время прочитать ячейки, выяснить, какая из них «текущая», а затем разыменовать и увеличить счетчик ссылок.
Независимо от того, как реализовать эту структуру данных, ключевая концепция заключается в том, что вам необходимо атомарно скомпоновать две отдельные атомарные операции: чтение и разыменование для атомарного увеличения счетчика ссылок — это чрезвычайно сложно!
При наличии GC все очень просто: просто читайте — не нужно увеличивать счетчик ссылок.
С помощью связанного списка указателей опасностей для каждого потока все, что вам нужно сделать, это прочитать что-то, затем записать это в ваш локальный указатель опасности потока, затем снова прочитать, повторяя цикл, пока второе чтение не будет таким же, как и первое чтение. Таким образом, безопасное копирование значения в локальный указатель опасности потока читателя позволяет выполнить условную сборку мусора. Любой поток, который хотел бы выпустить старую версию значения, должен проверить все указатели опасности, чтобы убедиться, что оно не используется, и это равносильно небольшой сборке мусора.
Мне особенно нравится подход с указателями опасности.
См. также MVars (Haskell), транзакционная память, RCU и т. д.
Меня поражает, что на отслеживание такой проблемы могут уйти недели . Если бы я был на руководящей должности в этой компании, я бы свернул головы с нехваткой телеметрии или знаний в этой области для этих систем.
Параллельное программирование уже давно стало мейнстримом, но я не думаю, что уровень знаний большинства инженеров сохранился. Это становится наиболее очевидным, когда программное обеспечение начинает сталкиваться с подводными камнями параллелизма: проблемами производительности, взаимоблокировками, UAF и т. д.
Иногда вы не можете заранее иметь необходимые знания в предметной области. Причины могут быть самыми разными. Например, рассматриваемое программное обеспечение может быть коммерческим, и у вас может не быть альтернативного поставщика, на которого можно переключиться. В других случаях ваш «коэффициент шины» мог упасть до некомфортно низких значений не по вине кого-либо в организации (люди слишком быстро уходят по причинам, не имеющим никакого отношения к тому, как управляется организация, люди умирают, численность персонала и бюджеты не позволяют исправить ситуацию, и просто слишком много критических систем, чей коэффициент шины нужно постоянно поддерживать на высоком уровне).
Source: news.ycombinator.com
Высокоскоростная флуоресцентная световая томография целых свободно движущихся организмов ( optica.org )
https://opticapublishing.figshare.com/articles/media/video6_…
https://opticapublishing.figshare.com/articles/media/video4_…
Source: news.ycombinator.com
Армия США набирает руководителей крупных технологических компаний в звании подполковников ( taskandpurpose.com )
https://www.politico.com/news/2025/04/15/pentagons-digital-r…
Я считал, что современная армия США уделяет большое внимание процессам и традициям в подготовке офицеров.
Не говоря уже о том, что в то же время, когда все это происходило, Министерство обороны уволило ряд генералов, а военные используются в политических целях, по крайней мере, по мнению некоторых.
Мне почему-то кажется, что Эндрю Босворт выразился не совсем так.
Source: news.ycombinator.com