2013-05-18 2 views
36

Должен ли я рассчитать матрицы на процессоре или графическом процессоре?Должен ли я вычислять матрицы на графическом процессоре или на процессоре?

Предположим, что у меня есть следующие матрицы P * V * M, должен ли я рассчитать их на процессоре, чтобы я мог отправить окончательную матрицу на GPU (GLSL) или я должен отправить эти три матрицы отдельно на GPU, чтобы GLSL мог вычислить конечная матрица?

Я имею в виду, что в этом случае GLSL должен был бы вычислить MVP-матрицу для каждой вершины, поэтому, вероятно, быстрее прекомпретировать ее на CPU.

Но скажем, что GLSL должен только вычислить его MVP-матрицу один раз, будет ли GPU вычислять конечную матрицу быстрее, чем CPU?

+1

Можете ли вы привести пример того, что вы выполняете этот расчет только один раз в GPU? – Amadeus

+2

1. Оптимизировать последний. Вы уверены, что не просто откладываете? :) 2. Если вы не можете измерить производительность и определить узкие места, не думайте об оптимизации. –

+0

Просто примечание, если вы непосредственно умножаете вектор, как в 'projection * view * model * vertex'. Тогда на самом деле нет« матричных »умножений. Только умножение 'matrix * vector', так как оно оценивается справа налево' (проекция * (view * (model * vertex))). Это намного менее обременительно при расчете. –

ответ

50

Общее правило: если вы можете передать его в шейдер в виде форме, всегда предвычислять на CPU; без исключений. Вычисления на стороне шейдера имеют смысл только для значений, которые различаются между вершинами и фрагментами. Все, что является постоянным среди целой серии вершин, наиболее эффективно обрабатывается на процессоре.

Графические процессоры - это не волшебные машины «все быстрее и быстрее». Существуют определенные задачи, когда CPU может легко превзойти графический процессор даже для очень больших наборов данных. Таким образом, очень простое руководство: если вы можете переместить его на CPU, не затрачивая больше процессорного времени на вычисления, чем требуется для GPU, чтобы обрабатывать его, то сделайте это на CPU. В число этих задач входит вычисление одной матрицы.

+6

Графические процессоры обычно быстрее для проблем, которые «смущающе» параллельны. – fluffels

+3

Не параллельное умножение матрицы? Каждый элемент может быть рассчитан независимо. – Calmarius

+4

@Calmarius: Да, вы можете распараллелить вычисление матрицы, и на самом деле большинство CPU распараллеливают его с помощью своих наборов векторных команд. Но матрицы нужно вычислять только точно * один раз * и оставаться неизменным для всех вершин модели с использованием этого конкретного преобразования. Накладные расходы только для того, чтобы сделать GPU, выполняющий умножение матрицы 4 × 4, требует больше инструкций (и времени), чем выполнение этого вычисления на ЦПУ. Если вы хотите распараллелить умножение матрицы 2k × 2k, тогда графические процессоры будут приятно распараллелить это. Но для матрицы 4 × 4 накладные расходы просто не стоят. – datenwolf

13

Как и большинство ситуаций с OpenGL, все зависит.

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

С другой стороны, это также зависит от того, где ваши узкие места. Если ваш процессор выполняет большую часть другой работы, но ваши шейдеры не являются узким местом в самой низкой целевой системе, тогда вы можете легко увидеть некоторые улучшения производительности, перемещая некоторые матричные умножения в вершинный шейдер.

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

+4

Вычисление массива матриц, особенно MVP, никогда не является узким местом на процессоре. – datenwolf

+7

@ datenwolf нет, это не так, но это тоже не бесплатно. Таким образом, если программа не требует графического требования, но имеет и другие части, которые требуют вычислительных требований, позволяя графическому процессору вычислить несколько избыточных матриц MVP, может быть просто отлично. Как я уже сказал, все зависит от ситуации. – bcrist

+7

Все накладные расходы на то, чтобы вычислить графический процессор, требует гораздо больше циклов, чем простой матрично-матричный расчет. Вы можете сделать расчет 4 × 4 · 4 × 4 в 16 инструкциях по современным процессорам.Это намного меньше, чем требуется для выбора шейдерной программы, установки униформы и поворота шестерни GPU путем отправки примитива для рендеринга. Накладные расходы на создание графического процессора на самом деле делают что-то довольно высоко, поэтому вы пытаетесь выполнять задания как можно больше для GPU. – datenwolf

Смежные вопросы