Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Från och med Windows 8.1 måste en miniportdrivrutin för visning implementera funktionen DxgkDdiGetNodeMetadata , som används för att köra frågor mot motorfunktionerna i en GPU-nod.
Den här informationen hjälper till med utvärderingen av hur arbetsbelastningar schemaläggs och distribueras mellan noder och förbättrar möjligheten att felsöka program.
Motorfunktioner enhetsdrivrutinsgränssnitt (DDI)
Det här gränssnittet innehåller motorfunktionerna för en angiven GPU-nod:
En pekare till funktionen DxgkDdiGetNodeMetadata tillhandahålls av DxgkDdiGetNodeMetadata-medlemmen i DRIVER_INITIALIZATION_DATA-strukturen .
GPU-nodarkitektur
Varje bildskärmskort i systemet har ett antal olika motorer tillgängliga att schemalägga uppgifter på. Varje motor tilldelas endast till en nod, men varje nod kan innehålla mer än en motor om noden är associerad med flera kort, till exempel i konfigurationen för länkat bildskärmskort (LDA), där flera fysiska GPU:er är länkade till en enda, snabbare, virtuell GPU.
Olika noder representerar GPU:ns asymmetriska bearbetningskärnor, medan motorerna i varje nod representerar de symmetriska bearbetningskärnorna mellan korten. En 3D-nod innehåller alltså bara identiska 3D-motorer på flera kort och aldrig en annan motortyp.
Eftersom motorerna alltid grupperas i noder efter motortyp kan motortypsinformationen efterfrågas baserat på en angiven nod. De typer av processorer som miniportdrivrutinen kan ange listas i DXGK_ENGINE_TYPE uppräkning.
Exempel på implementering av funktionen för nodmetadata
Den här koden visar hur en miniportdrivrutin för visning kan implementera några av de motortyper som kan returneras av funktionen DxgkDdiGetNodeMetadata .
NTSTATUS
IHVGetNodeDescription(
IN_CONST_HANDLE hAdapter,
UINT NodeOrdinal,
OUT_PDXGKARG_GETNODEMETADATA pGetNodeMetadata
)
{
DDI_FUNCTION();
PAGED_CODE();
if(NULL == pGetNodeMetadata)
{
return STATUS_INVALID_PARAMETER;
}
CAdapter *pAdapter = GetAdapterFromHandle(hAdapter);
//Invalid handle
if(NULL == pAdapter)
{
return STATUS_INVALID_PARAMETER;
}
//Node ordinal is out of bounds. Required to return
//STATUS_INVALID_PARAMETER
if(NodeOrdinal >= pAdapter->GetNumNodes())
{
return STATUS_INVALID_PARAMETER;
}
switch(pAdapter->GetEngineType(NodeOrdinal))
{
//This is the adapter's 3-D engine. This engine handles a large number
//of different workloads, but it also handles the adapter's 3-D
//workloads. Therefore the 3-D capability is what must be exposed.
case GPU_ENGINE_3D:
{
pGetNodeMetadata->EngineType = DXGK_ENGINE_TYPE_3D;
break;
}
//This is the adapter's video decoding engine
case GPU_ENGINE_VIDEO_DECODE:
{
pGetNodeMetadata->EngineType = DXGK_ENGINE_TYPE_VIDEO_DECODE;
break;
}
//This engine is proprietary and contains no functionality that
//fits the DXGK_ENGINE_TYPE enumeration
case GPU_ENGINE_PROPRIETARY_ENGINE_1:
{
pGetNodeMetadata->EngineType = DXGK_ENGINE_TYPE_OTHER;
//Copy over friendly name associated with this engine
SetFriendlyNameForEngine(pGetNodeMetadata->FriendlyName,
DXGK_MAX_METADATA_NAME_LENGTH,
PROPRIETARY_ENGINE_1_NAME);
break;
}
}
return STATUS_SUCCESS;
}