|
194 / 29 / 5
Регистрация: 11.04.2015
Сообщений: 735
|
||||||||||||||||||||||||||||||||||||
Неэффективный "графический анализ"07.06.2025, 05:37. Показов 1587. Ответов 16
Метки нет (Все метки)
Всем доброго времени суток!
Прошу консультации уважаемых экспертов в области графического анализа с использованием OpenGL. Не по теме: Хотя, как я понял, я столкнулся с какой-то общей проблемой, связанной с оптимизацией, только я не могу понять, что именно я делаю "неэффективно". Я постараюсь описать задачу абстрактно, поэтому могут иметь место некоторые недосказанности. Также я буду отсылаться к картинке, которую приложу. Итак, задача. Имеется некоторое плоское поле, ограниченное минимальными и максимальными координатами X и Y. В пределах этого поля заключена некоторая "непрерывная информация". В том же пространстве, но не обязательно только в пределах поля, рассчитывается сложная траектория (кривая Безье) по некоторым опорным точкам. Необходимо (быстро) выяснить, какую "информацию" обрабатывать нужно, а какую - нет. Что за "ифномрация" требует обработки - не суть - но необходимо сказать, что "аналитическая" обработка этой информации по отношению к новопостроенной кривой - смэрть с точки зрения необходимого времени (или вычислительных ресурсов). К тому же, слоёв это "непрерывной информации" может быть много, и они несовместимы по смыслу; "информаиця" меняется чрезвычайно редко или не меняется вообще (относительно требуемого времени анализа). Точность в рамках этой задачи вторична - выяснение тенденций гораздо важнее, поэтому вот что мной было придумано для решения задачи: 1. растеризация поступившей "информации" - она может быть легко представлена в графическом виде, и особенно, с точки зрения слоёв (получается эдакая 3D-текстура); 2. использование конвейера OpenGL для рисования нужных кривых прямо поверх созданной 3D-текстуры с целью "прямого анализа" - на вход вершинного шейдера поступают все данные о текущей кривой, геометрический шейдер её рассчитывает и передаёт дальше получившуюся ломаную, а фрагментный шейдер смотрит, какие пиксели участвуют в расчёте, сразу вызывает нужную информацию из всех слоёв 3D-текстуры, обрабатывает её, и распихивает по SSBO, из которых я буду производить чтение результатов. В целом, всё описанное выше изображено слева на картинке (зелёным - группа кривых Безье). На первый взгляд кажется, что всё просто и быстро - бери, да делай. Но, разумеется, есть нюансы. Чтобы я мог проворачивать вышеописанную схему, необходимо, чтобы OpenGL растеризовал кривую на буфере (FBO) такого же размера, что и 3D-текстура. Растеризованная "информация" может быть огромных размеров - на картинке, в качестве примера, я привожу размеры в 108554 на 91210 пикселей - это средний случай. FBO же, в свою очередь, не может быть больше, чем 32768 пикселей по любому из измерений. Выход - резать 3D-текстуру на "слоёные блоки" одинакового размера, но не более 32768. (Также OpenGL не любит нечётные размеры текстур.) Для приведённого на картинке случая, "крупное" изображение поделено на 12 равных частей, и FBO, на стадии создания шейдерной программы, получит именно такой размер. Теперь я могу полностью написать программу, делающую то, что мне нужно; и я написал. И работала она плоховастенько - в диспетчере задач я видел долгие простои GPU между пиками нагрузки и какие-то скачки на 12 Гб в ОЗУ в те же моменты времени. Я почитал документацию OpenGL и понял, что резервировать память под все слои "части изображения" при помощи
Я перешёл на PBO и создал кольцевой буфер на 2 звена (а также сопутствующие объекты синхронизации и прочее, прочее). Это привело к тому, что GPU теперь практически никогда не простаивает, но! Если я искусственно сделаю так, что я смогу загрузить всю "информацию" в память GPU за один раз - на этапе инициализации - и в расчётном цикле просто её использовать, не подгружая и не анализируя "по частям", то PBO-реализация работает медленнее (в разы), чем упомянутая ранее "первая реализация", даже если вся "информация" весит 250 Мб. Ну не может копирование занимать столько времени - следовательно, проблема в управлении. Кроме того, всё это дело ещё любит падать либо на этапе синхронизации:
Я понимаю, что весьма сумбурно описал ситуацию, но я и не рассчитываю, что кто-то решит проблему за меня - я хотел бы, чтобы кто-нибудь смог направить меня в нужную сторону, подсказав какие-то общие принципы, которых необходимо придерживаться при реализации подобного механизма. Очевидно, я как-то неправильно работаю с памятью, но а как правильно-то? В спецификациях пишут общие правила, то и дело упоминая полуопасный функционал, который "должен чётко контролироваться разработчиком" (там было что-то про буферы, за которыми перестаёт следить драйвер по требованию программиста, потокоые буферы и ручную синхронизацию). Я буду невероятно благодарен за любую помощь, советы и подсказки! Спасибо! P.S. Я вообще не против заморочиться и сделать предельно эффективно - но я правда не понимаю, куда двигаться. Программа то падает, то работает при условиях, в которых падала всегда без исключений, то шлёт неверные данные, хотя раньше такого не было, то монитор отрубается до перезагрузки после запуска теста (а компьютер продолжает себе работать - то есть, я руками поломал что-то в памяти GPU).
0
|
||||||||||||||||||||||||||||||||||||
| 07.06.2025, 05:37 | |
|
Ответы с готовыми решениями:
16
Анализ изображения Анализ и теория работы программного кода редакторов ищу графическую библиотеку |
|
2619 / 1630 / 266
Регистрация: 19.02.2010
Сообщений: 4,327
|
|||
| 07.06.2025, 09:35 | |||
|
"Информацию", думаю, вполне можно менять (хотя-бы "рабочую копию" некоторого исходного массива этой информации). В сторону дискретизации ПО ЕЁ ЗНАЧЕНИЯМ, т.е. изменять каждое исходное значение в сторону приближения к одному или другому заранее вводимому "порогу". А далее, после некоторого числа шагов итерирования некоторой общей (на всём многомерном "поле информации") "функции потерь", кидаем каждый пиксел, в соответствии с его изменённым значением, в один или другой набор (требующий или не требующий дальнейшей обработки). И работать тут (менять значения данных на входе модели) - градиентной оптимизацией. Аналитика не нужна - нужна только возможность быстро вычислить градиент некоторой "функции потерь" по входам модели (и, м.б., учесть и прочие ограничения). А на этом принципе (быстрое = максимально параллельное вычисление градиента сложной функции) уже 40 лет как основываются современные нейросетки. Там вычисление каждой отдельной производной - не по отдельной заранее и явно выписанной формуле делается (и не численно - не конечными разностями). Ещё возможная фишка - вместе с изменением/коррекцией входных данных оптимизировать ещё и саму модель (значения каких-то коэффициентов в ней). Т.е. уже смешанная задача (прямая+обратная сразу). Ну и "я не тактик - я стратег" (С) анекдот. В смысле - я предложил просто идею, не привязываясь ни к какому способу софтовой или аппаратной реализации. Т.е. про ОпенЖЛ я тут даже и не думал ни капли.
0
|
|||
| 07.06.2025, 16:29 | ||
|
Надеюсь понимаю как не нужно вываливать все подробности/специфику задачи до которых, в общем, никому нет дела. "Это мое дело что/как я считаю" - нормальный подход. Но тогда не вполне ясно что Вы хотите обсудить. Предлагаю считать "как организовать/хранить (массивные) 3D данные в объеме". Если нет - поправьте Мое личное мнение: 3D текстура - дело гиблое. Вы всегда будете в соплях и с зависшей машиной, ужасными свопами и.т.д. Сама идея прямолинейно хранить объем порочна. Нужно искать др подходы. Посмотрите OpenVDB, может подойдет
1
|
||
|
194 / 29 / 5
Регистрация: 11.04.2015
Сообщений: 735
|
|||||||
| 08.06.2025, 22:33 [ТС] | |||||||
![]() Это довольно новая (для меня) задача, которая, вообще говоря, решена, но есть проблемы, о которых я и пишу. По поводу следующих четырёх абзацев - я понимаю, о чём Вы говорите, но моя текущая задача связана с применением генетического алгоритма (далее - ГА), в котором для каждой итерации необходимо решить прямую задачу по "оценке" ткущего получаемого решения, чтобы знать, куда двигаться дальше. Если Вам бы хотелось, чтобы я накинул конкретики, то я могу. Какое-то время тому назад я писал, в другую ветку форума, про задачу о пересечении ортодромии и ортодромического полигона - там требовалось найти точную дистанцию их пересечения. Тогда было высянено, что функции быстрее, чем то, что я делал, создать невозможно; на этом я и успокоился - функция и правда работает быстро - десятки микросекунд на один вызов (в самом "простом" случае). Так вот. Моя новейшая реализация ГА предусматривает, чтобы, в наименее нагруженном случае, за одну итерацию я исследовал пересечение не менее ста тысяч ортодромий с не менее, чем 1000 ортодромических полигонов. Если использовать ту "аналитическую" реализацию (возьмём 70 мкс на вызов в среднем), то в лучшем случая одна итерация, совершённая на каком-нибудь R9 9950X (на всех ядрах), потребует ~438 секунд, и это кошмар. Теперь мы можем вернуться к теме этого вопроса ![]() Я подумал: "у меня есть ортодромические полигоны, но ведь у меня может быть нечто получше - РИСУНОК ортодромических полигонов". Получить такой рисунок довольно легко - это и есть "информация". Дальше я создал реализацию алгоритма Брезенхема, чтобы с её помощью просто рисовать ортодромии прямо на рисунке полигонов, превращая пиксели в дистанцию пересечения. Такой подход не только ускоряет процесс в десятки раз, но и позволяет контролировать точность вычислений через размер изображения полигонов. Естественно, ~20 секунд на одну итерацию это гораздо лучше, чем 438, но это и самый ненагруженный случай. В самом нагруженном и здесь получается от 300 секунд. Очевидный выход - использовать аппаратную растеризацию - на вход шейдерной программы я подаю кучу ортодромий (каждая - пара точек) и загружаю текстуру с полигонами, и оно там через атомарный счётчик заполняет SSBO, вычисляя "пиксельную дистанцию" внутри фрагментного шейдера (а пара точек превращается в ломаную в геометрическом шейдере). А в общем, всё так, как я и писал в начале. Таким образом, здесь нет сценария, о котором Вы писали. И не было бы печали, если бы не описанные мной проблемы со стабильностью программы и не отсутствующие оптимизации по использованию памяти ![]() Добавлено через 17 минут Но, я надеюсь, некоторых пояснений из сообщения выше будет достаточно, поскольку добавить-то уже почти и нечего. Только сам проблемный код, но он потребует комментариев, конечно.Не по теме: Не простой жизни ради я выбрал C++ :D
0
|
|||||||
| 09.06.2025, 17:59 | ||||
|
По поводу 3D текстуры. Делал аж одну задачу Но впечатления самые неприятные. При каком-то разумном объеме данных рез-т очень бедный, смотреть не на что. А при попытке использовать больший объем быстро получал по рогам, начинается пыхтение и натужность. И еще: современные рендеры работают с объемом, но 3D текстуры там совсем не популярны. Полигон - это планарный N-угольник, на практике часто 3 или 4-х угольник (больше напрямую не рендерят), а иногда упрощается до пошлого "только треугольники!". Полигон обычно задается индексами в массиве вертексов/атрибутов (значения в углах должны быть известны). Также не утверждается, но обычно подразумевается что полигоны образуют некую поверхность, каждое "ребро" шарится 2-мя полигонами. И вот Вы вылазите со своей "ортодромией", и это вызывает смятение. Верно ли я понимаю базовую сущность "полигон" в данном случае/контексте? А может "ортодромический" - это уже совсем иное? Та ну его, лучше с этим не связываться.И наконец совершенно непонятно за каким <T> привлекается такая мутная вещь как 3D текстура? Полигоны в несколько слоев? Что вообще с вертексами? Они на поверхности сферы или как? Не по теме: Подумайте как сформулировать задачу не влезая в дебри технических подробностей. По себе замечал что часто это оказывается (гораздо) полезнее чем ответы/рекомендации
0
|
||||
|
194 / 29 / 5
Регистрация: 11.04.2015
Сообщений: 735
|
||||||
| 09.06.2025, 18:33 [ТС] | ||||||
|
0
|
||||||
|
Модератор
|
|||
| 09.06.2025, 22:47 | |||
|
0
|
|||
|
194 / 29 / 5
Регистрация: 11.04.2015
Сообщений: 735
|
||
| 10.06.2025, 01:32 [ТС] | ||
atomicAdd над типом float. Жаль только, что Qt не даёт создать контекст версии >4.5, так что боремся с переполнением int'а как можем
0
|
||
| 10.06.2025, 06:00 | ||||||||
). Придется приложить больше усилий чтобы рисовать квадранглы, не меняя при этом базовые данные. Приходится заряжать геометрические шейдеры что принимают 4 вертекса (lines_adjacency) и выдают 2 triangle (phong) или 4 lines (wireframe).Кстати/к слову. GL_QUADS тупо рисовал квадрангл как 2 треугольника, это было хорошо заметно при цвете вертексов. Поэтому такой вопросик
Добавлено через 1 час 37 минут
В общем, у меня стойкое впечатление что не должно оно быть так сложно, развесисто. Перемудрили
0
|
||||||||
|
194 / 29 / 5
Регистрация: 11.04.2015
Сообщений: 735
|
|||
| 10.06.2025, 18:46 [ТС] | |||
GL_TEXTURE_2D_ARRAY, что, как я понял, невполне 3D-текстура.Мудрю, согласен полностью, но всё это не из спортивного любопытства. Да и, де-факто, не такая уж и сложная машинерия выходит.
0
|
|||
| 10.06.2025, 21:40 | |
|
Откуда вообще текстуры, геом шейдер и др? Почему не просто пересечение самых обычных полигонов с секущей плоскостью? И свести (злосчастную) ортодромию к проекции на сферу найденных точек пересечения, точно подсчитать длину дуги.
0
|
|
|
194 / 29 / 5
Регистрация: 11.04.2015
Сообщений: 735
|
||
| 12.06.2025, 18:05 [ТС] | ||
|
В конце концов, вопрос-то мой в другом был
0
|
||
| 13.06.2025, 13:53 | ||
|
По поводу Ваших вылетов/падений. Я бы отключил весь код SSBO, падает ли на таком "холостом ходу"? Если собака порылась там, то один из возможных путей: скачать примеры (OpenGL Examples), найти/собрать пример с SSBO и погонять его. Дальше видно будет
0
|
||
|
194 / 29 / 5
Регистрация: 11.04.2015
Сообщений: 735
|
|||
| 13.06.2025, 19:26 [ТС] | |||
Я правда не вижу иного выхода.Также я нашёл источник регулярных падений - оказывается (уже дежурное слово у меня) GPU не нравится, когда размер фреймбуфера (или загружаемой текстуры - я не понял) не делится на "4", то есть, "не выровнен"; пришлось находить и применять _glFuncs->glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - регулярные падения прекратились полностью.Однако я нашёл одну вещь, природу которой понять не могу - (пример) - если я работаю с изображением с размерами 26760*27000, то всё идёт "по плану" (выходят какие-тозначения, отличающиеся от истинных на разумный %), но если я меняю размеры на 26750*27000 (-10 пикселей по ширине), то из SSBO я считываю какую-то шляпу - значения начинают отличаться от истинных в 67 раз! В этом тесте я передаю лишь одну ортодромию и одно изображение (и то - при инициализации), поэтому влияние "гонки данных" и прочего устранено. Если же во фрагментном шейдере я настрою атомарный счётчик на выяснение числа обработанных пикселей, то окажется, что их число меняется сообразно изменениям размеров изображения (+/- 5 пикселей). Вы, случайно, не сталкивались с таким?
0
|
|||
| 14.06.2025, 13:47 | |||
|
Не по теме: Еще момент. Как я понял, Вас интересуют "все полигоны пересекаемые дугой". Подозреваю что на этом дело не кончается (обычно так бывает), и последующие расчеты опять потребуют GPU. Об этом стоит подумать/позаботиться
1
|
|||
|
194 / 29 / 5
Регистрация: 11.04.2015
Сообщений: 735
|
|||||
| 15.06.2025, 01:05 [ТС] | |||||
glDispatchCompute()), который, "почему-то работает ТАК долго". Узнав это, я, конечно же попробовалdouble в аналитических методах, а GPU этого не любят, как тогда я и выяснил. Как результат - около 100 секунд на NVidia A100 - да, это не час, как на CPU, однако ну что это такое? И это формулы для "Земли-шара", где расчётов, де-факто, не так уж и много.
0
|
|||||
| 15.06.2025, 02:22 | |
|
0
|
|
| 15.06.2025, 02:22 | |
|
Помогаю со студенческими работами здесь
17
OpenGL, редактирование графического файла сколько будет весить графический файл размером 1024x1024 пикселей, кодированный без сжатия с использованием палитры из 65536 цветов Графический интерфейс Библиотека графических примитивов. Отдаю всем хорошим людям - не жалко Отбивание графических примитивов от краев окна Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|