Как вы измеряете распределение памяти и ограничения в металле? - PullRequest
0 голосов
/ 30 ноября 2018

Я создаю средство просмотра изображений на основе Metal и в настоящее время экспериментирую с загрузкой некоторых довольно больших изображений (70 000 x 24 000 пикселей).Изображение загружается в несколько MTLTextures, каждый из которых типа MTLTextureType2DArray.

Металл, кажется, создает текстуры и выделяет необходимую память, поскольку XCode сообщает о моем приложении, используя более 9 ГБ памяти.На моем 13 "MBP с 16 ГБ памяти у меня явно нет 9 ГБ памяти GPU для всех этих текстур, поэтому я предполагаю, что Металл использует системную память для выделения?

Однако, когда приходит времяПри выполнении прохода рендеринга Metal немедленно выдает ошибку Insufficient Memory, когда я запрашиваю текущий дескриптор прохода рендеринга.

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

Я бы подумал, чтовыделение новых текстур в какой-то момент начнёт давать сбой, но я, кажется, смогу выделить достаточно, чтобы покрыть изображение шириной 70000 пикселей и высотой 24000 пикселей (BGRA8), но это же выделение вызывает ошибку памяти при проходе рендерингапроисходит.

Правка №1:

Я только что понял, что при использовании MTLStorageModeManagedдля текстур Metal необходимо обновить представление текстуры в видеопамяти, только когда я назначаю текстуру индексу фрагмента во время моего прохода рендеринга.Если я не назначу все текстуры, то моя ошибка «Недостаточно памяти» исчезнет, ​​потому что, по-видимому, осталось достаточно видеопамяти для того, чтобы Металл выделил для рисования.

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


Ошибка консоли Xcode:

Выполнение буфера команд было прервано из-за ошибки во время выполнения.Недостаточно памяти (код IOAF 8)

Трассировка стека:

Xcode Stack Trace

ПамятьДатчик:

Memory Gauge

1 Ответ

0 голосов
/ 30 ноября 2018

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

...