OpenGL большая 3D текстура (> 2ГБ) очень медленная - PullRequest
0 голосов
/ 31 октября 2018

Моя видеокарта GTX 1080 ti. Я хочу использовать OpenGL 3D текстуру. Пиксельный (воксельный) формат - GL_R32F. OpenGL не сообщал об ошибках, когда я инициализировал текстуру и рендеринг с текстурой.

Когда 3D-текстура была маленькой (512x512x512), моя программа работала быстро (~ 500FPS).

Однако, если я увеличил размер до 1024x1024x1024 (4 ГБ), FPS резко упал до менее 1FPS. Когда я отслеживал использование памяти графическим процессором, объем памяти графического процессора не превышал 3 ГБ, хотя размер текстуры составлял 4 ГБ, а всего у меня 11 ГБ.

Если я изменил формат пикселя на GL_R16F, он снова заработал, и FPS вернулся к 500FPS, а потребление памяти графическим процессором составляет около 6,2 ГБ.

Моя гипотеза состоит в том, что 3D-текстура 4 ГБ на самом деле не в графическом процессоре, а в памяти процессора. В каждом кадре драйвер снова и снова передает эти данные из памяти процессора в память графического процессора. В результате это замедляет производительность.

Мой первый вопрос: верна ли моя гипотеза? Если это так, почему это происходит, даже если у меня достаточно памяти GPU? Как заставить все данные OpenGL находиться в памяти GPU?

1 Ответ

0 голосов
/ 31 октября 2018

Мой первый вопрос: верна ли моя гипотеза?

Это, по крайней мере, немыслимо.

Если это так, почему это происходит, даже если у меня достаточно памяти GPU?

Это решение вашей реализации OpenGL. Обратите внимание, что это также может быть некоторой ошибкой драйвера. Это также может быть некоторый внутренний предел.

Как заставить все данные OpenGL храниться в памяти GPU?

Вы не можете. OpenGL не имеет понятия Video RAM или System RAM или даже графического процессора. Вы указываете свои буферы и текстуры и другие объекты и делаете вызовы отрисовки, и задача реализации GL состоит в том, чтобы сопоставить это с фактическим оборудованием. Тем не менее, нет никаких гарантий производительности - вы можете столкнуться с медленным путем или даже откатом к программному рендерингу, когда вы делаете определенные вещи (причем последнее время действительно необычно, но концептуально это очень возможно).

Если вы хотите контролировать, где размещать данные, когда фактически передавать их и т. Д., Вам нужно использовать более низкоуровневый API, такой как Vulkan.

...