You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 2afc8fe
Browse filesBrowse the repository at this point in the historyBrowse files
Copy file name to clipboardExpand all lines: docs/development.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -123,7 +123,7 @@ The applied offset is always at least one step below the confirmed edge. Profile
123
123
124
124
## Testing
125
125
126
-
`core_tests` covers `src/core/` and runs in CI on a GitHub-hosted `windows-2025` runner, once normally and once under AddressSanitizer. CI also builds both executables, so a link error in the hardware layer is caught there.
126
+
`core_tests` covers `src/core/`, and `app_tests` the part of `src/app/` that can be tested with the driver libraries stood in for. Both run in CI on a GitHub-hosted `windows-2025` runner, once normally and once under AddressSanitizer. CI also builds both executables, so a link error in the hardware layer is caught there.
127
127
128
128
The hardware layer cannot run in CI (the runner has no GPU). It is checked by hand on the reference RTX 4070 through [hardware-checks.md](hardware-checks.md); record the results there.
Copy file name to clipboardExpand all lines: docs/hardware-checks.md
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -107,6 +107,8 @@ root; adjust the path for a Debug build.
107
107
| 77 | The fan tile says who has the fans during a run | Start an All in one run from the window (elevated) and read the **Fan speed** tile in each step; then again when the run has ended | yes | step 1 (stock) and step 3 (the undervolt): `N % (driver)`; step 2 (the overclock, once the card is warm enough for its fan curve): `N % (run)`; step 4, while a fan speed is being judged: `N % (tuning)`, with N the speed the line above the tiles names, and the text not cut off; step 5 (the final test): `N % (run)`; after the run: `N % (curve)` once the app's own curve has the fans again, or `(driver)` while they are in the stop zone; never `(driver)` while the card reports a speed set by hand | Pass for who has the fans; the last wording not seen in the fan step (2026-10-08, reference RTX 4070, driver 617.14, build a4da898, started elevated by a script that took pictures of the window; no process above 0.5 % on the card's 3D engine before the start; 33 minutes). Step 1: `57 % (driver)`. Step 2, nine minutes in: `61 % (run)`. Step 3, at the end of its soak: `66 % (driver)`. Step 4: with **Fan speed 55 %: waiting for the temperature to settle** above the tiles the tile read `55 % (measur`, and with **Fan speed 52 %** `52 % (measur`: the right state and the right speed, and the word cut off at the edge of the tile. Step 5: `55 % (run)` under **Final test: everything together**. The word is now `(tuning)`, as long as `(driver)`, which fits, and a tile draws a value that is wider than itself smaller (348 unit tests pass, one of them on the length of the labels). The build with that change, started after the run with the card idle: `0 % (driver)`, the other tiles unchanged. Not seen on the card: the word `(tuning)` itself during a fan tune, the smaller drawing of a value that does not fit, and `(curve)` after a run (the fans were in their stop zone). The run itself, a second clean one: `Applied: core +135 MHz, memory +1100 MHz, power limit 105 %, 2850 MHz at 1035 mV`, `Fans: 55 % keeps the card at 67 C under full load`; score 5731 and 5781 it/s (+0.9 %), core clock 2792 and 2819 MHz, memory clock 10491 and 11601 MHz, peak temperature 67 and 71 C, fan speed at the end 72 and 55 %, power 195 and 174 W (-10.8 %); no note about a disturbed final test. Against check 76: the memory scan ended lower this time (+1100, there +1500), and the fan tune, now with four looks before a speed counts as settled, stopped at 55 % where it had gone to 52 %. |
108
108
| 78 | A saved run switches apply-at-logon on | Elevated: `gao --boot off`, `gao --status` (`boot-apply: off`); start this build's `GpuAutoOptimizer.exe`; Optimize page: the checkbox **Keep the result applied at every logon** is shown and ticked; start a run (Cool & efficient is the shortest) and let it end; the result screen, `gao --status`, the dashboard. Again with the box unticked | yes | with the box ticked: the result screen ends `Saved, and applied at every logon from now on. There is nothing left to do.` and shows no **Apply at every logon** button; `gao --status`: `boot-apply: on (logon task registered)`, `boot copy: up to date`; the dashboard's **Apply at logon** switch is on; the checkbox is gone from the Optimize page. With the box unticked: `Saved. It stays applied until reboot; turn on apply at logon to keep it.`, the button, and `boot-apply: off` | Pass with the box ticked; unticked not run (2026-10-08, reference RTX 4070, driver 617.14, a build of 846b48d with the checkbox, started elevated by a script that took pictures of the window and clicked in it). `gao --boot off`: `boot-apply off: task removed, installed copy removed`; `boot-apply: off`. The Optimize page showed the ticked box with `Copies the app to Program Files and starts it in the tray at logon.` next to it. Cool & efficient, 8 minutes: `Applied: power 90 %, core +0 MHz, memory +0 MHz`; headers `Before (stock, 30 s)` and `After (5 min)` with the note about the short stock run under the table; `Saved, and applied at every logon from now on. There is nothing left to do.`, and only **Revert to stock** and **Back** under it. `gao --status`: `profile: cool: power 90 %, ... saved 2026-10-08 23:14`, `boot-apply: on (logon task registered)`. The tray app started from Program Files at the end of the script applied the profile that was put back (`boot copy: up to date`). Not done: a run with the box unticked, and a real log-off and log-on after it. |
109
109
| 79 | The page scrolls with the mouse on any card | Start `GpuAutoOptimizer.exe` in a window that is too low for the whole dashboard (its default size is). Turn the mouse wheel with the cursor on the **All in one** card, on the **Undervolt** card, on one of the four profile cards and on the tuning card | no | the page scrolls each time, as it does with the cursor between the cards | Pass for the two cards that failed (2026-10-08, reference RTX 4070, build of 6883a39 with the fix, version 0.4.0, started by a script that turned the wheel and took pictures). Before the fix the owner found that the page did not scroll with the mouse on the All in one card or on the Undervolt card: those two are as tall as their text, such a panel can be a pixel short of its contents, and it then kept the wheel for itself. Every card now passes the wheel on. With the cursor on the All in one card, two notches down: the card's top edge went from y 522 to y 355. With the cursor on the Undervolt card, one notch up: to y 439; one notch down again: back to y 355. The other cards were not tried with the script (they scrolled before). |
110
+
| 80 | A caught fault in an NVML call: no hang, the app restarts itself | With a local test build with a temporary patch that is never committed: `--inject-nvml-fault=S` gives one `nvmlDeviceGetTemperature` call a bad result pointer S seconds after the app started, so the call faults inside `nvml.dll` after NVML has counted it in. Not elevated, no other copy running. (a) `GpuAutoOptimizer.exe --inject-nvml-fault=8`, window open; (b) `GpuAutoOptimizer.exe --tray --inject-nvml-fault=6`; (c) `GpuAutoOptimizer.exe --resume --after-fault --hidden --inject-nvml-fault=3`. Watch the processes and their command lines | no | (a) within 2 s of the fault a new copy runs with `--resume --after-fault`, the first copy has exited with code 0 and the new one responds, window open; (b) the same with `--hidden` added and no window; (c) the copy goes on running and responding on the library it no longer shuts down, and makes way for a new one only 60 s after it started | Pass (2026-10-10, reference RTX 4070, driver 617.42, test build of c7f18c9). What it is for: on 2026-10-09 the window froze for good during an All in one run (v0.4.0 build; the NVIDIA installer had replaced driver 617.14 by 617.42 ninety seconds before the run, with the app running, and the process still had the 617.14 `nvml.dll` loaded). The driver reset at memory +2550 MHz, as it does at that edge; the card ended at stock. A dump of the frozen process showed the window's thread in `nvmlShutdown`, waiting for NVML's count of calls in flight to reach 0 while it held the lock `nvmlInit` takes, the run's thread spinning on that lock in `nvmlInit`, the count at 1 and no thread inside any NVML call: a call had been thrown out by an access violation that our guard caught. Reproduced on its own on 617.42 with a 40-line program: after a guarded `nvmlDeviceGetTemperature` with a bad result pointer, `nvmlShutdown` does not return (waited 5 s) and neither does an `nvmlInit` after it; without the fault both return at once. With the fix: (a) fault at 8 s, new copy `--resume --after-fault` at 8.3 s, first copy gone at 8.7 s with exit code 0, new copy responding with its window; (b) fault at 6 s, new copy `--resume --after-fault --hidden` at 6.4 s, no window; (c) fault at 3 s, still running and responding at 20 s, new copy at 60.7 s. Not covered here, see check 81: anything elevated (the `boot.log` line, a tune kept applied across the restart, a fault during a run). |
111
+
| 81 | A caught fault in an NVML call, elevated: the tune stays applied, a run ends properly | With the test build of check 80, elevated, no other copy running, a saved tune applied. (a) `GpuAutoOptimizer.exe --tray --inject-nvml-fault=20`, wait 60 s, `gao --status`, read the end of `boot.log`; (b) `GpuAutoOptimizer.exe --inject-nvml-fault=120`, start a run at once and leave the window open until the run has ended, then close the window | yes | (a) `boot.log` has `a call into the NVIDIA driver library faulted; restarting the app to load the library afresh`; the tray icon is back within seconds and says `tune kept applied`; `applied:` equals the saved tune. (b) the run goes on after the fault at two minutes and ends at its result or at stock; its result stays on the screen; the app restarts only when the window is closed, and its icon is back in the tray | Not run yet. |
0 commit comments