Aufzählen von GPU-Enginefunktionen
Ab Windows 8.1 muss ein Anzeigeminiporttreiber die DxgkDdiGetNodeMetadata-Funktion implementieren, die zum Abfragen der Enginefunktionen eines GPU-Knotens verwendet wird.
Diese Informationen helfen bei der Auswertung der geplanten und verteilten Workloads auf Knoten und verbessern die Möglichkeit, Anwendungen zu debuggen.
Engine Capabilities Device Driver Interface (DDI)
Diese Schnittstelle stellt die Enginefunktionen eines angegebenen GPU-Knotens bereit:
Ein Zeiger auf die DxgkDdiGetNodeMetadata-Funktion wird vom DxgkDdiGetNodeMetadata-Member der DRIVER_INITIALIZATION_DATA-Struktur bereitgestellt.
GPU-Knotenarchitektur
Jeder Grafikkarte im System verfügt über eine Reihe unterschiedlicher Engines, mit denen Aufgaben geplant werden können. Jede Engine ist nur einem Knoten zugewiesen, aber jeder Knoten kann mehr als eine Engine enthalten, wenn dieser Knoten mehreren Adaptern zugeordnet ist, z. B. in der LDA-Konfiguration (Linked Display Adapter), bei der mehrere physische GPUs verknüpft sind, um eine einzelne, schnellere, virtuelle GPU zu bilden.
Verschiedene Knoten stellen die asymmetrischen Verarbeitungskerne der GPU dar, während die Engines innerhalb jedes Knotens die symmetrischen Verarbeitungskerne adapterübergreifend darstellen. Das heißt, ein 3D-Knoten enthält nur identische 3D-Engines auf mehreren Adaptern und nie einen anderen Motortyp.
Da die Engines immer in Knoten nach Modultyp gruppiert sind, können die Modultypinformationen basierend auf einem angegebenen Knoten abgefragt werden. Die Typen von Engines, die der Anzeigeminiporttreiber angeben kann, sind in der DXGK_ENGINE_TYPE-Enumeration aufgeführt.
Beispielimplementierung der Knotenmetadatenfunktion
Dieser Code zeigt, wie ein Anzeigeminiporttreiber einige der Engine-Typen implementieren kann, die von der DxgkDdiGetNodeMetadata-Funktion zurückgegeben werden können.
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;
}