Repository navigation
perf(host): keep the game's threads on the 3D V-Cache cores of two-CCD X3D CPUs - #1638
Merged
Merged
Conversation
…cores that share the 3D V-Cache
A 7900X3D, 7950X3D, 9900X3D or 9950X3D has the big L3 on one CCD only (96 MB against 32 MB). Windows moves a game there only when its Game Bar knows the program as a game; it does not know this one, so the game's threads ran on both CCDs, and the replay's reserved core (the last core of the fastest kind) is on the CCD without the cache.
Now, where the CPU's L3s differ in size and the largest is shared by 8 or more logical processors, the game's threads are kept to those (hos_cache_cpus, pick_cache_cores), and no core is kept apart for the replay there: they are 8 cores at most, and with one of them reserved the replay got faster still but the game's threads had 7 cores and the frame rate did not rise (below). The renderer's own workers (shader translation, pipelines) are not held to them. One L3 for all, L3s of one size (a 7950X) or fewer than 8 processors on the largest: as before. HOS_CACHE_CORES=0: every core, as before; HOS_RESERVE_CORE=1 keeps the replay's core all the same.
Measured unattended on a Ryzen 9 9950X3D (SMT off), RTX 4070 SUPER, 2560 x 1440, the same scripted input in every run, HOS_CACHE_CORES=0 against the default:
Castle Town's market, DLSS Quality, ~2,400 draws (23-25 two-second windows a run)
fps slowest window replay ms a frame
every core (two runs) 57.0, 56.7 55.1, 53.4 11.84, 12.47
with this (two runs) 59.8, 59.6 58.2, 58.0 10.82, 10.49
Hyrule Field, DLAA, ~2,150 draws (frame rate at its 60 cap in both)
every core replay 8.09 ms a frame
with this replay 6.61 ms a frame
(On v2.0.11's code the same comparison gave 56.9-58.0 fps against 59.8-59.9 over four runs each, and 59.6-59.9 with the process held to the first CCD by hand. With one of the 8 cores kept for the replay there: 56.9-57.4 fps although the replay took 9.8-10.0 ms.)
Not measured: SMT on (16 logical processors on the cache CCD), the 12-core parts, and whether the game's threads would do better still with the replay on a core of its own when there are more than 8.
Checked: tests/test_reserved_core.py passes with clang++ (new cases for pick_cache_cores: 9950X3D with and without SMT, 7900X3D, the cache on the second CCD, a 7950X, one L3 for all, two L3s of the largest size).
Assisted-by: Claude Mythos 5.2
Co-Authored-By: Claude Mythos 5.2 <noreply@anthropic.com>
…e largest has 8 cores (review of NotRexed#1638) "L3s of different sizes, the largest shared by 8 or more logical processors" also matched CPUs that are not X3D: a Ryzen AI 9 HX 370 has 4 Zen 5 cores on a 16 MB L3 and 8 Zen 5c cores on an 8 MB one, and with SMT the 16 MB one is shared by 8 logical processors, so the game's threads would have been squeezed onto 4 cores and the reserved core dropped. Now the choice is made only where every L3 is shared by as many logical processors as the others (an X3D's CCDs are alike but for the cache; a hybrid CPU's two kinds of core are not) and the largest has 8 or more cores, counted as cores, not logical processors. So the 12-core 7900X3D and 9900X3D (6 cores on the cache CCD) are left as they were with SMT on as with it off, until one is measured; before, SMT on halved the game to 6 cores and SMT off left it alone. Nothing where the cores could not be read. The comments say what was measured (a 9950X3D, SMT off: with SMT the 8 cores are 16 logical processors, not measured), that this is Windows only (Linux keeps the last core, which on these CPUs is on the CCD without the cache), and that HOS_RESERVE_CORE=1 keeps the last core of the fastest kind, normally on the other CCD, not the cache core of the 9.8-10.0 ms measurement. tests/test_reserved_core.py: the HX 370 with and without SMT, L3s shared alike with 4 cores on the largest, the 7900X3D with SMT now none, no core read: none. It does not compile against the code before this. Assisted-by: Claude Mythos 5.2 Co-Authored-By: Claude Mythos 5.2 <noreply@anthropic.com>
NotRexed
pushed a commit
that referenced
this pull request
Nov 11, 2026
🤖 I have created a release *beep* *boop* --- ## [2.1.0-rc.1](v2.0.14...v2.1.0-rc.1) (2026-11-11) ### Features * Add a control to disable camera centering ([2dcf210](2dcf210)) * Add an option to disable automatic camera centering ([657da4f](657da4f)) * Audio tab in the Insert menu with Volume and Mute in background ([52ca067](52ca067)) * Audio tab in the Insert menu with Volume and Mute in background ([df2d84c](df2d84c)) * **builder:** let the player choose how much memory a build may take ([90055d0](90055d0)) * **builder:** the Linux builder looks like the Windows one ([8c1b5e9](8c1b5e9)) * **builder:** the Linux builder looks like the Windows one ([8f2e1a1](8f2e1a1)) * **builder:** use the saved build memory choice for updates ([86ff22c](86ff22c)) * **builder:** warn before building on a hard drive ([b526a84](b526a84)) * **builder:** warn before building on a hard drive ([c769305](c769305)) * **build:** Probe for system Vulkan packages, add proper requirements ([3b84291](3b84291)) * **build:** Probe for system Vulkan packages, add proper requirements.txt ([155bfa2](155bfa2)) * **linux:** opt-in NVIDIA DLSS in Linux Builder and AppImage ([484cfd1](484cfd1)) * **linux:** opt-in NVIDIA DLSS in Linux Builder and AppImage ([66b86fb](66b86fb)) * **menu:** a DualShock 4 or DualSense touchpad click opens the menu as F1 ([8790b8f](8790b8f)) * **menu:** a Mesh shaders row (Automatic, Native, Compute) ([#1971](#1971)) ([c8022e7](c8022e7)) * **menu:** a Text size row for dialogue, Navi and signs ([4d0645f](4d0645f)) * **menu:** a Text size row for dialogue, Navi and signs ([4bae30c](4bae30c)) * **menu:** add 5120x2880 (5K) to Output resolution ([ce175ac](ce175ac)) * **menu:** centre the menu in a 16:9 column on ultrawide ([70e2209](70e2209)) * **menu:** DLAA as DLSS's Native render resolution, and Render resolution as a slider in real sizes ([#2000](#2000)) ([e187859](e187859)) * **menu:** Esc can open the Insert menu (Menu shortcut "Insert, F1 or Esc") ([#1998](#1998)) ([d926317](d926317)) * **menu:** let players choose the keyboard shortcut ([#1609](#1609)) ([191cfdc](191cfdc)) * **menu:** put the debug tools on the Debug tab ([e256616](e256616)) * **menu:** redesign the Debug tab, Inventory and Teleport pages ([c805d9b](c805d9b)) * **menu:** save Output resolution as a size, and take any size from the config ([a78ee4d](a78ee4d)) * **menu:** the debug tools' Teleport row opens the map list ([a4c3a8d](a4c3a8d)) * RecompLauncher support (recomplauncher.json, make_game --game/--prepare) ([ab5a1f6](ab5a1f6)) * **startup:** lower the start-up screen, smaller text, fade to black at the end ([8649805](8649805)) * **startup:** lower the start-up screen, smaller text, fade to black at the end ([fb60134](fb60134)) * **vk:** add AMD Anti-Lag 2 (VK_AMD_anti_lag) ([8ea4e7f](8ea4e7f)) * **vk:** add opt-in VRAM compaction and hold the driver's count below its limit ([3932421](3932421)) * **vk:** AMD Anti-Lag 2 through VK_AMD_anti_lag ([b9e7559](b9e7559)) * **vk:** Anisotropic filtering option, 16x by default, and the upscalers' texture LOD bias ([0af7629](0af7629)) * **vk:** Anisotropic filtering row, 16x by default ([d9b0ce2](d9b0ce2)) * **vk:** draw the menu, FPS counter and start-up screen with Dear ImGui ([509579b](509579b)) * **vk:** opt-in VRAM compaction (RX_VK_COMPACT=1): the textures' free space goes back to the driver ([d218438](d218438)) * **vk:** trace effective presentation geometry on changes ([#1457](#1457)) ([a350759](a350759)) * **vk:** upscalers' texture LOD bias below the game's 3/4 render ([3b9ffcd](3b9ffcd)) * **vk:** warm the stage libraries from the program cache into the pipeline cache ([24ebac7](24ebac7)) ### Bug Fixes * a game folder whose deepest file passes 260 characters builds and plays ([#1468](#1468)) ([d231d17](d231d17)) * a game folder whose deepest file passes 260 characters builds and plays ([#1468](#1468)) ([45c7418](45c7418)) * Address camera centering review feedback ([103e2cd](103e2cd)) * **appimage:** copy sysroot library aliases by value for updates ([#1536](#1536)) ([ed66422](ed66422)) * **audio:** keep 512-frame power-of-two default on SDL2 fallback ([#1550](#1550)) ([fa85175](fa85175)) * **build:** a game built from extracted folders refuses links in them ([233e072](233e072)) * **builder:** --cli says make_game's own error, on stdout too ([a3859f1](a3859f1)) * **builder:** bound writes from compressed NUP members ([#1596](#1596)) ([56e31e7](56e31e7)) * **builder:** constrain the Show details hit area ([d45e262](d45e262)) * **builder:** constrain the Show details hit area ([080bf91](080bf91)), closes [#1842](#1842) * **builder:** give the prepare shaders tick its own row ([1ace933](1ace933)) * **builder:** honor DLSS opt-in when updating a game ([#1643](#1643)) ([c3aa9c0](c3aa9c0)) * **builder:** report bytes during NUP extraction ([#1671](#1671)) ([c4a9085](c4a9085)) * **builder:** select the saved build memory in BeginUpdate ([d08aaed](d08aaed)) * **builder:** the Linux builder's details box is read-only ([b2ac2bf](b2ac2bf)) * **builder:** the Linux builder's details box is read-only ([d7cc1d4](d7cc1d4)) * **build:** escape the build folder in glob patterns (a work folder with [ ] found no lifted code) ([#1722](#1722)) ([caaee0b](caaee0b)) * **build:** invalidate DLSS objects when SDK headers change ([#1648](#1648)) ([c716137](c716137)) * **build:** package scripts/ in the Linux AppImage, so NVIDIA DLSS can be fetched ([b0aa6f6](b0aa6f6)) * **build:** package scripts/ in the Linux AppImage, so NVIDIA DLSS can be fetched ([af9e98c](af9e98c)) * **build:** stop sampling memory for exited compiler roots ([#1562](#1562)) ([4a7ae1b](4a7ae1b)) * **build:** the logo and fonts are made only where the Vulkan back end is compiled (an AppImage build stopped at LibertinusSans-Regular.ttf) ([#1567](#1567)) ([6add2f1](6add2f1)) * Discord status starts on Windows (it was only started in the Linux build's main) ([#1539](#1539)) ([7d1562d](7d1562d)) * **display:** address pointer sampling review feedback ([acf9dae](acf9dae)) * **display:** do not toggle fullscreen on F11 when modifier keys are held ([#1309](#1309)) ([#1608](#1608)) ([635ba1a](635ba1a)) * **display:** integrate coherent game-menu pointer samples ([09685de](09685de)) * **display:** integrate main and declare pointer fixture requirements ([8a6f1e5](8a6f1e5)) * **display:** open the window on COSMIC's Wayland with SDL2 ([#992](#992)) ([e937168](e937168)) * **display:** publish coherent pointer and drawable samples ([fd93173](fd93173)) * **display:** publish coherent pointer and drawable samples ([ee53072](ee53072)) * **env:** hookshot_env.txt sets no test switch that names a file or presses buttons ([74cee1e](74cee1e)) * **framegen:** 2x made by the renderer's own blend again; AMD FSR 3.1's interpolation opt-in (RX_VK_FSR_FG=1) ([eb5b9a0](eb5b9a0)) * **framegen:** 2x uses the renderer's own blend again; FSR 3.1 interpolation opt-in ([#1635](#1635)) ([3b76e95](3b76e95)) * hardening part 3, updates, shared files, guest buffers and texture sizes ([d5feb7b](d5feb7b)) * **hid:** deduplicate gamepad polling when SDL controllers are active ([#1480](#1480), [#1583](#1583)) ([2b0f762](2b0f762)) * **hid:** deduplicate gamepad polling when SDL controllers are active ([#1480](#1480), [#1583](#1583)) ([731898a](731898a)) * **hos:** host copies, file reads and writes, and the NV12 reader stay in guest memory ([6f8f243](6f8f243)) * **host:** room in the drivers' shader caches for the prepared pipelines (Linux) ([#2033](#2033)) ([c9ec3bb](c9ec3bb)) * **host:** the cache cores only where the L3s are shared alike and the largest has 8 cores (review of [#1638](#1638)) ([428633a](428633a)) * **input:** a stick axis steers once it has been seen at rest (camera spinning on its own, [#1673](#1673), [#1661](#1661)) ([#1677](#1677)) ([d8f0513](d8f0513)) * **linux:** safely rebase legacy sysroot links ([#1553](#1553)) ([ca3a252](ca3a252)) * **loader:** add the addend to GLOB_DAT and JUMP_SLOT relocations ([1372edb](1372edb)) * **loader:** add the addend to GLOB_DAT and JUMP_SLOT relocations ([95a9a07](95a9a07)) * **make_game:** --prepare says errors and --check on stdout, and refuses a missing --game ([2d27d08](2d27d08)) * **menu:** A and B confirm and go back on a controller, as in the game ([02b0903](02b0903)) * **menu:** a save keeps the options file's lines the menu does not write ([#1493](#1493)) ([a2e6505](a2e6505)) * **menu:** a size from the config shows as its size alone, no label ([bc9406c](bc9406c)) * **menu:** clarify frame-generation preset help ([#1554](#1554)) ([77685a5](77685a5)) * **menu:** distinguish game and generated frame rates ([#1659](#1659)) ([b2bb214](b2bb214)) * **menu:** F1 always opens the menu (Menu shortcut: Insert or F1, or F1 only) ([#1632](#1632)) ([d448ccc](d448ccc)) * **menu:** Frame generation is the player's choice; Quality presets leave it alone ([2ef499d](2ef499d)) * **menu:** hide rows for features this PC lacks, and keep mouse clicks on the row meant ([51de681](51de681)) * **menu:** hide rows for features this PC lacks, and keep mouse clicks on the row meant ([849b63e](849b63e)) * **menu:** keep the FPS counter off the banner on a window just wider than 16:9 ([#1545](#1545)) ([50d71bd](50d71bd)) * **menu:** keep the help box and rows above the prompt strip ([bd1616f](bd1616f)) * **menu:** Menu size is Medium on every input, and the version shrinks to fit ([73feec0](73feec0)) * **menu:** Quality presets leave Frame generation alone, so it stays off by default ([a72690c](a72690c)) * **menu:** run the upscalers' one-time probes during the start-up screen, not at the menu's first open ([#1886](#1886)) ([#1916](#1916)) ([74075de](74075de)) * **menu:** the FPS counter looks as it did (green outlined text in the corner, no plate) ([#1957](#1957)) ([92907f7](92907f7)) * **menu:** the mouse wheel scrolls, it never changes a value ([#1557](#1557)) ([be541fa](be541fa)) * **nup:** name the member and the drive when extraction runs out of space ([#1595](#1595)) ([218d8de](218d8de)) * **packaging:** include the prompt encoder's runtime dependency ([#1598](#1598)) ([53a5fd5](53a5fd5)) * preserve UTF-8 and extraction guards in long-path support ([#1592](#1592)) ([38a5794](38a5794)) * **render:** publish coherent shared temporal jitter samples ([a38a07d](a38a07d)) * **render:** publish coherent temporal jitter samples ([0291727](0291727)) * **render:** reset temporal history when reprojection is invalid ([0cf9936](0cf9936)) * **render:** reset temporal history when reprojection is invalid ([19b81b7](19b81b7)) * **rt:** mark an exclusive store's page after the store, not before ([7cb4028](7cb4028)) * **rt:** mark an exclusive store's page after the store, not before ([db6324f](db6324f)) * **scripts:** the profile readers name and count Linux samples ([#1746](#1746)) ([6269088](6269088)) * **security:** a font's cmap offset, a microphone's name, and the game's library loads stay in bounds ([9323390](9323390)) * **security:** verify Windows updater asset digests ([6d5f277](6d5f277)) * **security:** verify Windows updater asset digests ([50b6866](50b6866)), closes [#1679](#1679) * **setup:** explain how to restore missing Windows tar ([1c1995e](1c1995e)) * **setup:** explain recovery when Windows tar is missing ([fbaf722](fbaf722)) * **shaders:** a loop that leaves by predicated EXITs ends at its closing self-branch (the last program that did not lower) ([a8e7ee5](a8e7ee5)) * **shaders:** a program ends at its closing self-branch after an unconditional jump back ([7e1db37](7e1db37)) * **shaders:** an immediate's low byte is not a scratch register ([d0f3511](d0f3511)) * **shaders:** ISBERD.O, a task or mesh program reading back its output region ([67c048e](67c048e)) * **shaders:** ISBERD.O, a task program reading back its payload (12 failing pipelines) ([0904155](0904155)) * **shaders:** LDG [URn+imm] with both ordering bits 77-78 lowers ([692a1c0](692a1c0)) * **shaders:** LDG/STG [URn+imm] with ordering bit 78 lower (2 compute programs) ([5ec9668](5ec9668)) * **shaders:** lower TLD.MS (multisampled texel fetch) to Maxwell TLDS 2D.LZ.MS ([6860451](6860451)) * **shaders:** lower TLD.MS, a multisampled texture's texel, to Maxwell TLDS 2D.LZ.MS ([20dd78b](20dd78b)) * **shaders:** R2UR's source is one register, not a pair ([597edcb](597edcb)) * **shaders:** R2UR's source is one register, not a pair (a vertex program refused) ([9edb3a5](9edb3a5)) * **shaders:** STG [URn+imm] with ordering bit 78 lowers too ([923a334](923a334)) * **shaders:** two large compute programs lower (an immediate is not R254) and get their local memory ([10cfd70](10cfd70)) * the display stays on while playing with a controller ([#1532](#1532)) ([#1538](#1538)) ([c38df20](c38df20)) * **update:** Linux downloads are GETs again; a part's links stay in the install; the requested tag is installed ([df9a52e](df9a52e)) * **vi:** a cutscene's cues stay with its movie above a 60 cap ([a7cc747](a7cc747)) * **vi:** a cutscene's cues stay with its movie above a 60 cap ([#1742](#1742)) ([6c596af](6c596af)) * **vi:** keep the game at real speed under a Frame rate cap above 60 ([#1612](#1612)) ([1a429f6](1a429f6)) * **vk:** a masked clear that backed off is tried again now and then ([#1787](#1787)) ([fa04b6f](fa04b6f)) * **vk:** a masked clear whose pipeline the driver did not make is tried again, not cached as null ([#1787](#1787)) ([9d94f4c](9d94f4c)) * **vk:** a masked clear whose pipeline the driver did not make is tried again, not cached as null ([#1787](#1787)) ([f002c90](f002c90)) * **vk:** a shadow is made only where the textures' own lines are not passed (review of [#1637](#1637)) ([ecb6e9a](ecb6e9a)) * **vk:** a switch for an engine that cannot run leaves a saved FSR 3.1 ([#1773](#1773) review) ([a9ea73a](a9ea73a)) * **vk:** a texture's storage size is computed in 64 bits, and one past the GPU's limits is not made ([81a6da5](81a6da5)) * **vk:** add VMA image allocation retry without WITHIN_BUDGET ([39d978b](39d978b)) * **vk:** add VMA image allocation retry without WITHIN_BUDGET ([560cc5a](560cc5a)) * **vk:** admit only successful samplers across cache layers ([52ac35c](52ac35c)) * **vk:** admit only successful samplers across cache layers ([3379314](3379314)) * **vk:** ask for task and mesh shader counts only where the driver offers them ([ba86aee](ba86aee)) * **vk:** ask for task and mesh shader counts only where the driver offers them ([a3d88ea](a3d88ea)) * **vk:** ask the pipeline cache for a compute pipeline before queueing its build ([0db1e74](0db1e74)) * **vk:** avoid aligned uniform-word cache collisions ([1b25b22](1b25b22)) * **vk:** build every predicted pipeline before the game (the prediction found nothing on fresh builds; no 90 s budget; one progress bar) ([#2032](#2032)) ([ff85d7d](ff85d7d)) * **vk:** build the precompile's first graphics pipeline alone ([41b3438](41b3438)) * **vk:** capture jitter cache frame under its lock ([1f32a16](1f32a16)) * **vk:** check cached descriptor counts and the formats of noted pipelines ([59f9284](59f9284)) * **vk:** coloured specks on fallback foliage (AMD): the generated vertex stage's outputs start at (0,0,0,1) ([16631b6](16631b6)) * **vk:** commit bank cache generations after successful stream upload ([60ea984](60ea984)) * **vk:** compute programs get their local memory size (control section +0x68) ([a083825](a083825)) * **vk:** dark lighting and glowing bloom on AMD: 64-lane graphics warps and Lichii [#273](#273 fragment shuffle fallback ([030e605](030e605)) * **vk:** decode Deck gameplay upscale as RGB9E5 ([903bc4a](903bc4a)) * **vk:** decode gameplay RGB9E5 upscale fallback ([6c936d4](6c936d4)) * **vk:** dense grass cut off and far trees flickering without mesh shaders: fallback records from an allocator, 65535 slots ([7047756](7047756)) * **vk:** disable failed frame log sinks and unwind startup ([#1531](#1531)) ([5fde3cf](5fde3cf)) * **vk:** establish capture copy visibility for host reads ([7ef03d4](7ef03d4)) * **vk:** expose the retirement helper across renderer units ([d5b7437](d5b7437)) * **vk:** flush custom UI texture staging before GPU use ([#1559](#1559)) ([188baa6](188baa6)) * **vk:** invalidate capture readbacks before CPU reads ([0c6c047](0c6c047)) * **vk:** keep adjacent uniform words in separate cache slots ([7b81752](7b81752)) * **vk:** keep Windows prepare times in FILETIME ticks ([#1517](#1517)) ([edeaa9d](edeaa9d)) * **vk:** let a draw run its own queued shader translation ([#1714](#1714)) ([8bac8aa](8bac8aa)) * **vk:** log a driver fault caught by the Windows pipeline guards ([ac7d4a7](ac7d4a7)) * **vk:** make capture readbacks visible before CPU reads ([6e06af5](6e06af5)) * **vk:** make frame dump copies visible to host reads ([#1621](#1621)) ([c1a4fde](c1a4fde)) * **vk:** mark a clear's targets in the parallel replay's dry pass (the one-frame black scenes) ([adb7a5d](adb7a5d)) * **vk:** missing floor grass without mesh shaders: indirect task draws ran no mesh workgroups ([ccf7f41](ccf7f41)) * **vk:** own native FSR constants for each recording ([2982420](2982420)) * **vk:** own native FSR constants for each recording ([895d673](895d673)) * **vk:** parallel replay: a clear's targets are marked in the dry pass (the one-frame black scenes) ([168e4d1](168e4d1)) * **vk:** present ahead's vk_replay.cpp half, lost in [#1720](#1720 merge ([be8b512](be8b512)) * **vk:** present ahead's vk_replay.cpp half, lost in [#1720](#1720 merge (main doesn't link) ([1392ea3](1392ea3)) * **vk:** preserve brightness in flash sampling across capture sizes ([#1537](#1537)) ([6f5ecab](6f5ecab)) * **vk:** preserve contiguous words in the mixed uniform cache ([70ffaf2](70ffaf2)) * **vk:** preserve CPU write watches during pool imports ([#1434](#1434)) ([74dcb75](74dcb75)) * **vk:** prevent aligned uniform words from thrashing the cache ([78e1112](78e1112)) * **vk:** publish complete PNG captures and report failures ([#1604](#1604)) ([ba40a1a](ba40a1a)) * **vk:** publish complete screenshot resource sets ([#1472](#1472)) ([ff69134](ff69134)) * **vk:** publish recording stream writes before GPU submission ([d71739d](d71739d)) * **vk:** publish recording stream writes before GPU submission ([0e843bd](0e843bd)) * **vk:** publish texture staging slices before GPU reads ([#1672](#1672)) ([a6e2e14](a6e2e14)) * **vk:** Read texture handles from stage constant banks ([31933e4](31933e4)) * **vk:** Read texture handles from stage constant banks ([4654870](4654870)) * **vk:** recover recording stream and descriptor allocation failures ([fad4d16](fad4d16)) * **vk:** recover recording stream and descriptor allocation failures ([6e93f80](6e93f80)) * **vk:** reject failed descriptor-pool creation results ([6a51fc2](6a51fc2)) * **vk:** reject failed samplers before descriptor publication ([2914a73](2914a73)) * **vk:** reject missing RGB9E5 fallback views ([6f5f769](6f5f769)) * **vk:** reject unbound imported buffers and roll back ownership ([325583b](325583b)) * **vk:** reject unbound imported buffers and roll back ownership ([af8f012](af8f012)) * **vk:** replace menu upload buffers only after successful growth ([#1453](#1453)) ([60b0c9b](60b0c9b)) * **vk:** report device loss throughout native presentation ([5997b2d](5997b2d)) * **vk:** report device loss throughout native presentation ([8e1abe3](8e1abe3)) * **vk:** reset swap_spare with the swapchain; leave a skipped present out of the counts ([08f3fe4](08f3fe4)) * **vk:** retire native FSR images after GPU completion ([8fc2587](8fc2587)) * **vk:** retire native FSR images after GPU completion ([4aaf336](4aaf336)) * **vk:** retry transient texture image view failures ([8686552](8686552)) * **vk:** retry transient texture image view failures ([394b797](394b797)) * **vk:** RX_VK_FSR4 and RX_VK_DLSS go over a saved FSR 3.1 ([#1008](#1008) follow-up) ([4cde5c6](4cde5c6)) * **vk:** RX_VK_FSR4 and RX_VK_DLSS go over a saved FSR 3.1 ([#1008](#1008) review) ([6229c02](6229c02)) * **vk:** RX_VK_VRAM_MB and the integrated-GPU cap win over a preset's texture budget ([#1376](#1376)) ([e27740a](e27740a)) * **vk:** share validated source crops across presentation paths ([187e70b](187e70b)) * **vk:** share validated source crops across presentation paths ([d4c0429](d4c0429)) * **vk:** shared_pipeline_cache outside the unnamed namespace (vk_fsr3.cpp could not link to it) ([9d44621](9d44621)) * **vk:** slow resume and black HUD hearts on 4 GB cards: the texture squeeze waits while VMA's blocks have room ([189287f](189287f)) * **vk:** snapshot pending shots before reusing their readback slot ([#1519](#1519)) ([aaf6ac1](aaf6ac1)) * **vk:** submit a 2x set's copies together so its presents keep their times ([64cfe26](64cfe26)) * **vk:** submit a 2x set's copies together so its presents keep their times ([79e42ac](79e42ac)) * **vk:** the upscale stand-in and the texture clear call texture_written as before ([73c6dd3](73c6dd3)) * **vk:** tie texel buffer views to their imported backing ([692e87d](692e87d)) * **vk:** tie texel buffer views to their imported backing ([a23587f](a23587f)) * **vk:** Timestamp frame captures with the host clock ([3563479](3563479)) * **vk:** Use host timestamps in frame captures ([b2ed731](b2ed731)) * **vk:** validate capture dimensions before allocating readbacks ([#1551](#1551)) ([17e8cd8](17e8cd8)) * **vk:** validate HDR crops through the shared source rectangle ([f20afae](f20afae)) * **vulkan:** avoid the AMD cloth pipeline optimizer hang ([bebe51e](bebe51e)) * **vulkan:** finish the RX 6700 XT merge resolution ([5ffdaeb](5ffdaeb)) * **vulkan:** refresh direct-write tracking on current main ([a4c8f85](a4c8f85)) * **vulkan:** stop distant trees flickering in the mesh fallback ([7fc0a61](7fc0a61)) * **vulkan:** track writes from direct buffer bindings ([be1aabc](be1aabc)) * write-back stale-shadow edgecase ([c5aa906](c5aa906)) ### Performance Improvements * **host:** keep the game's threads on the 3D V-Cache cores of two-CCD X3D CPUs ([1360a44](1360a44)) * **host:** on X3D CPUs with two CCDs the game's threads stay on the cores that share the 3D V-Cache ([b3c0982](b3c0982)) * **host:** write the log in batches, a few writes a second instead of one per line ([c7e41fd](c7e41fd)) * **host:** write the log in batches, a few writes a second instead of one per line ([7f12643](7f12643)) * **vk:** a captured page's words read from the capture, not a 4 KB copy kept a thread ([0b951ec](0b951ec)) * **vk:** copy captured pages with non-temporal stores ([d8ce191](d8ce191)) * **vk:** copy captured pages with non-temporal stores ([146fe38](146fe38)) * **vk:** Descriptor reuse on by default (options_version 4) ([f758d9f](f758d9f)) * **vk:** Descriptor reuse on by default (options_version 4) ([f214c0c](f214c0c)) * **vk:** DLSS keeps its feature through loading screens while it is the Upscaler (a 44-78 ms stutter at each area entry) ([#1520](#1520)) ([549a43b](549a43b)) * **vk:** flush only each FSR uniform slice ([c7c88fa](c7c88fa)) * **vk:** FSR 3.1's passes go through the pipeline cache kept across runs ([e805e02](e805e02)) * **vk:** FSR 3.1's passes go through the pipeline cache kept across runs (a 1.7 s longer first frame of play) ([b27d9b6](b27d9b6)) * **vk:** FSR 3.1's pipelines through the play caches too (shared_compute_pipeline) ([46efc77](46efc77)) * **vk:** in play an ask without compiling goes through the play caches too ([#1765](#1765 dispatch, the stage libraries) ([6593de7](6593de7)) * **vk:** keep 32 submitted pages a thread, not one ([338837d](338837d)) * **vk:** keep four pages for the replay's reads as submitted, not one ([3bae557](3bae557)) * **vk:** keep four pages for the replay's reads as submitted, not one (Kokiri village view 50 -> 57 fps) ([72133cb](72133cb)) * **vk:** keep the write-back shadows while VRAM is full of free space inside VMA's blocks ([6a4f3ea](6a4f3ea)) * **vk:** less copying of captured memory on the game and replay threads ([e63d30d](e63d30d)) * **vk:** RX_VK_SUBMITTED_PAGES=1 keeps one submitted page, as before [#1762](#1762); tests follow [#1762](#1762) and [#1619](#1619) ([cfefd0e](cfefd0e)) * **vk:** skip write-backs of large GPU-written bindings ([2ea6386](2ea6386)) * **vk:** skip write-backs of large GPU-written bindings ([30911ca](30911ca)) * **vk:** the capture's copies split by one function; a caller runs its own parts no helper has taken ([c747a2c](c747a2c)) * **vk:** the capture's streaming-store copy is opt-in (RX_VK_CAPTURE_NT=1): more stutters, no lower capture time here ([#1841](#1841)) ([f4e6fdd](f4e6fdd)) * **vk:** the texture shadow's pages kept in place and copied by the capture helpers ([a4ccf07](a4ccf07)) * **vk:** the write-back shadows stay while VRAM is full of free space inside VMA's blocks ([23738b6](23738b6)) * **vk:** what play makes goes into a pipeline cache of its own, one file per save (no 0.5-1.2 GB rewrite in play) ([74c15be](74c15be)) * **vk:** what play makes goes into a pipeline cache of its own, one per save, not the whole cache again ([1b0ea22](1b0ea22)) * **vk:** write the pipeline cache only when its data changed (no 1.1 GB rewrite at every start) ([bd5086a](bd5086a)) * **vk:** write the pipeline cache only when its data changed since it was read or last written ([5a3fd42](5a3fd42)) * **vk:** write the pipeline cache only when its data changed since it was read or last written ([9f4fb8e](9f4fb8e)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
On Ryzen X3D CPUs with two CCDs (7900X3D, 7950X3D, 9900X3D, 9950X3D), busy places such as Castle Town's market run under 60 fps. The game's threads are spread over both halves of the CPU and only one half has the big cache.
What happens now
A 7900X3D, 7950X3D, 9900X3D or 9950X3D has the big L3 on one CCD only (96 MB against 32 MB). Windows moves a game there only when its Game Bar knows the program as a game. It does not know Hookshot, so the game's threads run on both CCDs, and the replay's reserved core (the last core of the fastest kind) is on the CCD without the cache.
The change
Where the CPU's L3s differ in size and the largest is shared by 8 or more logical processors, the game's threads are kept to those cores (
hos_cache_cpus,pick_cache_cores), and no core is kept apart for the replay there.HOS_CACHE_CORES=0: every core, as before.HOS_RESERVE_CORE=1keeps the replay's core all the same.Numbers
Ryzen 9 9950X3D (SMT off), RTX 4070 SUPER, 2560x1440, unattended runs with the same scripted input in every run. Built from 4a7ae1b,
HOS_CACHE_CORES=0against the default.Castle Town's market, DLSS Quality, about 2,400 draws, 23-25 two-second windows a run:
Hyrule Field, DLAA, about 2,150 draws (the frame rate is at its 60 cap in both): the replay takes 8.09 ms a frame on every core and 6.61 ms with this.
On v2.0.11's code the same comparison gave 56.9-58.0 fps against 59.8-59.9 over four runs each, and 59.6-59.9 with the process held to the first CCD by hand.
Not measured
SMT on (16 logical processors on the cache CCD), the 12-core parts, and whether the replay would do better on a core of its own when the cache CCD has more than 8.
Test
python -I -B tests/test_reserved_core.py(new cases forpick_cache_cores: 9950X3D with and without SMT, 7900X3D, the cache on the second CCD, a 7950X, one L3 for all, two L3s of the largest size).🤖 Generated with Claude Code