Preserve formatted NAND boot and Wii Remote pairing, add DMA/SRAM conformance tests and a Wii comparison probe. Keep P1 profiling tools and native update A/B evidence; reject the unhelpful targeted SRAM shortcut.
196 lines
12 KiB
Markdown
196 lines
12 KiB
Markdown
# Diagnostic P1 : statut et exécution locale
|
||
|
||
Le protocole et les critères de décision sont dans
|
||
[`docs/Wii_LLE_Performance_Diagnostic_Protocol.md`](../../docs/Wii_LLE_Performance_Diagnostic_Protocol.md).
|
||
Tous les artefacts volumineux vont dans `.starlet-profile` (ignoré par Git), jamais
|
||
dans la NAND source ni dans le profil utilisateur courant.
|
||
|
||
1. Construire le profil isolé avec `./Tools/PerformanceTrace/Build-P1.ps1`.
|
||
Après modification d'une option de compilation, `-CleanBeforeBuild` vérifie tous
|
||
les objets. Le script répare le préfixe français `/showIncludes` si cette
|
||
installation MSVC l'a mal décodé ; un objet avec `#deps 0` invalide la build.
|
||
2. Vérifier les tests ciblés de `Binaries/Tests/tests.exe` et le décodeur avec
|
||
`./Tools/PerformanceTrace/Build-Decoder.ps1 -OutputDirectory .starlet-profile/P1-tools`.
|
||
3. Sur une session Windows sans droit de profilage noyau, valider d'abord le
|
||
fournisseur dans une session ETW privée :
|
||
|
||
```powershell
|
||
./Tools/PerformanceTrace/Capture-Private-P1.ps1 -OutputDirectory .starlet-profile/P1-private-NEW
|
||
python Tools/PerformanceTrace/qualify_p1.py .starlet-profile/P1-private-NEW
|
||
```
|
||
|
||
Le résultat attendu est `local_provider_passed=true` et
|
||
`full_collector_passed=false`. Cette session ne contient aucun échantillon
|
||
CPU, changement de thread ou attente disque. Le mode `-NoTrace` exécute
|
||
exactement la même charge pour une comparaison locale alternée. Exemple
|
||
avec quatre répertoires neufs, à exécuter dans cet ordre :
|
||
|
||
```powershell
|
||
./Tools/PerformanceTrace/Capture-Private-P1.ps1 -OutputDirectory .starlet-profile/P1-off-1 -NoTrace
|
||
./Tools/PerformanceTrace/Capture-Private-P1.ps1 -OutputDirectory .starlet-profile/P1-on-1
|
||
./Tools/PerformanceTrace/Capture-Private-P1.ps1 -OutputDirectory .starlet-profile/P1-off-2 -NoTrace
|
||
./Tools/PerformanceTrace/Capture-Private-P1.ps1 -OutputDirectory .starlet-profile/P1-on-2
|
||
python Tools/PerformanceTrace/compare_p1.py .starlet-profile/P1-off-1 .starlet-profile/P1-on-1 .starlet-profile/P1-off-2 .starlet-profile/P1-on-2 --output .starlet-profile/P1-private-overhead-NEW.json
|
||
```
|
||
|
||
Ce comparateur conserve les quatre mesures et la dispersion ; il ne peut
|
||
**pas** valider le budget de 2 % de la capture WPR complète.
|
||
4. Capture synthétique WPR complète **dans une session administrateur**, avec
|
||
un **nouveau** chemin de sortie :
|
||
|
||
```powershell
|
||
./Tools/PerformanceTrace/Capture-Local-P1.ps1 -OutputDirectory .starlet-profile/P1-local-NEW
|
||
```
|
||
|
||
Ce programme exécute une boucle Thumb réelle, un sommeil hôte connu, 128
|
||
transactions de journal synthétique et 32 échanges ARP avec la passerelle
|
||
locale libslirp. Le journal synthétique reste dans ce répertoire neuf.
|
||
Aucun serveur externe n'est contacté par l'échange ARP.
|
||
5. Après la capture, décoder et qualifier hors ligne (sans droit administrateur)
|
||
dans un **nouveau** répertoire :
|
||
|
||
```powershell
|
||
./Tools/PerformanceTrace/Analyze-Local-P1.ps1 `
|
||
-CaptureDirectory .starlet-profile/P1-local-NEW `
|
||
-OutputDirectory .starlet-profile/P1-local-NEW-analysis
|
||
```
|
||
|
||
Le lecteur TDH extrait les événements natifs ; Xperf décode les événements
|
||
noyau classiques, résout les PDB locaux et les deux flux sont alignés par
|
||
les QPC des marqueurs ou des snapshots périodiques. Le CSV, l'ETL et les données de profil peuvent contenir
|
||
des noms de processus ou chemins : ils restent locaux et ignorés par Git.
|
||
Le répertoire de sortie doit être neuf à chaque tentative.
|
||
6. Mesurer le surcoût WPR avec une seule commande administrateur et un nouveau
|
||
répertoire. Elle automatise quatre paires alternées OFF/ON du **même** travail
|
||
synthétique (huit lancements locaux, aucun démarrage Wii ni NAND utilisateur) :
|
||
|
||
```powershell
|
||
./Tools/PerformanceTrace/Measure-P1-Overhead.ps1 -OutputDirectory .starlet-profile/P1-overhead-001
|
||
```
|
||
|
||
`comparison.json` conserve les durées brutes, la dispersion des bases OFF,
|
||
les écarts par paire et une borne supérieure de confiance. Le seuil de 2 %
|
||
ne passe que si les données restent stables et les trois mesures ARM/mur/CPU
|
||
satisfont ce seuil. Python est vérifié **avant** toute capture ; si un lot
|
||
s'est interrompu uniquement au calcul final, `-AnalyzeOnly` relit les huit
|
||
captures existantes sans en relancer aucune. `-PythonExecutable` permet de
|
||
préciser le chemin de `python.exe` si le PowerShell administrateur n'a pas
|
||
le même `PATH`. Un résultat négatif ou bruité n'autorise aucun diagnostic
|
||
de vitesse Wii.
|
||
|
||
`qualification.json` détaille chaque gate. Une sonde locale réussie ne constitue
|
||
pas encore une analyse de mise à jour Wii : le cas PPC, les piles hôte et le
|
||
surcoût du collecteur restent à qualifier. La capture native n'est prévue
|
||
qu'après ces vérifications. Le profil WPR comporte une session au nom unique et
|
||
le script arrête seulement cette session.
|
||
|
||
Le 22 septembre, deux traces privées ont validé les 13 contrôles du fournisseur
|
||
(`P1-private-004`, `P1-private-006`). Le jeton `CodexSandboxUsers` ne pouvait
|
||
pas lancer WPR (`0xc5585011`), mais la capture synthétique administrateur
|
||
`P1-local-004` a réussi. Sous Windows PowerShell 5.1, le premier essai avait
|
||
révélé `ProcessStartInfo.ArgumentList` nul et une résolution de chemin relatif
|
||
depuis le répertoire de processus plutôt que celui affiché par `cd` ; les deux
|
||
cas sont corrigés et testés.
|
||
|
||
L'analyse reproductible `P1-local-004-reanalysis2` passe 13 contrôles du
|
||
fournisseur et 3 contrôles système : 9 427 échantillons CPU, 694 changements
|
||
de contexte, dix ancres QPC alignées à cinq ticks près, sommeil connu de
|
||
752 ms avec un switch `Waiting`. Les 112 événements classiques déclarés
|
||
invalides par Xperf concernent une métadonnée `ImageID` hors du PID de la
|
||
sonde ; zéro événement cible invalide et zéro perte ETW. Les symboles du PDB
|
||
local résolvent les fonctions hôte. Cela valide la **sonde**, pas la capture
|
||
native : coût du collecteur WPR, cas PPC et chemin critique Wii restent ouverts.
|
||
[Identification du GUID ImageID dans le code Microsoft PerfView](https://github.com/microsoft/perfview/blob/main/src/TraceEvent/BPerf/BPerfEventSource.cs).
|
||
|
||
Le lot `P1-overhead-001` du 22 septembre a produit les huit captures complètes,
|
||
mais son PowerShell administrateur ne trouvait pas Python lors de la comparaison.
|
||
Les données conservées ont été comparées hors ligne, sans recapture : les bases
|
||
OFF varient de 34,5 % pour la phase ARM et 26,8 % sur le temps total. Les écarts
|
||
ARM par paire sont +9,7 %, +25,0 %, -0,5 % et +1,0 %. Le surcoût WPR ne peut
|
||
donc pas être isolé de la variabilité de cette série et le budget de 2 % reste
|
||
**non qualifié**. Le rapport brut est
|
||
`.starlet-profile/P1-overhead-001/comparison.json` ; aucune mesure de vitesse
|
||
Wii n'en est déduite. Les traces ON montrent `cpptools.exe` consommant environ
|
||
8–9 s de CPU par essai et des sous-processus Dell intermittents ; ces charges
|
||
hôte sont une piste de contamination, pas une attribution causale chiffrée des
|
||
écarts ON/OFF. Dans `wpr-on-2`, 76 768 événements `ReadyThread` système ont été
|
||
enregistrés. Le profil conserve ces événements et leurs horodatages mais ne
|
||
collecte plus leur pile, afin de réduire le coût potentiel de cette source
|
||
système très fréquente ; le profil modifié doit être requalifié séparément.
|
||
|
||
Le lot `P1-overhead-002`, après cet allègement, n'a pas perdu d'événements
|
||
mais garde 36,5 % d'étendue ARM entre bases OFF. Ses quatre écarts ON/OFF sont
|
||
+4,6 %, -11,0 %, +10,2 % et -3,5 % ; leur moyenne proche de zéro ne qualifie
|
||
**pas** le budget. L'analyse des échantillons ETW révèle un changement de
|
||
placement CPU : part sur les processeurs logiques 0–3 de 78,7 %, 45,4 %, 28,9 %,
|
||
46,5 % pour des phases ARM de 7,59 s, 8,82 s, 10,33 s, 8,65 s. L'ETL identifie
|
||
un Core i7-1255U et SMT sur 0–3 ; [Intel indique 2 P-cores et 8 E-cores](https://www.intel.com/content/www/us/en/products/sku/226259/intel-core-i71255u-processor-12m-cache-up-to-4-70-ghz/specifications.html).
|
||
Ce placement est fortement associé à la durée, sans prouver qu'il explique à
|
||
lui seul tout l'écart. Le lancement Wii existant fixe déjà Dolphin sur ces
|
||
processeurs ; la **sonde synthétique**, elle, n'était pas fixée.
|
||
|
||
Les captures de sonde acceptent maintenant `-ProbeAffinityMask`, enregistrent
|
||
le masque réellement appliqué, et le comparateur refuse les masques différents.
|
||
Quatre bases locales sans WPR avec `-ProbeAffinityMask 15` ont fini leur phase
|
||
ARM en 7,03, 6,65, 7,20 et 6,97 s (masque observé 15 à chaque fois). Le
|
||
placement est contrôlé, mais une variabilité résiduelle de 8,3 % subsiste :
|
||
aucun nouveau lot administrateur n'est demandé avant de traiter cette limite
|
||
du protocole ou de passer à un diagnostic qualitatif explicitement borné.
|
||
|
||
## Première capture d'une vraie mise à jour (exploratoire)
|
||
|
||
`Prepare-Native-Update-P1.ps1` crée un profil NAND pré-mise-à-jour indépendant,
|
||
vérifie les 31 fichiers et le journal, puis fige l'exécutable et son PDB. Il
|
||
refuse tout nom déjà utilisé et ne lance pas Dolphin. L'expérience préparée
|
||
ici est `P1-trace-002` ; le profil courant `.starlet_user3` et les résultats A–F
|
||
ne sont pas modifiés. La capture ETW requiert un PowerShell administrateur.
|
||
La préparation dépend d'un seed NAND local ignoré par Git et demande désormais
|
||
un `-PythonExecutable` explicite ; elle n'est pas une procédure de création de
|
||
NAND dans un clone neuf.
|
||
|
||
```powershell
|
||
# Terminal administrateur : démarrer d'abord, puis laisser ouvert.
|
||
cd C:\Users\tpetkovic\Desktop\dolphin
|
||
.\Tools\PerformanceTrace\Capture-P1.ps1 -OutputDirectory .starlet-profile/P1-native-update-001 -Seconds 600
|
||
|
||
# Dès « Native collector armed », dans un autre PowerShell :
|
||
cd C:\Users\tpetkovic\Desktop\dolphin
|
||
.\Run-Wii-IOS-LLE.ps1 `
|
||
-BuildDirectory .starlet_update_ab_20260913/build-P1-trace-002 `
|
||
-UserDirectory .starlet_update_ab_20260913/P1-trace-002 `
|
||
-Ethernet -PerformanceTrace
|
||
```
|
||
|
||
Noter le PID imprimé par le lanceur, lancer la mise à jour dans la Wii, puis
|
||
laisser terminer la capture. Analyser ensuite l'ETL hors ligne dans un nouveau
|
||
répertoire :
|
||
|
||
```powershell
|
||
.\Tools\PerformanceTrace\Analyze-Local-P1.ps1 `
|
||
-CaptureDirectory .starlet-profile/P1-native-update-001 `
|
||
-OutputDirectory .starlet-profile/P1-native-update-001-analysis `
|
||
-NativePID <PID_DOLPHIN> `
|
||
-NativePDB .starlet_update_ab_20260913/build-P1-trace-002/pdb/DolphinNoGUI.pdb
|
||
```
|
||
|
||
Le rapport `native-report.json` reste exploratoire : perte ETW et alignement
|
||
QPC sont contrôlés, mais piles, attentes critiques, NAT et surcoût de capture
|
||
doivent encore être qualifiés avant d'attribuer le ralentissement ou d'annoncer
|
||
un gain de FPS. La mise à jour nécessite une action Wii réelle et un réseau
|
||
disponible ; ne pas essayer de la rejouer sur le même profil après succès.
|
||
|
||
Windows exige un droit de profilage pour le profil noyau ; un logger privé
|
||
du processus fonctionne avec un compte peu privilégié.
|
||
[Sessions privées ETW](https://learn.microsoft.com/en-us/windows/win32/etw/configuring-and-starting-a-private-logger-session),
|
||
[droits de StartTrace](https://learn.microsoft.com/en-us/windows/win32/api/evntrace/nf-evntrace-starttracea).
|
||
|
||
## Décision après A/B natif du 23 septembre
|
||
|
||
Le [rapport P1](../../docs/Wii_LLE_Update_P1_Trace_2026-09-23.md) contient les
|
||
deux mises à jour NAND isolées et vérifiées. Le raccourci SRAM ciblé a été
|
||
rejeté : sur ce passage, le témoin a terminé les mêmes seuils de journal plus
|
||
vite et a été jugé plus fluide. Le raccourci a été retiré du source ; ses deux
|
||
binaires et journaux figés restent locaux pour audit. Les outils de ce dossier
|
||
servent au diagnostic, pas à justifier une modification matérielle sans test
|
||
de conformité sur Wii réelle.
|