1 (edited by yartat 04-09-2012 11:56:54)

Topic: Использование памяти в SVP

При проигрывании видео Мстителей (H264, 15831 Kbps, 1080p, контейнер MKV) через сплиттер LAV + ffdshow (видео + аудио) + встроенные субтитры в Mediaportal заметил периодические вылеты из-за OutOfMemory. Количество потоков в SVP - авто, остальные настройки - default. Использование памяти процессом mediaportal - 1.2GB (по данным Task Manager). Если выгрузить SVP Manager, то mediaportal съедает на этом же фильме на этом же участке 600MB. Таким образом, SVP съедает 600MB при проигрывании данного фильма, что в итоге приводит к невозможности выделить память для managed части и краху приложения. Пока проблему решил путем выставления количество потоков равным 8.
Hardware:
Ivy Bridge@4.2GHz HT on (видео отключено)
4GB RAM
nVidia GT 640
Software:
Windows 7 32bit
Mediaportal 1.2.3
LAV 0.51.3
ffdshow (последний)
SVP 3.1.2
вывод на EVR
nVidia driver 301.42

Однако хотелось бы с проблемой разобраться до конца.

Re: Использование памяти в SVP

http://www.svp-team.com/wiki/FAQ/ru#Про … time_error

Re: Использование памяти в SVP

Chainik, спасибо за ответ. Прежде чем написать о проблеме я посмотрел FAQ: предложенный мною временный вариант практически то же самое решение, что и в FAQ. Вопрос в другом: 600MB - это не мало памяти, особенно для x32. Можно ли подумать о фиче по уменьшению использования памяти? Выделение памяти в зависимости от кол-ва потоков (и как я понимаю копирование фреймов для каждого потока) является особенностью оптимизации по производительности или можно использовать иные способы?

Re: Использование памяти в SVP

600MB - это копейки. Много - это >2 GB.

предложенный мною временный вариант практически то же самое решение, что и в FAQ

Вообще ничего общего.
В FAQ указано как максимально использовать ресурсы системы, не снижая эффективность расчета.
Уменьшение кол-ва потокв - это снижение эффективности ради экономии не понятно чего. Ну примерно как пару ядер в BIOS отключить.

Если потребление памяти волнует настолько сильно, то можно дописать в Program Files/SVP/AVS/MSmoothFps.avs первой строчкой

svp_cache_fwd=threads+2

5 (edited by yartat 21-09-2012 14:48:01)

Re: Использование памяти в SVP

Chainik
Никак не могу добраться до профайлеров - пока на работе завал.

  • Если говорить о FAQ, то следует добавить следующее: для 32-х битный осей кроме активизации опции LARGEADDRESSAWARE необходимо включить поддержку 3GB. Тут подробная инструкция как ее включить. Есть нюанс с Windows XP: далеко не все драйверы могут корректно работать с этой опцией.

  • В программах с большим числом куч от разных менеджеров OOM приходит значительно раньше лимитных 2GB. Для .NET приложения без использования unmanaged resource это значение колеблется в районе 1.6-1.7GB. Для приложений, работающих с DShow графом предел значительно ниже 1.6GB.

Я буду еще тестировать с 3GB на своей системе рекомендацию из FAQ, но вместе с тем прогоню через профайлер использование памяти.
PS: я так понимаю, вы компилируете gcc. Будет интересно сравнить итоговую скорость с IC.

Re: Использование памяти в SVP

yartat
Будет интересно сравнить итоговую скорость с IC
В GPU режиме будет ровно ноль разницы, т.к. процессор упирается в ассемблерный код из x264.

А все заморочки с памятью исключительно на совести внутренних кешей Avisynth. То что написано на одно сообщение выше как раз и прибивает размер этих кешей до самого минимума.

7 (edited by yartat 23-09-2012 14:16:45)

Re: Использование памяти в SVP

Chainik

А все заморочки с памятью исключительно на совести внутренних кешей Avisynth. То что написано на одно сообщение выше как раз и прибивает размер этих кешей до самого минимума.

А-я-я-й   hmm  Зачем вводить в заблуждение?
Итак исходный файл Мстители (H264, 15831 Kbps, 1080p, контейнер MKV):
1. Выделено 3,110,400 байт 21 раз.

