GPU エンジンの機能の列挙

Windows 8.1 以降では、ディスプレイ ミニポート ドライバーは、GPU ノードのエンジン機能を照会するために使用される DxgkDdiGetNodeMetadata 関数を実装する必要があります。

この情報は、ワークロードのスケジュール方法とノード間での分散方法の評価に役立ち、これにより、アプリケーションのデバッグ機能が向上します。

エンジン機能 デバイス ドライバー インターフェース (DDI)

このインターフェースは、指定された GPU ノードのエンジン機能を提供します。

DxgkDdiGetNodeMetadata 関数へのポインターは、DRIVER_INITIALIZATION_DATA 構造体の DxgkDdiGetNodeMetadataメンバーによって提供されます。

GPU ノード アーキテクチャ

システム上の各ディスプレイ アダプターには、タスクをスケジュールするために使用できるさまざまなエンジンがあります。 各エンジンは 1 つのノードにのみ割り当てられますが、複数の物理 GPU がリンクされて 1 つの高速な仮想 GPU を形成するリンクされたディスプレイ アダプター (LDA) 構成など、そのノードが複数のアダプターに関連付けられている場合は、各ノードに複数のエンジンを含めることができます。

Diagram showing the architecture of GPU engines and nodes.

異なるノードは GPU の非対称処理コアを表し、各ノード内のエンジンは、アダプター間の対称処理コアを表します。 したがって、3-D ノードには、複数のアダプター上に同一の 3-D エンジンのみが含まれており、異なる種類のエンジンは含まれることはありません。

エンジンは、常に、エンジン タイプ別にノードにグループ化されるため、指定したノードに基づいてエンジン タイプ情報を照会できます。 ディスプレイ ミニポート ドライバーが指定できるエンジンの種類は、DXGK_ENGINE_TYPE 列挙体に一覧表示されます。

ノード メタデータ関数の実装例

このコードは、ディスプレイ ミニポート ドライバーが 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;
}