GPU altyapısı özelliklerini numaralandırma

Windows 8.1'den başlayarak, ekran miniport sürücüsünün bir GPU düğümünün altyapı özelliklerini sorgulamak için kullanılan DxgkDdiGetNodeMetadata işlevini uygulaması gerekir.

Bu bilgiler, iş yüklerinin düğümler arasında nasıl zamanlanıp dağıtıldığının değerlendirilmesine yardımcı olur ve uygulamalarda hata ayıklama özelliğini geliştirir.

Altyapı özellikleri cihaz sürücüsü arabirimi (DDI)

Bu arabirim, belirtilen bir GPU düğümünün altyapı özelliklerini sağlar:

DxgkDdiGetNodeMetadata işlevinin işaretçisi, DRIVER_INITIALIZATION_DATA yapısının DxgkDdiGetNodeMetadata üyesi tarafından sağlanır.

GPU düğümü mimarisi

Sistemdeki her görüntü bağdaştırıcısında görevleri zamanlamak için kullanılabilecek bir dizi farklı motor mevcuttur. Her altyapı yalnızca bir düğüme atanır, ancak bu düğüm birden çok bağdaştırıcıyla ilişkilendirilmişse (örneğin, birden çok fiziksel GPU'un tek, daha hızlı, sanal GPU oluşturmak için bağlandığı bağlı görüntü bağdaştırıcısı (LDA) yapılandırmasında) her düğüm birden fazla altyapı içerebilir.

GPU altyapılarının ve düğümlerinin mimarisini gösteren diyagram.

Farklı düğümler GPU'nun asimetrik işlem çekirdeklerini temsil ederken, her düğümdeki motorlar bağdaştırıcılar arasında simetrik işlem çekirdeklerini temsil eder. Başka bir ifadeyle, bir 3-B düğümü, birkaç bağdaştırıcıda yalnızca aynı 3-B motorları içerir ve hiçbir zaman farklı bir motor türü içermez.

Motorlar her zaman motor türüne göre düğümlerde birlikte gruplandırıldığından, motor türü bilgileri belirtilen düğüme göre sorgulanabilir. Görüntü miniport sürücüsünün belirtebileceği motor türleri DXGK_ENGINE_TYPE numaralandırmasında listelenir.

Düğüm meta veri işlevinin örnek uygulaması

Bu kod, görüntü miniport sürücüsünün DxgkDdiGetNodeMetadata işlevi tarafından döndürülebilen bazı altyapı türlerini nasıl uygulayabileceğini gösterir.

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;
}