ntdll!RtlAllocateHeap( HANDLE, DWORD, SIZE_T )
msvcrt!malloc() + 0x57 
svpflow_gpu!flowLib_Calculate() + 0x7093f 

2. Выделено 15,523,264 байт 16 раз.

MSVCR90!malloc( size_t )
MSVCR90!operator new( unsigned int ) + 0x1f
...
svpflow1!_AvisynthPluginInit2@4() + 0x4aca
avisynth!avs_delete_script_environment() + 0x3f37
svpflow1!_AvisynthPluginInit2@4() + 0x32c1
avisynth!avs_delete_script_environment() + 0x5e21
avisynth!avs_delete_script_environment() + 0x3f37 

3. Выделено 1,827,376 байт 16 раз.

MSVCR90!malloc( size_t )
MSVCR90!operator new( unsigned int ) + 0x1f 
...
svpflow1!_AvisynthPluginInit2@4() + 0x31b5 
avisynth!avs_delete_script_environment() + 0x5e21 
avisynth!avs_delete_script_environment() + 0x3f37 

Я привел только самые крупные блоки. К сожалению понять что там происходит не могу: нет даже pdb.

Re: Использование памяти в SVP

yartat
И что предлагается?

Re: Использование памяти в SVP

MAG79 wrote:

yartat
И что предлагается?

Можно ли подумать о фиче по уменьшению использования памяти?

Re: Использование памяти в SVP

yartat
Я рад что посетители форума настолько хорошо овладели скиллом использования разных тулов!

Тем не менее не могу не отметить что приведенные цифры (3*21+15*16+1.8*16 = 331 МБ) являются вполне гуманными для алгоритма, ворочающего 3-х мегабайтные фреймы в 16 потоков.
При этом кэш Avisynth-а в любом случае занимает больше памяти, вплоть до бесконечности, т.е. если кто и "вводит в заблуждение", то это не я.
Я не вижу вообще ни одной причины почему надо проводить какую-то борьбу за снижение потребления памяти ниже 331 МБ.
Если вдруг кому-то настоятельно хочется провести такую борьбу - то исходники svpflow1 открыты.

А вообще, перед тем как давить интеллектом, настоятельно рекомендуется ознакомиться с принципами работы Avisynth вообще, и со способом организации многопоточности в нем в частности.

Re: Использование памяти в SVP

Ув. Chainik,
видимо со стороны мои посты выглядят как вызов. Поверьте, это не так: я активно использую SVP с 3.0 при просмотре на HTPC и очень ею (программой) доволен (спасибо вам за труд). До недавнего времени я использовал довольно слабый Феном 2 и не имел никаких проблем, но недавно поменял систему на иву и захотелось большего качества. Сразу после этого вылезли проблемы с памятью. Собственно говоря с этого момента я и заинтересовался что там внутри.
Я мог бы помочь разработчикам именно с этой проблемой (если она имеет решение) благо это совпадает с моей основной специализацией (оптимизация использования памяти, оптимизация исполнения, повышение эффективности в многопоточном коде). Еще раз хочу подчеркнуть: я ни в коем случае не желаю быть разработчиком SVP, я лишь могу помочь в решении определенной проблемы. Если разработчики не хотят сотрудничать или не считают данную проблему существенной - я откланяюсь.

Re: Использование памяти в SVP

Разработчики SVP всегда открыты к конструктивной беседе.

С моей стороны конструктивно было предложено решение из 4-го поста этой темы.
Выкрики с места в виде "А-я-я-й. Зачем вводить в заблуждение?" я лично расценивать как конструктивные не могу. Тем более что далее идущие цифры показывают что автор выкриков просто не знает как работает Avisynth (в рамках которого живет SVP).

"оптимизация использования памяти, оптимизация исполнения, повышение эффективности в многопоточном коде" - очень бы пригодились в самом Avisynth. Я уверяю, что сотни тысяч его пользователей были бы благодарны за помощь в разработке будущего Avisynth 2.6.

Re: Использование памяти в SVP

Chainik
Я понял, извините за беспокойство.