Как перенести нагрузку с процессора на видеокарту
Не открою Америки, если скажу, что гнаться за тем, чтобы у тебя на столе стояло только самое современное компьютерное "железо" — чрезвычайно дорогое занятие. Да, относительно современный "игровой" компьютер вполне можно купить за 30 тысяч рублей, но мы ведь говорим о работе с цифровым контентом, т.е .видео, фото и звуком, а для комфортной работы с ними Вам нужны и процессор помощнее, и места на жестких дисках (да, именно так, во множественном числе), и AC97 в качестве звукового решения не подойдет. Про видеокарту обычно забывают, так как если компьютер не используется для игр, или его владелец не играет в суперсовременные 3D-игры, то и видеокарты внутри стоит "средняя", зачастую встроенная в материнскую плату — обеспечивает нужное разрешение, не сильно "мылит" — да и ладно: И, увы, большинство людей даже не подозревают, что видеокарту можно тоже заставить трудиться, даже не в режиме игры или работы с CAD/CAM, а именно для работы с видео.
В целом, я планирую серию статей, посвященных именно роли видеокарт в работе с цифровым видео, с упором на то, чтобы прочитавший материал мог использовать уже стоящую в его десктопе или ноутбуке видеокарту, или, по крайней мере, при модернизации учитывать и данный фактор.
Текущая статья посвящена переносу части нагрузки с CPU на видеокарту при декодировании видео с помощью написания и исполнения простого шейдерного кода при проигрывании видео с помощью популярного плеера Media Player Classic (MPC)
"MPEG-4 like" кодеки
Отнесем к ним сонм кодеков, наиболее популярны из которых xVid, DivX, h.264 (имеющаяся бесплатная версия x.264 — весьма неплохой вариант), WMV, VP6, VP7 и прочие. До недавнего времени аппаратно декодировались только DivX на видеокартах ATI, начиная с Radeon 9500 и выше (можно для xVid выставить FourCC-код ‘DIVX’ и он тоже проиграется), но только с помощью отдельной программы от DivX Lab — DivX player, а также WMV, причем аппаратная поддержка декодирования последнего, точнее ее отсутствие вызывало, и вызывает до сих пор, немало отрицательных реплик в сторону NVIDIA. И все. Новые технологии от NVIDIA и ATI, PureVideo и AVIVO соответственно, пока предоставляют не так много возможностей для декодирования (о кодировании с использованием AVIVO поговорим позже, в другом материале), хотя подвижки уже есть — декодирование h.264 на последних моделях видеокарт.
Для всех вышеперечисленных форматов зачастую большую нагрузку на CPU накладывает не само декодирование, а постпроцессинг, включая деинтерлейс (если на входе — чересстрочный поток). Поэтому для них перенос части нагрузки на GPU видится весьма актуальным.
Пара готовых функций — копируйте и вставляйте
Итак, чтобы использовать нижеприведенный код, создайте, как было описано выше, свою функцию, и полностью (вместе с объявлениями переменной) замените код на приводимый ниже.
"адаптивный" деинтерлейс — его адаптивность, конечно, желает лучшего, но пока, без возможности обратиться к предыдущему кадру, придется оставаться с этим.
sampler s0 : register(s0);
float4 p0 : register(c0);
float4 p1 : register(c1);
float4 main(float2 tex : TEXCOORD0) : COLOR
float dx = 4/width;
float dy = 4/height;
float4 c00 = tex2D(s0, tex);
float2 h = float2(0, 1/height);
float4 c01 = tex2D(s0, tex-h);
float4 c02 = tex2D(s0, tex+h);
float4 c03 = (c00*2+c01+c02)/4;
float4 c2 = tex2D(s0, tex + float2(0,-dy));
float4 c4 = tex2D(s0, tex + float2(-dx,0));
float4 c5 = tex2D(s0, tex + float2(0,0));
float4 c6 = tex2D(s0, tex + float2(dx,0));
float4 c8 = tex2D(s0, tex + float2(0,dy));
Стояла дохлая видеокарта - процессор грузился на 100%, сейчас стоит нормальная, и всё равно проц сильно грузится.
Если просто, то, видимо, речь идёт о задействовании видеокарты для кодирования/декодирования. Это реализуемо, НО при следующих условиях:
1. Аппаратное (де) кодирование поддерживается видеокартой.
2. Программное обеспечение позволяет подобное распределение задач.
3. Драйвера для видеокарты установлены нужной версии.
Например, Sony Vegas Video поддерживает некоторые модели видеокарт Nvidia и AMD (ATI) для кодирования видеопотока в формате AVC (речь идёт о повышении производительности на 10-15% по сравнению только лишь с использованием процессора) . Но речь лишь о нескольких моделях видеокарт, и вдобавок нужны драйвера определённой версии. К сожалению, в этом случае мантра "самые последние драйвера ставь" не работает. Это действительно набор условий, если хоть одно из них не выполнено - не будет аппаратной поддержки.
При проигрывании возможно задействовать аппаратную поддержку декодирования видеокарты, но опять же - нужно, чтобы это умел делать софт, и чтобы драйвера были правильной версии. Например, в плеере MPC-HC наличие аппаратной поддержки (то есть режима, при котором задействовано аппаратное декодирование) обозначается буквами DXVA в статусе при проигрывании видео. Если не обозначается, значит, нужно сделать правильные настройки (для MPC-HC есть пошаговые инструкции, их легко найти) .
Ну и не следует забывать, что важно, поддерживает ли процессор соответствующие наборы инструкций. Возможно, замена только лишь видеокарты не позволит использовать все её возможности.
А ты часом не пробовал перекинуть 2ядра на видеокарту с процессора четырёхядерника? ))) Скатай прогу для отображения скрытых процессов и посмотри что нагружает твой проц. И прежде чем задавать вопрос . хорошенько обдумай как его правильно сформулировать.
Вообще то никак. Камень в системе и чип в видяхе - радикально разные устройства, разные алгоритмы, принципы работы, архитектуры, все равно что попросить подводную лодку слетать на луну. Шейдерами занимается видеокарта, ее аппаратная часть, драйвер и директ Х, вот как раз процессор обеспечивает работу директа и драйвера, но к самим шейдерам он и близко отношения не имеет.
Лопатой, берешь побольше, кидаешь подальше, пока летит отдыхаешь))) ) А если честно, то распределить нагрузку можно только переадресацией процессов, но в случае с процом и видюхой это не выйдет.
сокет 1156 тогда легко автоматом! или смотайся в будущее лет на сто отучись в унивеситете комп технологий-вернешся нас научиш! вариант учи матчасть и не смеши! стоит дохлый проц и остальное! начни с проверки охладения такие умники обычно отток ставят а надо приток! пропылесось радиатор
Ну да вы еще про невозможность вычислений на чипах видеоадаптера майнерам скажите, они посмеются.)))
Это возможно, только я пока не разобрался как.
злые люди в рашке как обычно, если человек был бы знаток он бы не пришел к вам за советом, прям отвращение вызываете ей богу, те люди которые пишут ламер, смеются, вы тоже родились сразу от бога программистами? моральные уроды
Владельцам любых видеокарт хочется, чтобы их «железо» отрабатывало на все 100%. Однако зачастую нагрузка на видеокарту в играх и близко не подходит даже к отметке в 90%. Особенно неприятно, что именно в таких ситуациях нередко наблюдается низкая частота кадров. В этой статье предлагаю рассмотреть 4 причины такой ситуации и способы исправления.
1. Ограничители fps
Сейчас среди настроек графики во множестве игр можно найти ограничители fps. Также ограничить кадровую частоту можно и в настройках видеокарты. С помощью ограничителей можно получить более стабильный fps, более «ровный» фреймтайм (время отрисовки одного кадра), можно уменьшить шум от системы охлаждения (особенно актуально для ноутбуков) и снизить энергопотребление. Однако включение ограничителя часто приводит к недогруженности видеокарты.
Во многих старых играх ограничителей fps нет, но следует помнить, что включение VSync (вертикальная синхронизация) также ограничивает частоту кадров. Если есть цель получить максимальную производительность в игре, то любые ограничители следует по возможности отключать.
2. Проблемы с оперативной памятью
Работа оперативной памяти в одноканальном режиме способна сильно ограничивать fps, снижая нагрузку на видеокарту (левый скриншот снизу). Впрочем, это не мешает производителям игровых ноутбуков и готовых сборок ПК из года в год продавать устройства с одной-единственной плашкой оперативной памяти внутри. Поэтому при покупке следует проверять конфигурацию памяти, и в случае чего докупать вторую планку ОЗУ.
Сравнительные тесты с ютуб-канала Testing Games
Другой проблемой может стать низкая частота оперативной памяти (см. правый скриншот сверху). Здесь поможет разгон или замена модулей на более скоростные.
3. Низкая производительность процессора
Наглядная демонстрация эффекта «бутылочного горлышка» от JayzTwoCents
Совмещая низкопроизводительный процессор с высокопроизводительной видеокартой некоторые пользователи получают эффект «бутылочного горлышка». Процессор в таком случае нагружен практически на 100%, а вот видеокарта нагружена лишь частично. Этот эффект особенно заметно проявляется в процессорозависимых играх при запуске в низком разрешении. Здесь поможет разгон / замена процессора или снижение в играх настроек, которые сильнее всего нагружают процессор (к примеру, дальность прорисовки объектов, число персонажей на экране и тому подобное).
Проверить процессор на троттлинг можно в утилите Intel XTU
В ноутбуках падение нагрузки на видеокарту зачастую связано с троттлингом процессора (снижение рабочей частоты из-за нагрева). В таких случаях обычно помогают чистка системы охлаждения от пыли, замена термопасты и андерволтинг. Особо пряморукие и уверенные в себе пользователи могут даже попробовать заменить термопасту на жидкий металл.
4. Проблемы с софтом
Низкая загрузка видеокарты может быть связана с плохой оптимизацией игры. Даже «топовое» современное железо не гарантирует отсутствие просадок ниже 60 fps в старой-доброй GTA IV или в Аллодах Онлайн. Свежие игры тоже не всегда могут похвастаться хорошей оптимизацией: The Medium и Cyberpunk 2077 вызвали бурю негатива в игровом комьюнити во многом из-за плохой производительности на неплохом железе. В таком случае остается ждать патчей с исправлениями игры от разработчиков, либо поискать неофициальные патчи, улучшающие стабильность игры.
В редких случаях проблемы с производительностью могут быть вызваны ошибками в драйверах видеокарты. Полное удаление драйверов с помощью утилиты Display Driver Uninstaller и последующая чистая установка драйверов с официального сайта производителя ноутбука / видеокарты помогут решить эту проблему. Поднять производительность старых видеокарт AMD Radeon можно также с помощью драйверов от энтузиастов.
Здравствуйте. Я анимирую transform, однако наблюдаю высокую нагрузку на CPU.
1. Почему грузится CPU? Ведь, как я понял, при анимации transform грузится CPU не должен.
2. Подскажите, возможно ли как-нибудь оптимизировать эту анимацию, чтобы немного снизить нагрузку и повысить плавность?
Простой 15 комментариев
Михаил, а в чем тогда суть этой проверки? Я думаю речь о том чтоб оптимизировать как-то анимацию, а не убрать её
Михаил, ну так ты хоть покажи что у тебя с такой же динамикой нагрузка не меняется
Хотя может быть в этом и нет смысла, если вдруг все расчеты на GPU были
Kovalsky, может быть у тебя intel core i9 последний? Как такая нагрузка? Ты смотришь именно в Performance Monitor?
qqignatqq, ну конечно performance monitor. Не, у меня довольно слабый мобильный i3 в моноблоке леново. Вот только что проверил на ещё более слабом q6600, получилось 14% нагрузки на cpu, но что забавно так это то что те же 14% наблюдаются если возякать мышкой вне элемента, то есть сама анимация грузит процессор почти никак. Видимо и правда часть нагрузки идёт на gpu
Kovalsky, очень интересно. Ну вот у sprashivatel тоже фризы, так что я здесь не один. При том, что у меня не мобильный ПК, и видеокарта мощная.
Этим управляет браузер. Сами вы не можете повлиять с способ рендеринга. Кроме того, в браузере должна быть включено апаратное ускорение. Но даже с ним браузер может использовать CPU, если посчитает, что на устройстве садится батарея и нужно перейти в энергосберигающий режим.
У большинства энергосберегающий режим врубается сразу, как только ноутбук отключен от питания. Тут и стандартные настройки Windows влияют и сами браузеры норовят напихать функций для экономии батареи, например в Opera такое есть. В общем, я так думаю без сети у большинства будет всегда использоваться CPU, так как мало кто из пользователей детально настраивает режимы работы от батареи.
qqignatqq, фиг его знает, я скорее хочу сказать, что большинство пользователей после покупки ноутбука, вряд ли будут ковыряться в режимах энергообеспечения, в настройках видеокарты и настройках браузера, а без этого стандартное поведение таково, что при отключении от сети не взирая на уровень заряда, система врубает экономию энергии на всех уровнях - экономит ПО видеокарты врубая свои хитрые режимы, экономит браузер и экономит даже Windows. И везде надо зайти и ручками прописать, что экономить от батареи не надо, без этого 100% производительно от батареи точно не будет.
Буду краток, причина оказалась в непостоянстве частоты GPU (больше), и CPU(меньше). Используя MSI Afterburner, HWiNFO64, и RivaTuner экспериментальным путем я выяснил что пропуски кадров происходят из-за достижения powerlimit в gpu и pl4 limit в cpu. Лимиты есть и всегда будут. Даже если убрать лимиты для мощности и тока, упремся в температурный лимит, который ещё более наглый чем предыдущие, тк изменяет частоту более резкими скачками. Но есть решение. Прошу под кат.
Shuttering такого вида встречается даже на самых мощных компьютерах с 2080ti, 1080ti, и особенно в sli конфигурациях.
Я использую GPU GTX1070, CPU 6700K, экран 1080p@120hz, p750dm2 clevo (но скорее всего все нижесказанное будет относиться и к десктопам).
Мой девайс ноутбуком язык не поворачивается назвать из за десктопного процессора и соответствующего охлаждения.
Просто понизив частоту на где то 1-5% с прыгающих 1750-1680Mhz до стабильных во времени 1671Mhz с помощью функции curve в Afterburner, stuttering практически полностью исчез.
А после выключения turbo boost на 6700k(и фиксации частоты на 4Ghz) он исчез окончательно. При этом температура GPU упала с 88 до 73 градусов.
Далее я проводил тестирование с процессором на одной и той же частоте, 4Ghz. Эффект еще сильнее если учитывать эффект от отключения turbo boost.
Тестирование проводил в игре Rise of Tomb Raider тк у нее есть встроенный бенчмарк.
До:
После:
Результат бенчмарка:
До:
После:
Настройки графики средние:
Ну и самое главное, curve для моей видеокарты, с разгоном +148:
OSD я активировал в настройках MSI Afterburner Core clock, CPU clock, Power limit, и через плагин к HWiNFO64 использовал индикадоры throttling CPU:
Просто поиграв минут 15, определил минимальные частоты CPU и GPU после просадки из-за нагрева, и установил горизонтальную линию на 10 Mhz ниже. Power limit (и другие лимиты) должны быть всегда либо активны либо нет, а не дребезжать каждые несколько секунд.
Небольшое замечание, многие средства мониторинга, тот же task manager в Windows, и особенно HWiNFO64 очень хорошо видны на графиках, так что будьте внимательны, пропуски кадров через равные промежутки времени — это норма с этими программами на время тестирования. Я рекомендую установить интервал обновления графиков каждые 5 секунд.
Результат — падение производительности всего лишь на 0.14%(посчитал из общего количества кадров бенчмарка), повышение средрего fps(top 95%), и понижение температур GPU и CPU на 15 градусов при измерении на GPU ( тк радиатор у них общий) взамен на более плавный игровой процесс.
Итоги:
CPU full power, GPU full power — 88 C, 72 fps
CPU low power, GPU full power — 80 C, 72 fps
CPU low power, GPU low power — 73 C, 71 fps
Более подробно тестировать у меня к сожалению нет времени.
PS:
Насчёт CPU. Нужно не грубо отключать turbo boost, а с умом. До перехода на 4.0Ghz, я пробовал 4.4Ghz(overclock), 4.2Ghz, и 4.1Ghz. Они все без исключения не стабильны во времени, и производят просадки до 4.0Ghz. У вас может быть другая ситуация. Ещё от игры зависит, так что отключение turbo boost как универсальное решение не рекомендую, скорее ручной выбор максимальной стабильной во времени частоты.
Если заметили ошибки, прошу писать в личку)
Если статья понравится, то переведу на english.
Итак, выполнение шейдерных процедур обработки видеопотока с использованием Media Player Classic
Подобный подход будет работать, начиная с шейдеров версии 1.3 (возможно, что и с версии 1.1, но владельцам GeForce 3 придется это проверить самостоятельно), т.е. на видеокартах, начиная с ATI Radeon 8500 и NVidia GeForce 4200 Вам обязательно придется поставить DirectX 9.0c, очень желательно, с версиями библиотек не ранее апреля 2005 г. Еще лучше, чтобы Ваша видеокарта поддерживала шейдеры версии 2.0 (начиная с ATI Radeon 9500 и NVidia GeForce 5200).
Итак, если видеокарта — подходящая, DirectX 9 установлен, то — вперед! Запускаем MPC (не забываем скачать последнюю версию!), идем в окно настроек (View/Options, вкладка Output):
Настройка Media Player Classic на работу с шейдерами
Крайне рекомендую выставить VMR9(renderless) — именно в этом режиме у Вас будут работать субтитры, и только в этом случае возможен корректный вывод видео на ТВ из окна в режиме Театр (и аналогичный на GeForce) одновременно с работой шейдеров (в противном случае Вы рискуете увидеть на ТВ экран целиком, а не оверлей окна с фильмом). Какой режим вывода Вы выберете для RealVideo и QuickTime — решать Вам, замечу лишь, что шейдеры при проигрывании этих форматов будут использоваться только в том случае, если будет выставлен режим DirectX 9.
Ну, естественно, для работы с шейдерными функциями Вам понадобится включить использование 3D поверхностей для вывода (Use texture surfaces and render video in 3D). Не забудьте выбрать соответствующий метод ресайза (обратите внимание, что bicubic возможен только при поддержке видеокартой шейдеров 2.0):
Выбор метода ресайза видео
Также я рекомендую включить режим VMR9 mixer mode — это даст доступ к большему количеству настроек и заодно, кстати, даст лучшую возможность распределения работы проигрывателя на несколько процессоров/ядер, если они имеются.
Все, MPC готов к опытам!
Теперь, открывая видеофайл на проигрывание, Вы можете заметить (если раньше не обращали внимания), что по нажатию правой кнопки мыши доступно меню с выбором готовых функций (у Вас их может быть меньше, и даже совсем может не быть):
Список шейдеров в MPC
Можете выбрать любой и посмотреть, что получится 🙂 Кстати, Вас вполне могут устроить встроенные функции. Но мне, к примеру, встроенный деинтерлейс несколько не понравился, и я переписал функцию. К слову сказать, понадобилось мне все это во время Олимпиады-2006, когда у меня не было в системе двух процессоров, и когда тюнер отказывался качественно писать поток с поддержкой TimeShift, а на запись одного материала с полноценным просмотром другого не хватало процессорной мощности. Но материал, описывающий эти мучения пока все еще в доработке, а функции, написанные мной — ниже.
Итак, чтобы написать собственную функцию необходимо выбрать из меню элемент View/Shader Editor, вписать в левое поле название своей будущей функции (естественно, английское) и затем выбрать версию шейдеров:
Выбор версии шейдеров
Проигрыватель создаст Вам тело функции с необходимыми объявленными переменными. Далее можете добавлять собственный код или скопировать и вставить мой. Также Вы можете выбрать и отредактировать любую встроенную (или ранее написанную Вами) функцию:
Программировать несложно — пяти минут разбора других функций достаточно, чтобы самому писать сложные функции.
К сожалению, пока в MPC нет возможности обращаться к предыдущему кадру (для серьезных фильтров — я бы написал шейдерный аналог QSDeinterlace или темпорального фильтра), но вроде бы разработчики обещают вставить такую возможность. Будем напоминать им об этом вместе?
MPEG-1/2
Я прекрасно помню времена, когда проиграть .MPG-файл на компьютере без использования внешней программы было невозможно. Программ было тоже мало, и каждая соревновалась с другой по части оптимизации под существующие слабые процессорные решения. Появление Video for Windows в качестве системного мультимедийного API частично упростило задачу, и появился интерес к тому, чтобы некоторые стандартизованные алгоритмы поддерживались в железе, например, видеокартами. Дальнейший переход на DirectShow-компоненты, входящие в состав DirectX, также способствовал этому. Постепенно на плечи GPU переложили 4 из 5 стадий декодирования MPEG-1/2 (о возможности выполнения всех пяти стадий — в одной из следующих статей), и сейчас только весьма древняя видеокарта не может похвастаться аппаратной поддержкой этого формата, более новые реализуют деинтерлейс и постпроцессинг также на аппаратном уровне, и последние два поколения (не без проблем у некоторых моделей) вполне успешно справляются с MPEG-2 высоких разрешений.
Так что в этом отношении особых проблем нет, достаточно иметь установленный в системе декодер, поддерживающий аппаратное ускорение декодирования MPEG-1/2 (либо от производителя Вашей видеокарты, либо от таких известных программных продуктов, как PowerDVD или WinDVD).
Однако и в этом случае иногда хочется "навернуть" поверх всего этого что-то свое, к примеру, Вас не устраивает способ деинтерлейса, который осуществляет Ваша видеокарта или изображение шумновато, и Вы хотите очистить его, и т.п. Вот как раз этот случай нам и интересен.
Также не забывайте, что некоторые программы, работающие с видеопотоком, могут неплохо использовать Вашу видеокарту для декодирования (с подбором соответствующего декодера), как это, к примеру, делает Sonic Scenarist.
Читайте также: