Delen via


TDR in Windows 8 en hoger

Vanaf Windows 8 maakt het gedrag van GPU time-outdetectie en herstel (TDR) het mogelijk om delen van individuele fysieke adapters opnieuw in te stellen, in plaats van een reset van de gehele adapter te vereisen.

Zie Time-outdetectie en -herstel (TDR) voor meer informatie.

Behoeften

  • Minimale WDDM-versie: 1.2
  • Minimale Windows-versie: 8
  • Implementatie van stuurprogramma's: alleen volledige afbeeldingen en renderen: verplicht
  • WHLK-vereisten en tests: Device.Graphics... TDRResiliency

TDR-interface voor apparaatstuurprogramma's (DDI)

Om aan deze gedragswijziging tegemoet te komen, kunnen kmd-stuurprogramma's (kernelmodusweergave minipoortstuurprogramma's) deze functies implementeren:

Een KMD geeft ondersteuning voor deze functies aan door het DXGK_DRIVERCAPS.SupportPerEngineTDR-lid in te stellen, in welk geval alle vermelde functies moeten worden geïmplementeerd.

Een stuurprogramma dat deze functies ondersteunt, moet ook niveau nulsynchronisatie ondersteunen voor de functie DxgkDdiCollectDbgInfo . Deze vereiste zorgt ervoor dat niveau-nul KMD-aanroepen kunnen worden voortgezet als de resetbewerking deze niet beïnvloedt. Zie Opmerkingen van DxgkDdiCollectDbgInfo.

De volgende structuren zijn gekoppeld aan de bovenstaande functies:

Knooppunten

Zoals wordt gebruikt in de vermelde TDR-functies, is een knooppunt een van meerdere onderdelen van één fysieke adapter die onafhankelijk van elkaar kan worden gepland. Een 3D-knooppunt, een videodecoderingsknooppunt en een kopieerknooppunt kunnen allemaal bestaan in dezelfde fysieke adapter en elk knooppunt kan een afzonderlijk knooppuntordinaal worden toegewezen. Deze opdracht wordt opgeslagen in het DXGKARG_QUERYDEPENDENTENGINEGROUP.NodeOrdinal lid tijdens een aanroep van DxgkDdiQueryDependentEngineGroup.

Het aantal knooppunten in de fysieke adapter wordt gerapporteerd door het minipoortstuurprogramma van het beeldscherm in het lid nbAsymetricProcessingNodes van DXGK_DRIVERCAPS. GpuEngineTopology.

De ordinale waarde van het knooppunt wordt doorgegeven in het lid NodeOrdinal van de DXGKARG_CREATECONTEXT structuur wanneer er een context wordt gemaakt.

Engines

Zoals wordt gebruikt in de DDI-functies van TDR, is een engine een van meerdere fysieke adapters (of GPU's) die samen als één logische adapter fungeren. Dxgkrnl ondersteunt dergelijke configuraties, maar vereist dat elke engine hetzelfde aantal knooppunten moet hebben.

De GPU-planner beschouwt bijvoorbeeld engine 0 om overeen te komen met fysieke adapter 0. Engine 0 moet hetzelfde aantal knooppunten hebben als engine 1, wat overeenkomt met adapter 1.

Ordinale waarde van de engine bij het creëren van de context

Wanneer een context wordt gemaakt, wordt een enkele bit die overeenkomt met de machineordinale waarde ingesteld in de EngineAffinity-component van de DXGKARG_CREATECONTEXT-structuur. Het EngineOrdinal-lid van deze en andere scheduler-gerelateerde structuren is een op nul gebaseerde index. De waarde van EngineAffinity is 1 <<EngineOrdinal en EngineOrdinal is de hoogste bitpositie in EngineAffinity.

Pakketten die niet worden beïnvloed door het opnieuw instellen van de engine

De GPU-planner kan het stuurprogramma vragen om pakketten die te laat zijn verzonden, opnieuw in te dienen bij de hardwarewachtrij van de engine om volledig te worden verwerkt voordat de engine opnieuw wordt ingesteld. Het driver moet de volgende richtlijnen volgen om dergelijke pakketten opnieuw verzenden:

  • Pagineringspakketten: de GPU-scheduler vraagt het stuurprogramma om pagineringspakketten opnieuw in te dienen met hun oorspronkelijke fence-ID's en in dezelfde volgorde als oorspronkelijk ingediend. Dergelijke pakketten worden opnieuw ingediend voordat nieuwe pakketten worden toegevoegd aan de hardwarewachtrij.
  • Renderpakketten: de GPU-scheduler wijst nieuwe fence-ID's toe en verzendt ze vervolgens opnieuw.

Oproepreeks om een motor opnieuw in te stellen

Wanneer DxgkDdiResetEngine slaagt, zorgt de GPU-planner ervoor dat de waarde LastAbortedFenceId die is geretourneerd door de aanroep voor het opnieuw instellen van de engine overeenkomt met:

  • Een bestaande fence-ID in de hardwarewachtrij.
  • De laatst voltooide fence-ID op de GPU. Deze situatie kan optreden wanneer de hardwarewachtrij leeg wordt nadat de GPU-time-out is gedetecteerd, maar voordat de callback voor het opnieuw instellen van de engine wordt aangeroepen.

Het stuurprogramma moet altijd de laatst voltooide omheinings-id-waarde behouden op de GPU, omdat die omheinings-id nodig is om het lid DmaPreempted.LastCompletedFenceId van een DXGKARGCB_NOTIFY_INTERRUPT_DATA onderbrekingsmeldingsstructuur in te stellen. De laatst voltooide omheinings-id mag alleen worden geavanceerd in deze situaties:

  • Wanneer een pakket is voltooid (niet onderbroken), moet de laatst voltooide fence-ID worden ingesteld als de fence-ID van het voltooide pakket.
  • Wanneer DxgkDdiResetEngine slaagt, moet de laatst voltooide fence-ID worden ingesteld op de waarde van het LastCompletedFenceId-lid dat wordt geretourneerd door de engine reset-aanroep.
  • Voor een adapterbrede reset moet het laatst voltooide fence-id op alle knooppunten worden geavanceerd naar het laatst ingediende fence-id op het moment van de reset.

Hier volgt een chronologische volgorde van een geslaagde engine-reset, zoals waargenomen door de GPU-planner.

  1. Er wordt een preemptiepoging ondernomen.

  2. Er wordt een GPU-time-out gedetecteerd.

  3. De GPU-scheduler maakt een momentopname van de laatst ingediende en voltooide fence IDs, en interrupts van de engine bij time-out worden genegeerd. Deze combinatie is één atomische bewerking op het interruptniveau van het apparaat.

  4. Als er op dit moment geen pakketten in de hardwarewachtrij staan, sluit u af. Deze situatie kan zich voordoen wanneer een pakket is voltooid in het tijdvenster tussen stap 2 en 3.

  5. Alle in de wachtrij geplaatste DPC's worden leeggemaakt.

  6. Bereid u voor op het opnieuw instellen van de motor.

  7. Roep DxgkDdiResetEngine aan.

  8. Als het lid LastAbortedFenceId kleiner is dan de laatst voltooide omheinings-id of groter is dan de laatst ingediende omheinings-id, zorgt Dxgkrnl ervoor dat er een systeemfoutcontrole plaatsvindt. In een crashdumpbestand wordt de fout vermeld door het bericht BugCheck 0x119, met deze vier parameters:

    • 0xA, wat betekent dat de driver een ongeldige afgebroken 'fence ID' heeft gerapporteerd.
    • LastAbortedFenceId-waarde geretourneerd door het stuurprogramma
    • Laatst voltooide hekwerk-ID
    • Een interne parameter van het besturingssysteem
  9. Als de waarde LastAbortedFenceId geldig is, kunt u verdergaan met engineherstel als volgt. Als het opnieuw instellen van de engine invloed heeft op een paging pakket, volgt de GPU-scheduler het opnieuw instellen van de engine met een adapterbrede reset. Alle apparaten die eigenaar zijn van geheugenallocaties waar dat paginapakket naar verwijst, worden ook in de fouttoestand gezet. Het systeemapparaat zelf wordt niet in de foutstatus geplaatst en de uitvoering wordt hervat nadat het opnieuw instellen is voltooid.

Speciale gevallen

Er kan een speciale situatie optreden wanneer een pakket is voltooid op de GPU tussen stap 3 en 7. In dit geval moet het stuurprogramma LastAbortedFenceId instellen op de omheinings-id van het laatst voltooide pakket als er geen pakketten in de hardwarewachtrij staan vanuit het oogpunt van het stuurprogramma. Vanuit het oogpunt van de scheduler lijkt het erop dat een dergelijk pakket is afgebroken. De scheduler plaatst het bijbehorende apparaat dus in een foutstatus, ook al is het pakket uiteindelijk voltooid.

Als het stuurprogramma om een van de volgende redenen geen resetbewerking kan uitvoeren, moet er een foutcode worden geretourneerd:

  • De hardware heeft een ongeldige status.
  • De hardware kan de knooppunten niet opnieuw instellen.

Als de GPU-planner een foutcode ontvangt, voert deze een reset- en herstartbewerking voor de hele adapter uit volgens het TDR-gedrag vóór Windows 8.

Zelfs als een stuurprogramma zich aanmeldt voor het TDR-gedrag van Windows 8 en hoger, zijn er gevallen waarin de GPU-planner een reset aanvraagt en de hele logische adapter opnieuw opstart. Daarom moet het stuurprogramma nog steeds de Functies DxgkDDiResetFromTimeout en DxgkDDiRestartFromTimeout implementeren en hun semantiek blijft hetzelfde als vóór Windows 8. Wanneer een poging om een fysieke adapter opnieuw in te stellen met DxgkDdiResetEngine leidt tot het opnieuw instellen van de logische adapter, geeft de opdracht !analyze van het Windows-foutopsporingsprogramma aan dat de TdrReason-waarde van de TDR-herstelcontext is ingesteld op een nieuwe waarde van TdrEngineTimeoutPromotedToAdapterReset = 9.