Ответы:
Вообще говоря: сетчатые преобразования выполняются на GPU. Вы отправляете матрицу преобразования в графический процессор, и шейдер применяет ее ко всем вершинам сетки.
Использование графического процессора для вычисления самой матрицы - это совсем другое дело, и на самом деле оно медленнее в графическом процессоре, поскольку существует очень много сохраненных значений, которые меняются от кадра к кадру, что необходимо для определения окончательной матрицы преобразования. Отправка этих данных в CPU и из CPU - GPU работает медленно. Кроме того, на CPU вычисления выполняются один раз, тогда как на GPU они будут выполняться для каждой вершины.
Многие геометрические преобразования могут быть выполнены на процессорах без графического процессора, однако необходимо учитывать целевую платформу. Ваш пробег будет варьироваться в зависимости от целевой платформы и узких мест этой платформы.
Одним из соображений является пропускная способность шины между устройством, которое генерирует геометрию, и устройством, которое воспроизводит геометрию.
В типичной современной системе ПК ЦП находится на одной стороне шины PCIe (http://en.wikipedia.org/wiki/PCI_Express), а графический процессор - на другой. Единственный способ передачи сгенерированных по кадрам данных из CPU в GPU (и наоборот) - через эту шину. Это означает, что вы можете быть ограничены скоростью передачи этого автобуса. Если ваша целевая платформа имеет PCIe 2.x с 16 линиями, у вас полоса пропускания 8 ГБ / с. На практике передачи по PCIe не эффективны на 100%, так как некоторая часть полосы пропускания используется для протокола во время ваших передач. В зависимости от размера ваших передач вы можете потерять 5-10% пропускной способности только из-за накладных расходов на пакет.
например. Учитывая, что на платформе ПК работает PCIe 2.x с 16 линиями, сколько данных вы можете сгенерировать за кадр для подачи в графический процессор? Предполагая, что вы хотите работать со скоростью 60 кадров в секунду, это означает, что для PCIe 2.x это означает 8 ГБ / 60 = 136 МБ на кадр. Умножая на некоторые (предполагаемые) 90% -ный коэффициент для учета накладных расходов на связь с драйверами и протоколов передачи PCIe, вы можете генерировать около 120 МБ данных на кадр без ограничения пропускной способностью PCIe 2.x.
Другой вопрос, на который вы должны ответить: будет ли легко генерироваться это 120 МБ данных за 1/60 секунды на целевом процессоре? Помня о том, что вам нужно выполнить ряд других игровых задач на вашем процессоре, вы можете столкнуться с нехваткой времени для генерации преобразованных данных. С точки зрения просто пропускной способности ALU, это может ограничить ваш процессор. С точки зрения шин ЦП к системным системам, вы также можете быть ограничены пропускной способностью (которая варьируется, но составляет около ~ 8,5 ГБ / с на современных ЦП).
Итак, какие факторы делают его более жизнеспособным на GPU? Одним из факторов является пропускная способность памяти графического процессора, то есть пропускная способность между графическим процессором и его локальной видеопамятью. На современных графических процессорах среднего класса эта пропускная способность видеопамяти может достигать 200 ГБ / с (да, это в 25 раз больше пропускной способности PCIe 2.x). Другой фактор заключается в том, что графический процессор массивно параллелен, имеет сотни ALU и способен скрывать задержку доступа к памяти, выполняя одновременно тысячи потоков.
Все эти факторы могут внести свой вклад в очевидную победу в переносе большего объема работы на графический процессор, но опять же YMMV в зависимости от вашей целевой платформы.
Что вы подразумеваете под "трансформацией сетки"? Преобразование геометрии с помощью некоторого набора матриц? Большинство игр в наши дни позволяют GPU обрабатывать простые преобразования, скины и т. Д. И большинство из них будут использовать вершинные шейдеры для этого. На некоторых платформах у вас либо нет шейдеров, либо есть другие преимущества при выполнении этих задач на процессоре. Например, на PS3 вы можете снять нагрузку с RSX, позволяя SPU обрабатывать скины и преобразования. Если вы используете многопроходное освещение, то использование скинов на процессоре может быть выгодным, поскольку вам нужно сделать это только один раз и отправить результаты для каждого прохода рендеринга. Так что есть исключения, но в целом большинство игр делают это на GPU и в шейдерах.
Или вы имели в виду что-то более необычное, например, использование графического процессора для общей векторной математики? В наши дни у нас есть универсальные графические процессоры, которые могут выполнять довольно общий код C через такие системы, как CUDA. Это можно использовать для тяжелой векторной математики, и я знаю, что есть программы, которые делают это. У меня нет опыта лично, хотя.
Существуют ситуации, когда иметь смысл на рендеринге на GPU может иметь смысл, но вы не можете установить константы внутри шейдера, и на самом деле нет другого места, где их можно установить, кроме как на стороне процессора перед вызовом отрисовки.
Даже если бы вы могли вычислить свои константы, такие как матрицы преобразования костей, на GPU с помощью специальной программы инициализации, вы, вероятно, не захотите. GPU действительно хорош в параллельном исполнении, но имеет гораздо меньшую тактовую частоту.
Преобразование иерархии не является тривиально распараллеливаемым, потому что дочерние узлы зависят от родителей, но преобразование всех вершин в сетке происходит потому, что вершины вычислительно независимы друг от друга.
Общее правило: