NVIDIA cuPhoton.xBeam переносит корреляцию данных интерферометрии чёрных дыр на GPU
Public- 14 Nov, 2026

Чтобы снять чёрную дыру, нужно разглядеть крошечный объект: наблюдаемое кольцо M87* занимает всего 42 микросекунды дуги. Телескоп горизонта событий (EHT) объединяет 13 радиостанций, в том числе на Гавайях, в Чили, Испании, Мексике и на Южном полюсе, методом интерферометрии со сверхдлинными базами (VLBI). Каждая станция записывает две поляризации со скоростью до 64 Гбит/с, и в итоге набираются петабайты данных о напряжении. Корреляция пар телескопов даёт видности. Это разреженные фурье-выборки яркости неба вдоль треков, которые прочерчивает вращение Земли. По этим выборкам алгоритмы реконструкции решают обратную задачу. С переменными источниками вроде Sgr A*, которые меняются прямо во время сеанса наблюдений, задача становится ещё сложнее. В EHT следующего поколения (ngEHT) планируют добавить новые станции, чтобы улучшить качество изображений и следить за изменениями во времени.

NVIDIA cuPhoton.xBeam - это FX-коррелятор на GPU. Из сырых записей он получает по одной комплексной видности на каждую пару станций, частотный канал и короткий интервал времени. Коррелятор создан вместе с Гарвард-Смитсоновским центром астрофизики и обсерваторией MIT Haystack. На системе NVIDIA Vera Rubin NVL72 он обработал набор данных объёмом 10 ТБ за 70 секунд. Для этого понадобились 64 GPU и GPUDirect Storage в режиме совместимости. Это примерно в 460 раз быстрее, чем на x86-процессоре: там ушло 31 992 секунды, то есть 8,89 часа. Последующие калибровка и построение изображений, например трёхмерные модели газа на основе гауссова сплаттинга, в cuPhoton не входят. Задержки по координатам станций xBeam не вычисляет и пути света не трассирует. Результаты сверяются с открытым CPU-коррелятором DiFX, а на выходные данные рассчитаны такие инструменты, как HOPS, rPICARD и eht-imaging.

Конвейер состоит из пяти этапов. На этапе приёма каждый кадр VDIF ставится на своё место во времени. Рядом создаётся файл.vdix, который индексирует кадры по метке времени, потоку и физическому расположению, не копируя сами данные. Пропущенные и некорректные данные при этом явно отмечаются. На этапе коррекции задержки и фазы интерференции данные до FFT выравниваются с точностью до целого отсчёта, и к ним применяется вращение фазы интерференции. Оставшуюся дробную задержку компенсирует частотно-зависимая поправка фазы.
Задержка берётся из файла задания. Она складывается из геометрического полинома вокруг t0, смещения и дрейфа часов каждой станции и смещения часов для каждого диапазона. В пределах одного FFT задержка может быть постоянной, линейной или параболической: это задаёт параметр fringe_approximation_order (0, 1 или 2). На этапе разбиения на каналы для каждой станции выполняется FFT. На этапе перемножения с накоплением спектр одной станции умножается на комплексно-сопряжённый спектр другой. Некорректные входные данные маскируются, а результат нормируется по весам экспозиции. На выходе получается формат DiFX SWIN или xbeam-v1.
Версия 0.1.3 принимает нормализованное задание в JSON (версия схемы 1) или поддерживаемый файл DiFX.input. В нём перечислены станции, часы, частоты, потоки данных VDIF, базы и сканы. Выходной каталог должен быть новым. Команда cuphoton xbeam inspect-vdif RECORDING.vdif --json читает только заголовки. Команда build-vdif-sidecar с параметрами --index-dir, --backend cufile (или posix, если GPUDirect Storage нет) и --devices создаёт индексы для повторного использования, а исходные файлы не меняются. Команда cuphoton xbeam correlate JOB.json с --backend cupy запускает корреляцию на GPU. По умолчанию данные читаются через POSIX в закреплённую память хоста, а с --vdif-io cufile - через GPUDirect Storage. Среди параметров есть --scan, --first-integration и --integration-count. Из Python можно вызвать load_job и correlate с CorrelationWindow и получать записи по одной, но запись в SWIN доступна только из CLI.
Для записей с пропусками есть профиль --profile interop-real-usb-buffered-window-replay-v1. С ним отсчёты внутри сохранённого буфера продолжают считываться с прежней привязкой по времени, пока не появится новая опорная точка. Профиль также определяет, какие блоки FFT учитываются и как отображаются веса. Потерянные отсчёты он не восстанавливает, и полный вес не гарантирует полноту данных. Без профиля кадры выравниваются по меткам времени в заголовках, а пустые слоты помечаются как некорректные, поэтому видности и веса могут отличаться. При масштабировании скан делится по времени. На одном узле --devices 0,1,2,3 запускает по процессу на каждый GPU, пишет результаты в RUN/shards/ и объединяет их. На нескольких узлах каждый процесс получает --shard-count и --shard-index, например 64 и индексы 0-63, с одинаковыми настройками сканов и интеграций. Затем merge-shards собирает частичные результаты SWIN воедино.


