Войти
ПрограммированиеФорумГрафика

Выделение памяти на GPU.

Страницы: 1 2 3 4 Следующая »
#0
(Правка: 6:53) 6:44, 22 мар. 2020

Я все воюю с ограничениями на размер памяти.

Вот что я заметил - моя аппликация на старте хапает 2 гига памяти (это нормально, столько текстуры и занимают), обший обьем памяти (Dedicated Memory) получается 3.5 гига и программа успешно стартует на картах с 4 гигами. Но при этом в Shared GPU Memory (т.е. в зеркало на стороне CPU) уходит 1.5 гига. Которых там изначально не было (т.е. был 0). Вроде логично, туда уходит среда из которой я свою программу запустил. Но когда я попробовал то же самое с программами сделанными на стандартных движках (Unity и Unreal), то там в shared memory ничего не попадает, программа хапает 3.7 гига на 4х гигабайтной карте и в разделяемом сегменте ничего нет. Запускал из той же среды. Значит я что-то делаю неправильно, но что?

Нашел хорошую статью, хотя не совсем на эту тему - http://3dgep.blogspot.com/2016/02/a-journey-through-directx-12-dynamic.html  - она внесла некоторую ясность как мне можно распределять память, но не как быть с разделяемой . Т.е. я не пойму почему у них в Shared Memory ничего не попадает и следовательно не требуется ничего качать по медленной шине. У меня это вызызывает дерганье картинки.


#1
6:48, 22 мар. 2020

san
> Но когда я попробовал то же самое с программами сделанными на стандартных
> движках (Unity и Unreal)

с каким рендером ?

#2
6:54, 22 мар. 2020

innuendo
> с каким рендером ?

??? Сам понял что спросил?

#3
6:57, 22 мар. 2020

san
> ??? Сам понял что спросил?

там есть dx11 dx12

#4
(Правка: 7:02) 7:02, 22 мар. 2020

Откуда я знаю на чем написана аппликация? Но какая разница - если это можно сделать на DX11 то можно сделать и на DX12. Обратное не всегда верно. Я работаю на DX12.

#5
7:33, 22 мар. 2020

san
> Откуда я знаю на чем написана аппликация? Но какая разница - если это можно
> сделать на DX11 то можно сделать и на DX12.

там по дефолту скорее всего было DX11

> Но при этом в Shared GPU Memory (т.е. в зеркало на стороне CPU) уходит 1.5
> гига.

ты это как меряешь?

#6
8:01, 22 мар. 2020

Во первых есть программа Task Manager который показывает Dedicated Memory и Shared Memory, во вторых есть функция QueryVideoMemoryInfo который показывает сколько я занял. Ну и для гурманов есть D3DKMTQueryStatistics, ежели первым двум нет доверия.
Меня не методика рассчета интересует, а как движки резервируют видеопамять.

#7
8:12, 22 мар. 2020

san
> а как движки резервируют видеопамять.

посредством вызовов апи

#8
2:29, 23 мар. 2020

san
> а как движки резервируют видеопамять.

ну можно на GPU себе текстур насоздавать призапас.

#9
4:14, 23 мар. 2020

gamedevfor
>ну можно на GPU себе текстур насоздавать призапас.
Так проблема как раз в том, что видео памяти для всех текстур не хватает. Точнее есть два режима, каждый со своими текстурами и по отдельности у каждого они в память влазят. Но не оба в месте. При переключении режимов драйвер секунд 20 разбирается какие текстуры выгрузить, какие загрузить. Все это время картинка подергивается.
По идее надо сделать две кучи, каждая в суммарный размер текстур для каждого режима. Засадить текстуры в эти кучи. И менять их одним чохом. Для этого текстуры нужно будет создавать не Committed (как у меня сейчас), а Reserved. Но дело осложняется тем, что некоторая часть текстур присутствует в обоих режимах. Но это еще решаемо. Хуже что нет нормальных (простых) примеров показывающих как такой режим реализовать.
Ну и меня смущает что аппликации на фирмовых движках не залазят в разделяемую память, а у меня там оказывается до 3.5 гиг. Очень бы не хотелось переделать кучу кода, а потом окажется что все зря.

#10
6:12, 23 мар. 2020

san
когда выделяешь память для текстур, ты указываешь, где она лежит: либо device only, тогда она будет находиться только в видюхе, либо со staging buffer'ом, тогда она будет находиться на видюхе и копия будет сидеть в оперативе. раньше это контролировалось через memory pool'ы (default, managed, etc). теперь в вулкане это контролируется через memory property flags, в dx12 должно быть что-то такое же.

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

#11
6:26, 23 мар. 2020

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

#12
7:16, 23 мар. 2020

Каков Инуендо , таков и ответ :)

#13
7:42, 23 мар. 2020

san
не то https://docs.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12… lacedresource ?

#14
8:02, 23 мар. 2020

Suslik
В DX12 есть три типа выделения памяти, это определяется на этапе создания ресурса (Committed, Placed и Reserved). Два последних должны ассоциироваться с кучами  (Heap), именно Heap и есть буфер в видеопамяти. Но чаще всего используется Committed тип, он создает невидимый хип размером в ресурс, т.е. ресурс сразу сидит в VRAM. Если памяти не хватает, то драйвер сам вытесняет неиспользуемую текстуру в RAM и возвращает обратно когда она нужна, но это требует времени. В моем случае процесс устаканивается до 20 секунд, в течении этого времени текстуры гуляют по шине. Поэтому я хочу все делать врукопашную, создать большую кучу (т.е. зарезервировать видеопамять) для всех используемых текстур, что бы потом работать с кучей, а не с текстурами россыпью. Тогда я смогу скидывать всю кучу в RAM и доставать обратно одним колом.
Но толковой информации я пока не нашел, микрософтовские примеры какие-то кривые, с налету не разобрался. Вообще удивительно мало информации по этому вопросу.

Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорумГрафика