Современные алгоритмы высокопроизводительной визуализации научных данных В презентации использованы материалы доклада Parallel Data Visualization Challenges (Dr. Jean M. Favre) Березин С.Б. ВМК МГУ
О сложности задачи процессоров 12500x12500x12500 точек Динамический процесс!
Требования к визуализациям Цель визуализации – позволить исследователю проникнуть в суть данных (insight into data) Интерактивность Работа с громадными наборами данных Отсутствие искажений (HiFi) Изменяющиеся во времени данные
High fidelity display Каждая точка может быть важна - необходимо просмотреть весь набор данных
Визуальный конвейер Источник данных Преобразование данных Отображение данных в 2D/3D пространство Построение изображения - должен удовлетворять ряду требований - важно не потерять особенные точки - почти все уже придумано... - с применением современных GPU
E 1 S – Line graph
E 1 nS – Line/Marker graph
E 1 3S – Scatter Plot / Набор точек
E 1 3S – Диаграммы Вороного
E 2 S -Carpet plot / colormap
E 2 S – Contour plot
E 2 V2 – Vector glyphs + colormap
E 2 V2 – Stream lines / Линии тока
E 2 V2 – Line integral convolution Imaging Vector Fields Using Line Integral Convolution Brian Cabral, Leith (Casey) Leedom, SIGGRAPH '93
E 2 S – Surface view
E 3 S – Изоповерхности
Метод марширующих кубов
E 3 S – Volume rendering
E 3 4S – Point cloud
E 3 4S – Ячейки Вороного
E 3 T3,3 – Glyph plot
E 3 V3 – Hedgehog (Glyph plot)
E 3 V3 – Streamlines / Streamribbons
E 3 T3,3 – Hyper streamlines
Примеры композитных визуализаций
Последовательный доступ к данных Рисование графика функции (line plot ) BeginPolyline() while(not eof) { x = read float y = read float AddPoint(x,y) } EndPolyline()
Последовательный доступ к данным Рисование цветовой карты (colormap) for(y = 0;y < h;y++) for(x = 0;x < w;x++) { v = read float PutPixel(x,y,Palette(v)) }
Палитра: отображение значения в цвет Функции Palette нужны max и min Функция Palette вызывается уже для первого пиксела Выводы: Перед рисованием карты цветов нужно найти max/min Просмотреть весь набор данных последовательно или Взять max/min из метаданных или Определить max/min из типа величины (метаданные)
Метаданные: атрибуты набора данных Набор пар (словарь) climatological_bounds = clim_bounds missing_value = -999 name = wet_day_frequency units = days long_name = Wet day frequency cell_methods = latitude: point longitude: point time: mean within years time: mean over years
Построчный доступ Рисование изолиний: row0 = read row for(y = 1;y < h;y++) { row1 = read row for(x = 0;x < w;x++) { drawcell(row0,row1,x,y) } row0 = row1 } r0 r1 r0 r1
Послойный доступ Рисование изоповерхности: y = 0 s0 = read slice y for(y = 1; y < h; y++) { s1 = read slice y for(x = 0; x < w; x++) for(z = 0; z < d; z++) drawcell(s0,s1,x,y,z) s0 = s1 } y z x s0 s1 s0 s1 s0 s1 Здесь завершается возможность стриминга
Прозрачность: вывод данных back-to-front А B А B B,A А,B X=0,1,2,…,N-1 y z x X=N-1,N-2,…,0 Depth peeling все же разрешает вывод в произвольном порядке
Произвольный доступ Рендеринг объемных данных: for(px=0;px
Произвольный доступ
Визуализация на сечениях: y z x Hyberslabbing
Требования к источникам данных Поддержка работы с метаданными Эффективные операции чтения по частям и hyperslabbing Array read(int[] origin, int[] stride, int[] shape) read({3,3},{2,2},{3,3}) -> double[3,3] Эффективные операции записи с возможным увеличением размера массива NetCDF: HDF:
Методы повышения интерактивности Уменьшение детализации сцены на время активного взаимодействия с пользователем Создание высокодетализированного изображения в фоновом потоке Plot 64x64x64 Запуск второго потока Ожидаем действий пользователя Остановка второго потока N=128 Plot NxNxN Рисуем изображение N < M N=N * 2
Методы увеличения производительности Фильтрация данных, чтение и отображение только части точек (количество точек > количества пикселей) Можно потерять часть интересных значений! Применение параллельных вычислений Графические процессоры параллельны по своей природе Разделение задачи визуализации между вычислительными узлами Sort first: выделяет каждому вычислителю свою часть экрана -> разбиение данных Sort last: выделяем каждому узлу свою часть данных -> объединение изображений
Sort first Разбиение экранной плоскости определяет разбиение данных Идеален для 2D графики (тайловый подход) В 2D эффективно распараллеливается В 3D возможно пересечение наборов данных на узлах В 3D распределение данных по узлам зависит от положения наблюдателя (view frustum)
Sort last Распределение данных по узлам первично Каждый узел строит изображение своей части данных Нет проблем с непрозрачными объектами Требуются нетривиальные алгоритмы для прозрачности Возможны проблемы сшивки данных В некоторых случаях все равно требуется перераспределение данных по узлам
Методы повышения интерактивности Уменьшение детализации сцены на время активного взаимодействия с пользователем Создание высокодетализированного изображения в фоновом потоке Plot 64x64x64 Запуск второго потока Ожидаем действий пользователя Остановка второго потока N=128 Plot NxNxN Рисуем изображение N < M N=N * 2
Очень неудачный пример записи данных FILE *out = fopen(grid.txt,w); for(int j=0;j
Иерархические источники данных Карты Virtual Earth, Google Maps Mipmapping в OpenGL/DirectX Произвольные источники данных Размер увеличивается меньше, чем на 50%: 1 + ¼ +1/8 + 1/16 + ….
Блочные (сhunked) массивы Линейное представление массивов Блочное представление массивов
Зависимость скорости доступа от размера блока
Материалы по теме Учебный курс по визуализации (со слайдами): Dr. Jean M. Favre. Parallel Data Visualization Challenges ParaView software Scientific Data Management in the Coming Decade
NetCDF 3