Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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