Sdílet prostřednictvím


Výčet funkcí modulu GPU

Počínaje Windows 8.1 musí ovladač miniportu zobrazení implementovat funkci DxgkDdiGetNodeMetadata, která se používá k dotazování vlastností uzlu GPU.

Tyto informace pomáhají vyhodnotit, jak se úlohy plánují a distribuují mezi uzly a zlepšují schopnost ladit aplikace.

Strojové schopnosti rozhraní ovladače zařízení (DDI)

Toto rozhraní poskytuje schopnosti jádra určeného uzlu GPU.

Ukazatel na funkci DxgkDdiGetNodeMetadata poskytuje dxgkDdiGetNodeMetadata člen DRIVER_INITIALIZATION_DATA struktury.

Architektura uzlu GPU

Každý adaptér displeje v systému má k dispozici řadu různých modulů pro plánování úkolů. Každý modul je přiřazen pouze k jednomu uzlu, ale každý uzel může obsahovat více než jeden modul, pokud je tento uzel přidružený k více adaptérům – například v konfiguraci propojeného grafického adaptéru (LDA), kde je několik fyzických GPU propojených s jedním, rychlejším virtuálním GPU.

Diagram znázorňující architekturu modulů a uzlů GPU

Různé uzly představují asymetrická jádra zpracování GPU, zatímco moduly v každém uzlu představují symetrická jádra zpracování napříč adaptéry. To znamená, že 3D uzel obsahuje pouze identické 3D motory na několika adaptérech a nikdy jiný typ motoru.

Vzhledem k tomu, že moduly jsou vždy seskupené v uzlech podle typu modulu, mohou být informace o typu motoru dotazovány na základě zadaného uzlu. Typy motoru, které může ovladač miniportu zobrazení určit, jsou uvedeny v DXGK_ENGINE_TYPE výčtu.

Příklad implementace funkce metadat uzlu

Tento kód ukazuje, jak může ovladač miniportu zobrazení implementovat některé z typů engine, které lze vrátit prostřednictvím funkce 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;
}