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.
12 KiB
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.
Tous les artefacts volumineux vont dans .starlet-profile (ignoré par Git), jamais
dans la NAND source ni dans le profil utilisateur courant.
-
Construire le profil isolé avec
./Tools/PerformanceTrace/Build-P1.ps1. Après modification d'une option de compilation,-CleanBeforeBuildvérifie tous les objets. Le script répare le préfixe français/showIncludessi cette installation MSVC l'a mal décodé ; un objet avec#deps 0invalide la build. -
Vérifier les tests ciblés de
Binaries/Tests/tests.exeet le décodeur avec./Tools/PerformanceTrace/Build-Decoder.ps1 -OutputDirectory .starlet-profile/P1-tools. -
Sur une session Windows sans droit de profilage noyau, valider d'abord le fournisseur dans une session ETW privée :
./Tools/PerformanceTrace/Capture-Private-P1.ps1 -OutputDirectory .starlet-profile/P1-private-NEW python Tools/PerformanceTrace/qualify_p1.py .starlet-profile/P1-private-NEWLe résultat attendu est
local_provider_passed=trueetfull_collector_passed=false. Cette session ne contient aucun échantillon CPU, changement de thread ou attente disque. Le mode-NoTraceexécute exactement la même charge pour une comparaison locale alternée. Exemple avec quatre répertoires neufs, à exécuter dans cet ordre :./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.jsonCe comparateur conserve les quatre mesures et la dispersion ; il ne peut pas valider le budget de 2 % de la capture WPR complète.
-
Capture synthétique WPR complète dans une session administrateur, avec un nouveau chemin de sortie :
./Tools/PerformanceTrace/Capture-Local-P1.ps1 -OutputDirectory .starlet-profile/P1-local-NEWCe 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.
-
Après la capture, décoder et qualifier hors ligne (sans droit administrateur) dans un nouveau répertoire :
./Tools/PerformanceTrace/Analyze-Local-P1.ps1 ` -CaptureDirectory .starlet-profile/P1-local-NEW ` -OutputDirectory .starlet-profile/P1-local-NEW-analysisLe 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.
-
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) :
./Tools/PerformanceTrace/Measure-P1-Overhead.ps1 -OutputDirectory .starlet-profile/P1-overhead-001comparison.jsonconserve 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,-AnalyzeOnlyrelit les huit captures existantes sans en relancer aucune.-PythonExecutablepermet de préciser le chemin depython.exesi le PowerShell administrateur n'a pas le mêmePATH. 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.
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.
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.
# 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 :
.\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, droits de StartTrace.
Décision après A/B natif du 23 septembre
Le rapport P1 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.