Nano Hash - криптовалюты, майнинг, программирование

ios games — Есть ли недостатки в вычислениях на стороне графического процессора?

Тема - это почти вопрос. Я пытаюсь понять, как работает взаимодействие процессора и графического процессора.

Я разрабатываю свою игру через cocos2d. Это игровой движок, поэтому он перерисовывает весь экран 60 раз в секунду. Каждый узел в cocos2d рисует свой собственный набор треугольников. Обычно вы устанавливаете вершины для треугольника после выполнения преобразований узла (из узла в мир) на стороне процессора. Я понял, как сделать это на стороне графического процессора с помощью вершинных шейдеров, передав проекцию модели представления в униформы.

Я вижу, что время процессора уменьшается на ~ 1 мс, а время графического процессора увеличивается на ~ 0,5 мс. Могу ли я считать это приростом производительности?

Другими словами: если что-то можно сделать на стороне графического процессора, есть ли причины, по которым вам не следует этого делать?

01.12.2015

  • Если что-то можно делать снова и снова с одним и тем же состоянием ввода, очень полезно настроить все и выполнять это снова и снова. Но в случае, когда просто настроить что-то для выполнения на графическом процессоре — это много работы по сравнению с выполнением вычислений на центральном процессоре, вы не получите многого. Рендеринг изображений и видео — хороший пример, который может действительно выиграть от экспорта операций записи в память на GPU вместо CPU. Существует реальная выгода, когда многие операции могут выполняться одновременно и параллельно. Например, см.: stackoverflow.com/a/38679128/763355 27.10.2016

Ответы:


1

Единственный раз, когда вы не должны что-то делать на стороне графического процессора, это если вам нужен результат (в легко доступной форме) на стороне процессора для дальнейшего моделирования.

Взяв твой пример. Предположим, у вас есть 4 сетки по 250 КБ, которые представляют собой иерархию частей тела (как скелет). Предположим, вы используете матрицу с плавающей запятой 4x4 для преобразований (64 байта) для каждой сетки. Вы можете:

  1. В каждом кадре выполняйте вычисления преобразования сетки на стороне приложения (ЦП), а затем загружайте четыре сетки в ГП. Это приведет к отправке около 1000 КБ данных на графический процессор за кадр.

  2. Когда приложение запустится, загрузите данные для 4-х сеток в GPU (это будет в позе покоя/идентификации). Затем в каждом кадре при вызове рендеринга вы вычисляете только новые матрицы для каждого меша (положение/поворот/масштаб) и загружаете эти матрицы в GPU и выполняете преобразование там. Это приводит к тому, что на GPU за кадр отправляется ~256 байт.

Как видите, даже если данные в примере сфабрикованы, основное преимущество заключается в том, что вы минимизируете объем данных, передаваемых между ЦП и ГП для каждого кадра.

Единственный случай, когда вы предпочтете первый вариант, — это если вашему приложению нужны результаты преобразования для выполнения какой-либо другой работы. Графический процессор очень эффективен (особенно при параллельной обработке вершин), но получить информацию от графического процессора не так уж просто (и тогда она обычно представлена ​​в виде текстуры, т. е. RenderTarget). Одним из конкретных примеров такой «дальнейшей работы» может быть проверка столкновений в трансформированных позициях сетки.

редактировать Вы можете сказать, основываясь на том, как вы вызываете API openGL, где в некоторой степени хранятся данные*. Вот краткое изложение:

Массивы вершин

glVertexPointer(...)
glDrawArray(...)

используя этот метод, передавая массив вершин из CPU -> GPU в каждом кадре. Вершины обрабатываются последовательно по мере их появления в массиве. Существует вариант этого метода (glDrawElements), который позволяет указывать индексы.

ВБО

glBindBuffer(...)
glBufferData(...)
glDrawElements(...)

VBO позволяют хранить данные сетки на графическом процессоре (примечание см. ниже). Таким образом, вам не нужно отправлять данные меша в GPU в каждом кадре, только данные преобразования.

*Хотя мы можем указать, где должны храниться наши данные, в спецификации OpenGL фактически не указано, как поставщики должны это реализовать. Это означает, что мы можем подсказывать, что данные наших вершин должны храниться в VRAM, но в конечном итоге это зависит от драйвера!

Хорошие справочные ссылки для этого материала:

Справочная страница OpenGL: https://www.opengl.org/sdk/docs/man/html/start.html

Объяснения OpenGL: http://www.songho.ca/opengl

Концепции Java OpenGL для рендеринга: http://www.java-gaming.org/topics/introduction-to-vertex-arrays-and-vertex-buffer-objects-opengl/24272/view.html

01.12.2015
  • Спасибо! отмечу как ответ. Я никогда не слышал о загрузке данных в GPU. Я копирую каждый кадр. Можете ли вы предоставить какие-либо ссылки для меня, чтобы я мог прочитать о том, как загрузить данные в GPU? 01.12.2015
  • Я расширил ответ о том, как хранятся данные. 01.12.2015
  • Спасибо! Сделал +1 за это. 01.12.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..