Cyberpunk 2077 игнорирует многопоточность микропроцессора AMD



    Пользователи сайта Reddit утверждают, что игра Cyberpunk 2077 игнорирует одновременную многопоточность (Simultaneous Multithreading, SMT) и в основном использует только физические ядра ЦП на ПК с процессорами AMD. На компьютерах с чипами Intel игра использует все доступные физические и логические ядра центрального процессора.

    На форуме было предложено решение — изменить несколько байт в EXE-файле игры. Нужно в Hex-редакторе найти строку 75 30 33 C9 B8 01 00 00 00 0F A2 8B C8 C1 F9 08 и изменить ее на EB 30 33 C9 B8 01 00 00 00 0F A2 8B C8 C1 F9 08. В этом случае на ПК с процессорами AMD станут использоваться все логические ядра центрального процессора, а производительность игры улучшится на 10-20%.

    Пример распределения нагрузки на ядра процессора AMD при запущенной игре Cyberpunk 2077 без изменений в Hex-редакторе.

    Пример использования всех ядер процессора AMD при запущенной игре Cyberpunk 2077 после внесения изменений в Hex-редакторе.

    Некоторые пользователи предположили, что это происходит из-за того, что Cyberpunk 2077 использует компилятор Intel C++, который препятствует оптимизации игры при работе на процессорах сторонних производителей. Однако, они не нашли подтверждения этой теории.

    Сейчас основная версия пользователей — при запуске игры происходит проверка производительности текущей системы с помощью библиотеки GPUOpen, чтобы планировщик игры мог использовать оптимальное количество ядер, в зависимости от семейства процессоров, которые используют игроки. По какой то причине после проверки на ПК с процессорами AMD, которые не на архитектуре Bulldozer, планировщик выделяет для игры меньше потоков.

    Один из пользователей пояснил, что ранее, когда AMD начала продавать процессоры серии FX, то компания подвергалась критике за неправильный маркетинг своей продукции. Проблема заключалась в том, что их «8-ядерные» процессоры вводили покупателей в заблуждение и должны были продаваться как 4-ядерные 8-поточные процессоры или 4-ядерные процессоры с гиперпоточностью. То же самое с другими вариантами подсчета ядер. Другая проблема заключалась в том, что они пытались скрыть этот факт от программного обеспечения, что означало, что, когда программы пытались проверить, сколько ядер и потоков имеет ЦП, он неверно сообщал, что имеет «8 ядер и 8 потоков» вместо «4 ядер и 8 потоков» в примере с «8-ядерным» процессором. AMD устранила эту проблему с процессорами в серии Ryzen. Однако, проверка в Cyberpunk 2077 того, установлен ли процессор AMD, и как нужно соответствующим образом настроить количество ядер, работает неправильно и соответствует подсчету, который использовался до выхода новых процессоров AMD.

    Устаревший фрагмент кода для расчета потоков, который, как предположили пользователи, используется в игре:

    WORD cores, logical;
    getProcessorCount(cores, logical);
    DWORD count = cores;
    char vendor[13];
    getCpuidVendor(vendor);
    if ((0 == strcmp(vendor, "AuthenticAMD")) && (0x15 == getCpuidFamily())) {
    	// AMD "Bulldozer" family microarchitecture
    	count = logical;
    

    Новый фрагмент кода для расчета потоков:

    DWORD cores, logical;
    getProcessorCount(cores, logical);
    DWORD count = logical;
    char vendor[13];
    getCpuidVendor(vendor);
    if (0 == strcmp(vendor, "AuthenticAMD")) {
    	if (0x15 == getCpuidFamily()) {
    		// AMD "Bulldozer" family microarchitecture
    		count = logical;
    	}
    	else {
    		count = cores;
    	}
    }
    

    Пользователи пояснили, что, вероятно, эта проверка не «неправильная» сама по себе, но, возможно, ее не следовало изначально использовать в Cyberpunk 2077 в качестве способа оптимизации производительности системы пользователя и использования потоков. В любом случае, команда разработчиков игры может выпустить новый патч, где будет устранена эта проблема.

    Первоначально пользователи пробовали заменять строку 75 30 33 C9 B8 01 00 00 00 0F A2 8B C8 C1 F9 08 на значения 74 30 33 C9 B8 01 00 00 00 0F A2 8B C8 C1 F9 08. Однако скоро выяснилось, что такая замена не совсем оптимальна, так как она инвертировала некорректную проверку библиотеки GPUOpen, а не нейтрализовала ее проведение. На ПК с процессорами Intel такую замену производить не рекомендуется даже ради тестов.

    Вчера руководство студии CD PROJEKT RED взяло на себя ответственность за баги и проблемы, обнаруженные пользователями на старте игры Cyberpunk 2077.

    11 декабря вышел патч 1.04 для Cyberpunk 2077, исправляющий многочисленные ошибки в игре, включая механику квестов, геймплей, визуализацию персонажей, а также улучшающий производительность и стабильность как версий игры на ПК, так и для игровых консолей.

    Обновление публикации. 19 декабря 2020 года вышел патч 1.05, в котором была решена проблема с производительностью, использованию SMT и процессорами AMD. Правда, разработчики уточнили, что патч улучшает ситуацию только для 4-ядерных и 6-ядерных процессоров AMD Ryzen. Для обладателей 8-ми, 12-ти и 16-ядерных процессоров патч не помогает. Это происходит из-за того, что студия CD Projekt Red совместно с AMD протестировала различные конфигурация и выяснила, что улучшение производительности с SMT происходит только на процессорах с 6 ядрами и менее.

    См. также:

    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 78

      +24

      Возьму через полгода когда все починят.

        –25
        Я тоже. С торрентов.
          +21

          С торрентов и сейчас можно, ибо GOG — безо всяких DRM (кстати, за счет предзаказов они уже покрыли все расходы, что в очередной раз показывает особое отсутствие пользы от всяких Denuvo).

            –31

            Если бы пользы от Денуво не было бы, то ее никто бы не ставил. Это денег стоит.

              +14

              Денуво взламывают, через несколько дней после релиза. В итоге пиратка меньше тормозит, чем оригинальная. Точно пользу приносит?

                +2
                Чето не похоже на несколько дней crackwatch.com/games
                  +1

                  Тот же мортал комбат ломали почти год.

                    0

                    Это может означать отсутствие интереса и/или временнЫх ресурсов у людей с необходимыми знаниями и навыками. В этом и есть выгода Denuvo — если нельзя написать универсальный кряк, то взлом будет отложен во времени. Т.е. скорее всего — если игрушка будет достаточно популярной — взломают всё равно, но позже. И чем позже, тем выгоднее.

                      0
                      А зачем ломать мультиплеерную игру то вообще?
                        +1
                        Чтобы поиграть. Я в какой-нибудь апекс не играл лишь потому, что она без вирусной программы не работает, а так как она якобы бесплатна, то её никто не ломал. Так и живём.
                      0

                      Anno 1800 не сломали до сих пор. А скоро уже 2 года будет с момента выхода.

                        +3
                        Неуловимый Джо?
                          0

                          Аудитория конечно поменьше, чем у Киберпанка, но поклонников у серии хватает.
                          Самому интересно, почему ее еще не сломали на самом деле.

                      +7

                      Польза, безусловно, есть. Для менеджера, который предложение вносит.

                      +8
                      От Denuvo есть определённая польза — им «оснащались» все копии CP2077 для журналистов (которые были разосланы за десять дней до релиза) во избежание слива.
                        +2
                        черт, а это правильное применение
                        +1
                        Только в случае большой фанатской базы. В остальных случаях есть шанс и не окупить
                        +21
                        Вот бы Вам зарплату тоже торрентами платили.
                          –32
                          Зоозащитник? Не волнуйся ты так за мою зарплату — мне её вообще не платят :)
                          • UFO just landed and posted this here
                            +1
                            В глубинке РФ так и происходит.
                            +10
                            Я тоже. С торрентов.

                            Вы только потом не обижайтесь, когда все игры будут исключительно через какую-нибудь гугл-стадию и джифорснау. С помесячной подпиской.Я сейчас все игры стараюсь покупать, и покупать на ГОГ, чтобы поддерживать хороший проект.
                              +3
                              За что заминусовали? Я тоже с торрентов скачал, честно купленную gog'овскую версию. Просто Gog предлагает или ставить левое ПО, или качать вручную архив из 27 частей на 100 гигов, из которых почти половина это озвучки на всех языках, а на торрентах уже установленная версия только с нужными мне данными.
                                +5

                                за то, что сообщение подразумевает не честно купленную?

                                  +1
                                  Торрент != пиратство.
                                    +1
                                    но когда говорят про игру: «возьму с торрентов», то практически всегда подразумевается именно пиратство.
                                      +1
                                      Всё равно это не повод осуждать человека. Если у него нет лишних денег на игры, то лучше пусть спиратит, потом похвастается друзьям, а там кто-то да купит, чем совсем играть в них не будет.
                                    +2
                                    Больше всего в контексте разговора мне понравился Humble Bundle.
                                    После покупки, получаешь доступ к торрент-ссылке!
                                    *звук разрываемого шаблона*
                                    0

                                    Но ведь лаунчер "есть не просит", зато даёт огромную скорость закачки (около 40 мегаБАЙТ в секунду), автообновления с гарантированным сохранением прогреса игры и т.д. Что в нём плохого? Такуя сырую игру ещё много будут обновлять и патчить — и без лаунчера прдётся каждый раз качать и переустанавливать

                                      –1
                                      Но ведь лаунчер «есть не просит»,

                                      Просит. Мне не нужны программы для запуска программ, у меня ОС есть. А обновляться на ходу ну такое себе, если только стопор в сюжете или серьёзные тормоза.
                                      около 40 мегаБАЙТ в секунду

                                      Выше тарифа всё равно не прыгнет, а у меня 100 мегабит. И торрент выжирает любую сеть.
                                      и без лаунчера прдётся каждый раз качать и переустанавливать

                                      Как я уже написал, у меня установленная версия. Просто папка с игрой по сути. Так что тут проблем нет.
                                        0

                                        Это уже идеологический спор) Уверен, та сотня мб диска, занятая лаунчером стоит меньше, чем 5 минут времени, которые Вы потратили на поиск торрента.

                                          0
                                          5 минут времени

                                          Рутрекер у меня в поисковых системах, так что поиск занимает несколько меньше ))
                                          Да, идеология, не спорю, а мягко и ненавязчиво продвигаю своё видение мира, чтобы через некоторое время не остаться без выбора.
                                          –4
                                          Предлагаю эксперимент — проверить антивирусами любую игру на торрентах 5 летней давности и посмотреть на список зловредов в каждой игре

                                          Тот же эксперимент можно повторить в 2025 по отношению к cyberpank 2077
                                            –1
                                            Проверил, не нашёл. Что я делаю не так?
                                              –1
                                              о какой игре идёт речь? Любопытно даже стало. Неуж-то те технологии обфускации ещё держатся
                                          0
                                          с торрента такая скорость тоже не редкость, если раздача популярная. и в то же время лаунчер ничего не гарантирует, с того же стима у меня то 50 мегабайт, то ~5. ну и плюс я, например, в очередной раз не потратил деньги в никуда, т.к. игра крайне не стабильна и через чур требовательная на лоу енд железе (у меня 1063, 900п все лоу и в итоге 40-50 фпс с рывками, грубо говоря пустое поле игра не может в 60 фпс отрендрить). как (если) поправят можно будет и купить
                                    +10

                                    Нету в бульдозерах никакой SMT. Там просто число блоков работы с плавающей запятой 4, а блоков работы с целыми числами — 8.
                                    В играх, скорее всего, от дополнительных 4 ядер нет профита, из-за чего такой код появился, но в не математических приложениях профит есть.

                                      +1
                                      Была какая то проблема на некоторых процессорах, при использовании логический ядер, все жутко тормозило. И для игр использовали спец настройку или запускали через бантинк чтобы работали только физические ядра.
                                        +1

                                        Да. Вот у меня Sandy Bridge, и я через BIOS вообще отключил HT нахрен, потому что никакой прибавки к скорости от него нет, а в вычислениях, наоборот, производительность проседает.

                                          0
                                          В киберпанке между i5-2500K и i7-2600K почти полуторакратная разница.
                                            0

                                            Ссылочкой на тест не поделитесь? Не верю.

                                              0
                                              www.youtube.com/watch?v=rCtXMxkj6Ak
                                              Можете сами проверить, установив минимальные настройки графики с минимальным разрешением и скейлингом 50%, включая и отключая HT/SMT в биос (ограничив количество ядер, если проц не грузится на 100% с вашей видеокартой).
                                                0

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


                                                Всё дело в том, что при обращении к видеокарте CPU ожидает результата в busy wait. DX12 позволяет обращаться к видеокарте из нескольких потоков — как следствие, более количество потоков нужно для эффективной загрузки видеокарты. При этом эти потоки ничего полезного не делает, они только ожидают выполнения команд.


                                                А вот в DX11 такого эффекта наблюдаться не должно. Многопоточность используется для формирования очереди команд, но сами команды отправляются из одного потока.

                                                  0

                                                  Там видно, как 2500 ложится в полку.


                                                  Ожидающие потоки планировшик вытеснит, они же не на while(true) ждут?

                                                    +1
                                                    Ожидающие потоки планировшик вытеснит, они же не на while(true) ждут?

                                                    Не вытеснит. Они именно что ждут на while (!gpu_ready()) { spin(); }. Сихронизация же через планировщик будет слишком долгой.

                                        +3
                                        вместо «4 ядра и 4 потока"

                                        instead of «4-cores 8-threads»

                                        небольшая неточность.
                                          +11

                                          И на одной картинке — 16-тиядерник с загрузкой в 18 потоков, а на другой — 6-тиядерник в 12 (а больше нету) потоков.
                                          При этом в первом случае описанное поведение — желательно.

                                            0
                                            Вот такой вопрос, а как можно было догадаться, что нужно открыть exe-шник игры в Hex-редакторе и поменять определённую строку в нём?
                                              +8

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

                                                0
                                                Ассемблировать не надо, здесь просто поменяли код операции одной из команд, например, заменив условный переход на безусловный. Предполагаю, что специалисты, способные на это, знают КОПы наизусть…
                                                  0

                                                  Не буду говорить за всех, но лично мне порой очень помогает armconverter — там можно задизасмить кусочек кода, подредактировать его и ассемблировать обратно — имхо, удобнее чем опкоды заучивать.
                                                  Хотя порой удобнее как раз в hex' е опкоды менять, бывало и такое (когда попадались dex' ы которые были собраны как-то по особому и не работали после простой разборки-сборки).

                                                    0
                                                    Дизассемблер Hydra умеет это на лету :)
                                                    +1
                                                    Предполагаю, что специалисты, способные на это, знают КОПы наизусть…

                                                    И ксорят дворды в уме, ага.
                                                    +2
                                                    Насколько я знаю, все началось изначально с попытки завести игру на старых процессорах — www.youtube.com/watch?v=PahP9mPZNbU
                                                    +3
                                                    Реверс-инжиниринг и ассемблер позволяют творить чудеса.
                                                      0
                                                      Ещё можно вспомнить проект XRayExtensions.
                                                      А так же мой форк этого проекта XRayExtensions 2.
                                                      У меня этот процесс автоматизирован, например, автоматически меняют адреса релокации. Добавляется новые секции.
                                                        0
                                                        Я правильно понимаю, что эти dll-ки достаточно кинуть в папку со Сталкером?
                                                          0
                                                          Да, заменяешь оригинальные файлы на пропатченые, и вперёд.
                                                          Вот тут другая технология используется.
                                                          github.com/yamashi/PerformanceOverhaulCyberpunk
                                                          Пропатчивает дллка после разгрузки, можно использовать если исполняемый файл упакован протектором. А у меня файл должен быть без всяких упаковщиков, протекторов.
                                                        0

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


                                                        Потом мне показалось этого мало, и я вместо библиотечки решил дописать свой код прямо в исходный exe. Но там места не было достаточно. Добавил свою секцию.


                                                        Забавное это развлечение, но, увы, отнимает много времени...

                                                        +3

                                                        За столько лет ожиданий игры про киберпанк можно было уж и подготовиться...

                                                          +2

                                                          Очень просто. Дизассемблер в руки и вперед. Точно таким же методом фиксил игры, например, меняя какой нибудь игровой лимит, захардкоженный в приложеньку. Удивление вызывает скорее, что экзешник ничем не запакован и не обфусцирован

                                                            +2
                                                            Удивление вызывает скорее, что экзешник ничем не запакован и не обфусцирован

                                                            Так оно же в Gog лежит, там только чистые игры, безо всякого оверхеда на пережёвывание вложенных виртуальных машин.
                                                          +6

                                                          Что-то мне подсказывает, что после такого патча производительность в игре только упадёт, особенно для 16-ядерника. С ростом числа потоков возрастают накладные расходы на синхронизацию, закон Амдала также никто не отменял. Также не стоит забывать, что SMT — не бесплатный, это просто разделение ресурсов ядра. Второй поток, работающий на том же ядре, будет существенно замедлять первый поток.


                                                          Да и тесты современных игр показывают достижение оптимальной производительности при 6-8 ядрах, а дальнейшее повышение числа ядер для некоторых игр уже приводит к снижению FPS.


                                                          Так что я считаю описанное в статье поведение для 16-ядерника желаемым. Судя по графику загрузки процесса, я не вижу, что игра упирается в проц. А вот для 4-6-ядерников возможны варианты.

                                                            0
                                                            Для 12 и 16 ядер эффекта не заметили. А вот владельцы 6-8 ядерников очень рады, например на конфигурациях типа 5600х + RTX3080. Главное перед патчем посмотреть в диспетчере, упирается ли игра в видеокарту или процессор, и если не в видеокарту, проанализировать загрузку ядер процессора.
                                                              +3
                                                              Тут дело в том, что подобный «патч» не заставляет игру использовать больше ядер, он просто дает возможность ими пользоваться. Если бы игру можно было заставить использовать все ядра простым HEX-патчем, любители старых игр открыли бы какой-нибудь дорогой алкоголь в честь такого события…
                                                                +4

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


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

                                                                  0
                                                                  Судя по всему таки не библиотеке, а игре в целом, а уж для чего она там это использует внутри хрен его знает. Упоминаемый репозиторий это обычный пример, который через WinAPI определяет число ядер. От GPUOpen там ноль строчек кода. Разрабы скопипастили его, не читая, хотя код неверный.
                                                                0
                                                                Да и тесты современных игр показывают достижение оптимальной производительности при 6-8 ядрах

                                                                Это какие игры? Думаю, что игры, использующие DX12 или Vulkan, наоборот, не деградируют при увеличении используемых ядер CPU, т.к. само API заточено на асинхронность, в отличие от DX11 (и ниже) или OpenGL

                                                                0
                                                                У меня как-то и без патчевания используются все ядра. Учитывая тот факт что на втором скрине где «пропатчено» всего 6 ядер, а не 16 — допускаю, что обычные пользовательские процессоры патчить и не нужно. Вполне возможно что в случае с 16-ти ядерным процессором так было сделано намеренно.
                                                                скрины
                                                                image
                                                                image
                                                                  0
                                                                  Используются, но не полностью. Понятно, что часть остаётся системе и другим приложениям. Видно, что часть используется не полностью, и видеокарта простаивает. На 1600 результаты патча у людей с реддита были замечательные. Пропатчить несложно, сохранив оригинал.
                                                                  +4
                                                                  Заголовок: «игнорирует многопоточность микропроцессора AMD»
                                                                  На самом деле: «использует 16 логических ядер из 32» (при том что для игр, логику в которых частенько трудно распараллелить, 16 это довольно-то дофига)
                                                                    0
                                                                    Это иллюстрация. Такая же картина и для 6-8 ядерных, где включение логических ядер существенно улучшает FPS.
                                                                    +5
                                                                    На форуме было предложено решение — изменить несколько байт в EXE-файле игры. Нужно в Hex-редакторе найти строку 75 30 33 C9 B8 01 00 00 00 0F A2 8B C8 C1 F9 08 и изменить ее на EB 30 33 C9 B8 01 00 00 00 0F A2 8B C8 C1 F9 08.

                                                                    Люди, наверное, реально думают, что это какая-то черная магия. А тут всего лишь замена JNZ на JMP (75 => EB). То есть принудительная активация некоего условия.


                                                                    Первоначально пользователи пробовали заменять строку 75 30 33 C9 B8 01 00 00 00 0F A2 8B C8 C1 F9 08 на значения 74 30 33 C9 B8 01 00 00 00 0F A2 8B C8 C1 F9 08.

                                                                    А это мне видится как кривой патч с самого начала, потому что вместо JNZ делалось JZ. (75 => 74). То есть действительно, инвертируется условие перехода. И маловероятно, что разработчики допустили ошибку, перепутав TRUE с FALSE.

                                                                      0
                                                                      В этом случае на ПК с процессорами AMD станут использоваться все логические ядра центрального процессора, а производительность игры улучшится на 10-20%.

                                                                      Как-то слишком уж безапелляционно. Да, ядра использоваться начнут. Но далеко не факт, что это даст какой-то выигрыш по производительности. Во-первых, я более чем уверен, что в подавляющем большинстве случаев узкое место — GPU. Так что увеличение пропускной способности и/или отзывчивости CPU хоть на 20%, хоть на 50% ничего не даст. Во-вторых — не нужно забывать, что SMT/HT ядра только в диспетчере задач неотличимы от "настоящих". На деле же заметный выигрыш в производительности они могут дать в довольно ограниченных сценариях и типичная игра в эти сценарии не входит.


                                                                      У меня вот на 3950X/RTX 3080 при игре на 1440p и около-максимальных настройках графики производительность от данного патча не улучшается. Может даже немного ухудшается. Жаль что в игре нет нормального бенчмарка.

                                                                      +4
                                                                      Это побочный квест
                                                                        +2
                                                                        Помимо этого еще обнаружили некоторые очень странности по количеству памяти выделяемой игре, возможно кому то это поможет www.reddit.com/r/cyberpunkgame/comments/kccabx/hey_cd_projekt_red_i_think_you_shipped_the_wrong
                                                                        Вообще уже есть github репа в которую потихоньку стекаются все эти фиксы. Патчинг силами комьюнити. github.com/yamashi/PerformanceOverhaulCyberpunk
                                                                        Интересно что бы было если CD Project выложили исходники к игре?
                                                                          +1
                                                                          Хех на то он и сайбер панк )

                                                                          Only users with full accounts can post comments. Log in, please.