GPU 엔진 기능 열거

Windows 8.1 시작해서 디스플레이 미니포트 드라이버는 GPU 노드의 엔진 기능을 쿼리하는 데 사용되는 DxgkDdiGetNodeMetadata 함수를 구현해야 합니다.

이 정보는 워크로드가 노드 간에 예약 및 분산되는 방식을 평가하는 데 도움이 되며 애플리케이션을 디버그하는 기능을 향상시킵니다.

엔진 기능 DDI(디바이스 드라이버 인터페이스)

이 인터페이스는 지정된 GPU 노드의 엔진 기능을 제공합니다.

DxgkDdiGetNodeMetadata 함수에 대한 포인터는 DRIVER_INITIALIZATION_DATA 구조체의 DxgkDdiGetNodeMetadata 멤버에 의해 제공됩니다.

GPU 노드 아키텍처

시스템의 각 디스플레이 어댑터에는 작업을 예약하는 데 사용할 수 있는 다양한 엔진이 있습니다. 각 엔진은 하나의 노드에만 할당되지만 해당 노드가 LDA(연결된 디스플레이 어댑터) 구성과 같이 여러 어댑터와 연결된 경우 각 노드에 둘 이상의 엔진이 포함될 수 있습니다. 여기서 여러 물리적 GPU가 연결되어 단일, 더 빠른 가상 GPU를 형성합니다.

GPU 엔진 및 노드의 아키텍처를 보여 주는 다이어그램

다른 노드는 GPU의 비대칭 처리 코어를 나타내고 각 노드 내의 엔진은 어댑터의 대칭 처리 코어를 나타냅니다. 즉, 3D 노드에는 여러 어댑터의 동일한 3D 엔진만 포함되며 다른 엔진 유형은 없습니다.

엔진은 항상 엔진 유형별로 노드에서 그룹화되므로 지정된 노드에 따라 엔진 유형 정보를 쿼리할 수 있습니다. 디스플레이 미니포트 드라이버가 지정할 수 있는 엔진 유형은 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;
}