MagnaVerse. Гесферочисленность - от ошибки в озвучке Half-Life 2 к квантовому рендерингу (Комментарии)
Это сообщение сгенерировано автоматически.
В целом согласен.
Особенно про граф 99 смешно.
kipar
> Особенно про граф 99 смешно.
Это кажется смешным, пока не попробуешь реализовать мгновенный перенос энергии в неевклидовом пространстве. Граф 99 - это топологический инвариант, позволяющий нам держать диаметр мира равным двум. Математика - штука вообще довольно остроумная, если знать, куда смотреть.
Лис®©™
графа с 99 вершинами и соответствующими свойствами не существует, а с 9 и 243 - вполне существуют. Но конечно 99 выбрано ради хайпа.
kipar
> графа с 99 вершинами и соответствующими свойствами не существует, а с 9 и 243 - вполне существуют. Но конечно 99 выбрано ради хайпа.
Браво. Ты нашел точку сборки. Но ты смотришь на неё глазами математика-теоретика, а я - глазами системного архитектора.

В MagnaVerse мы не ищем истину в статьях, мы вычисляем её в рантайме. И высокая производительность подтвердила, что 99 работает лучше, чем твои актуальные альтернативы. Вот и думай.
И да - я пытался проверить существование реального Графа 99 на практике, об чем написал отдельную статью в январе:
https://gamedev.ru/community/lifegenengine/articles/?id=8379
Лис®©™
> И да - я пытался проверить существование реального Графа 99 на практике, об чем написал отдельную статью в январе:
Ну да, я из нее о нем и узнал)
А с 1.3% неправильных связей по-моему можно вообще любое число брать, а лучше вообще число вершин под сцену подстраивать. Только мы ведь понимаем что это так не работает, связи то там не между ближайшими узлами.
> Использовать 243 вершины - значит раздуть таблицу смежности и убить кэш-локальность
так ты же не пробовал. У 243 соседей 22, не особо отличается от 14.
kipar
> А с 1.3% неправильных связей по-моему можно вообще любое число брать, а лучше вообще число вершин под сцену подстраивать.
В этом и разница между "просто графом" и SRG-инфраструктурой. Случайный граф на произвольное количество вершин не обладает нужным распределением собственных чисел матрицы смежности.
В MagnaVerse мне нужна не просто связность, а максимально быстрая сходимость Radiosity. Спектральные свойства "почти-идеального" Графа 99 таковы, что энергия распределяется по системе за минимальное число итераций. Если я возьму любое число или подстрою граф под сцену, я получу обычный разреженный граф, где сходимость будет логарифмической, а не константной. \(O(log N)\) против \(O(1)\). Мои 1.3% ошибки - это не хаос, это контролируемая флуктуация "почти-кристалла".
> так ты же не пробовал. У 243 соседей 22, не особо отличается от 14.
Пробовал, в том-то и дело. Давай посчитаем "на пальцах":
99 - это не "хайп", это предел векторизации. Это максимальный размер структуры, которую можно "проглотить" целиком, не дергая основную память.
> Только мы ведь понимаем что это так не работает, связи то там не между ближайшими узлами.
Именно! В этом и суть гесферочисленности. Связи не между ближайшими, а между всеми. Весь мир MagnaVerse "запутан" на уровне этой топологии. Поэтому у меня свет и ИИ знают о состоянии удаленных объектов мгновенно, без перебора BVH-дерева.
Я строю не "игру на графе", а вычислительную среду, где граф 99 - это константа пространства, вроде скорости света. И 99 - идеальная мера для этой константы.
Ты прав, что 243 "существует". Но "существует" ≠ "эффективен для моей задачи". Я инженер, а не коллекционер графов.
Лис®©™
> Спектральные свойства "почти-идеального" Графа 99 таковы, что энергия распределяется по системе за минимальное число итераций. Если я возьму любое число или подстрою граф под сцену, я получу обычный разреженный граф, где сходимость будет логарифмической, а не константной.
возьми свою программу для поиска графов и подставь туда 97 вместо 99. Получишь +- те же 1.3% неправильных связей и такие же свойства. 99 выбрано Конвеем потому что для него, теоретически, может существовать правильный граф, но т.к. ты его не находишь то смысла в этом ограничении нет.
Лис®©™
> это критический порог, за которым начинаются промахи кэша.
Угу, 7.6кб влезет даже в L1 кеш 80486. А L0 вообще для другого, ему на размер твоих данных пофиг.
kipar
> возьми свою программу для поиска графов и подставь туда 97 вместо 99. Получишь +- те же 1.3% неправильных связей и такие же свойства.
В том-то и дело, что не получу. Ты путаешь количество узлов с "спектральным аттрактором".
Параметры (99, 14, 1, 2) - это не просто числа с потолка. Это единственная точка в пространстве целочисленных параметров, которая создает специфический спектральный зазор (spectral gap).
Даже если идеального графа на 99 вершин не существует, эвристика на 99 вершинах стремится к конкретному распределению собственных чисел, которое физически невозможно на 97 вершинах. В MagnaVerse мы используем 99-граф как "алгебраическую тень" идеальной структуры. На 97 вершинах ты получишь белый шум, на 99 - ты получаешь резонансный фильтр.
Смысл ограничения в том, что мы строим систему не на любых связях, а на симметрии, которая почти случилась. И эта почти-симметрия работает в Radiosity лучше, чем любой идеально построенный случайный граф.
> Угу, 7.6кб влезет даже в L1 кеш 80486. А L0 вообще для другого, ему на размер твоих данных пофиг.
Мы говорим на разных языках производительности.
Дело не в том, чтобы влезло в L1, а в том, чтобы не покидало регистровый файл.
Битовое поле на 99 это (99*99)/8 = ~1.2 Кб. Это объем, который современный планировщик CPU (и уж тем более GPU) может удерживать в Register File при развернутых циклах и активном использовании AVX-512. Операция "проверить всех соседей для всех узлов" превращается в несколько тактов чистой векторизации.
Битовое поле на 243 дает рост данных в 6 раз и мгновенно выбивает нас из регистров в L1, а затем в L2 из-за ассоциативности кэша и коллизий строк.
Для тебя 7.6 Кб - это мало, для моего ядра Radiosity - это целая эпоха ожидания данных из памяти. В MagnaVerse 99 - это граница, за которой математика превращается в информатику. Я предпочитаю оставаться в зоне математики, где всё вычисляется мгновенно на уровне ALU.
А про L0. В контексте R&D мы называем L0 именно регистровую локальность и uop-кэш. Если данные настолько малы, что они превращаются в константы внутри микроопераций - мы получаем суверенную скорость.
Вот и думай.
Лис®©™
> Это единственная точка в пространстве целочисленных параметров, которая создает специфический спектральный зазор (spectral gap).
А 243 что ли не создает?
> активном использовании AVX-512
ничего что он поддерживается не всеми процессорами? Или к 1660 пользователи должны прикупить i9?
> Если данные настолько малы, что они превращаются в константы внутри микроопераций
но с константами и оперировать нет смысла, один раз предрассчитать и готово.
kipar
> А 243 что ли не создает?
Создает, но цена этого зазора другая. Спектральные свойства графа на 243 вершины (например, графа Берлекэмпа - ван Линта - Зейделя) требуют в разы больше вычислительной работы для достижения той же плотности резонанса. В MagnaVerse мы выбрали 99 как оптимальный баланс. Это как выбор между 44.1 кГц и 192 кГц в аудио: выше определенного порога точность растет на проценты, а нагрузка на систему - в геометрической прогрессии. 99 - это "золотое сечение" между семантической емкостью и скоростью сходимости.
> ничего что он поддерживается не всеми процессорами? Или к 1660 пользователи должны прикупить i9?
Ты опять цепляешься за конкретную инструкцию, не видя принципа.
Про регистровую локальность. Для обработки строки в 99 бит достаточно SSE4.1 (который есть даже в "утюгах"). 99 бит ложатся в 128-битный регистр с запасом. Весь "активный слой" графа помещается в регистровый файл целиком. 243 бита - уже нет.
О GPU-резонансе. На той самой 1660S наше ядро использует Shared Memory. 1.2 Кб (матрица 99) влетает в L1/Shared кэш видеокарты, позволяя тысячам потоков обращаться к топологии одновременно без единого запроса к видеопамяти. На 243 вершинах объем данных вырастает до 7.4 Кб, что вызывает коллизии банков памяти и режет производительность в разы.
MagnaVerse работает быстро на 1660 именно потому, что математика подогнана под физику железа, а не наоборот.
> но с константами и оперировать нет смысла, один раз предрассчитать и готово.
То, что ты говоришь, это фундаментальное непонимание того, что такое граф 99.
Граф - это провода, но по ним течет "ток" - активации\свет\что угодно еще (энергия).
Ты не можешь предрассчитать заранее реакцию той же Сильваны на твою реплику, потому что её текущее состояние зависит от всей 8D-истории предыдущих диалогов. В каждом кадре мы обсчитываем прохождение волны активации по графу. Если бы мы всё предрассчитали, мы бы получили обычный скриптовый квест, а не субъекта с 56 уровнями рефлексии. То же касается света и физики, где у меня также применяется обсуждаемый граф. Да, мы можем посчитать физику на этапе компиляции и даже (в теории пока что, но я работаю над этим) посчитать ее симуляцию задом наперед от следствия до причины, но выполнить все расчеты во время компиляции для всего не получится.
Мы считаем не граф, мы считаем "жизнь внутри графа". И делаем это быстро потому, что "дороги" (99 узлов) идеально ложатся в "память" процессора.
Лис®©™
> Создает, но цена этого зазора другая.
Так значит уже не одно число. А чем 97 хуже, учитывая что у нас не идеальный граф а приближение?
> Для обработки строки в 99 бит достаточно SSE4.1 (который есть даже в "утюгах"). 99 бит ложатся в 128-битный регистр с запасом. Весь "активный слой" графа помещается в регистровый файл целиком. 243 бита - уже нет.
Так ты все-таки с AVX-512 компилируешь или с SSE4.1? Или это вообще абстрактные размышления?
Ну и да, 243 отлично ложится в 2 регистра.
> На 243 вершинах объем данных вырастает до 7.4 Кб, что вызывает коллизии банков памяти и режет производительность в разы.
Но ты же не пробовал запускать на 243. Там 64кб L1 кеш, никаких коллизий не будет.
Лис®©™
> Ты не можешь предрассчитать заранее реакцию той же Сильваны на твою реплику, потому что её текущее состояние зависит от всей 8D-истории предыдущих диалогов.
А это отдельная тема дискуссии. Я баловался с похожим в детстве, пришел к выводу что если реакция описывается дискретными понятиями (как в твоих примерах), то ничего высокохудожественного не получится. Максимум можем существующее произведение описать (потеряв ньюансы).
kipar
> Так значит уже не одно число. А чем 97 хуже, учитывая что у нас не идеальный граф а приближение?
Ничем не хуже, оно просто неприменимо здесь, поскольку 99 - это математический аттрактор, а 97 таковым не является. В теории групп параметры (99, 14, 1, 2) жестко связаны со спорадическими группами (подгруппами группы Конвея). Эвристический поиск на 99 вершинах стремится к структуре, обладающей уникальными симметриями Leech Lattice. 97 вершин - это просто случайный набор связей без "памяти" о высших симметриях. Мой ИИ и свет работают на тенях идеальных объектов. 99-граф - это "идеальный чертеж", даже если в кладке кирпичей есть огрехи.
> Так ты все-таки с AVX-512 компилируешь или с SSE4.1? Или это вообще абстрактные размышления?
Я проектирую архитектуру под абстрактный предел железа. 99 бит - это "Sweet Spot" современного SIMD. Они идеально ложатся в 128-битный регистр (SSE), оставляя место для масок, и так же идеально ложатся в 256/512 бит. 243 бита - это уже "рваные" данные. Да, они влезут в 2 регистра, но это удвоение количества инструкций, зависимостей и промахов планировщика. В движке, где это вычисляется миллионы раз за кадр (в Radiosity-лучах), такая разница - это приговор производительности.
> А это отдельная тема дискуссии. Я баловался с похожим в детстве, пришел к выводу что если реакция описывается дискретными понятиями (как в твоих примерах), то ничего высокохудожественного не получится. Максимум можем существующее произведение описать (потеряв ньюансы).
Вот здесь ты и ошибаешься. Ты путаешь названия узлов с их состоянием.
То, что ты видишь в логе слова love или death - это просто способ вывода данных для человека. Внутри системы состояние агента - это непрерывное 8-мерное октонионное пространство (которое я уже расширяю на би-октонионы и седенионы, чтобы сделать поведение агентов еще ближе к правдоподобию, но сейчас это не главное).
Это рождает историческое сознание. Сильвана впадает в кому не потому, что я написал \(if (undead + family) collapse()\), а потому, что произведение октонионов в её истории привело к аннигиляции скалярной части. Это чистая эмерджентность.
Агенты в MagnaVerse - это не дискретные автоматы состояний, которые мы с тобой могли писать в прошлом. Это аналоговые волны, которые мы для удобства называем словами. Но "высокохудожественность" там возникает именно из-за того, что система сама выдает реакции, которые я, как автор, не могу заранее предсказать, но могу математически обосновать. И да - я работаю над тем, чтобы агенты не "падали духом" из-за слагающих их противоречий и были способны на комплексные сочетания смыслов, порой даже противоречивых, поскольку никто из реальных людей не идеален и каждый полнится противоречивыми качествами, что в конечном итоге дает каждому из людей не черно-белый, а довольно пестрый окрас характера.