Массив популяций занимает nx*ny*9*4 байта и показывался шейдеру одной привязкой.
dzn объявляет max_storage_buffer_binding_size = 128 МиБ, поэтому потолок выходил
3.73 млн узлов: 14 прогонов кампании из 115 падали на создании bind group, а на
них приходится 70.7% её стоимости.
Ограничена при этом ровно привязка: max_buffer_size у dzn 2047 МиБ. Поэтому тот
же буфер теперь показывается девятью привязками, по одному направлению в каждой,
и потолок поднимается до 33.5 млн узлов — самая крупная сетка кампании
(4096x4096, 16.8 млн) проходит с запасом.
Как устроено:
* шаг между направлениями выровнен на 256 байт (dir_stride), потому что смещение
привязки обязано быть кратно min_storage_buffer_offset_alignment;
* обращения к популяциям в WGSL идут через fget/fset/pget/pset, а их тело
генерируется под вариант (build_shader);
* вариант выбирается по max_storage_buffer_binding_size адаптера — где предела
нет, собирается прежний общий, без switch в аксессорах;
* KBC2D_SPLIT_POPULATIONS=1 включает раздельные принудительно: иначе сверить два
варианта на одной карте нечем.
Проверено:
* на одном драйвере оба варианта дают одно и то же — Cd 2.39486, energy_end
5.74813e-05; раздельный стоит 5.7% пропускной способности;
* на сетке 2048x2048, где раздельные привязки и нужны, нативный прогон против
контейнерного: energy_end расходится на 2.4e-07, enstrophy_end на 1.3e-07;
* preflight в контейнере: 115 сценариев из 115, ни одного отказа (было 14);
* 29 собственных тестов решателя зелёные.
Образ опубликован как notbigghost/kbc2d:1.2.0 (он же latest).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
В WSL2 драйвера Vulkan для Linux у NVIDIA нет: карта отдаётся через /dev/dxg по
протоколу WDDM, нативный libGLX_nvidia про него не знает и перечисляет ноль
устройств, поэтому Container Toolkit нечего подкладывать внутрь и docker падает
с `could not select device driver "nvidia"`.
С /dev/dxg умеет говорить dzn (Dozen) — драйвер Mesa, транслирующий Vulkan в
D3D12. Он положен в образ, и NVIDIA-runtime для этого пути не нужен вовсе: нужны
проброс устройства и монтирование /usr/lib/wsl, где Microsoft держит libd3d12.so.
Правка в решателе одна: флаги инстанса wgpu теперь читаются из окружения
(InstanceFlags::from_build_config().with_env()). Без этого переменная
WGPU_ALLOW_UNDERLYING_NONCOMPLIANT_ADAPTER не действует, а wgpu по умолчанию
МОЛЧА прячет адаптеры, не прошедшие тесты соответствия Vulkan, — под это правило
попадает dzn, и решатель сообщал, что GPU не найден. Поведение по умолчанию не
изменилось: без переменной такие адаптеры по-прежнему скрыты.
База образа сменена с debian:bookworm-slim на archlinux:base: в пакетах Mesa у
Debian и Ubuntu dzn не собирают (проверено по спискам файлов), в Arch он лежит
отдельным пакетом той же версии Mesa, что и на хосте WSL.
Новое:
* docker-compose.wsl.yml — путь через /dev/dxg, с профилем проверок и с build:
на случай, когда доступа к реестру нет;
* bench/parity.py — сверка GPU-пути с CPU в f64 на течениях, где расхождение
f32 и f64 не нарастает. Соответствие dzn вендором не проверено, значит
проверяем сами, а не верим на слово.
Замерено на Intel Iris Xe (та же карта, нативный драйвер против dzn):
* точность: cd 2.39486 против 2.39486, energy_end 5.74813e-05 против
5.74810e-05 — совпадение до 5-6 значащих цифр;
* скорость: плата за трансляцию падает с ростом сетки, 4.2x на 61 тыс. узлов,
1.46x на 461 тыс., 1.30x на 1.84 млн. На 95.1% стоимости кампании сетки
крупнее 600 тыс. узлов, поэтому ожидаемое удорожание — около трети, не в разы.
В калибровку добавлена сетка 1920x960: оценивать кампанию по 240x120 значит
занижать пропускную способность вчетверо. Образ опубликован как
notbigghost/kbc2d:1.1.0 (он же latest), проверен вытягиванием из реестра.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>