Bagikan melalui


Menghitung kemampuan mesin GPU

Mulai dari Windows 8.1, driver miniport tampilan harus mengimplementasikan fungsi DxgkDdiGetNodeMetadata, yang digunakan untuk mengkueri kemampuan mesin node GPU.

Informasi ini membantu evaluasi tentang bagaimana beban kerja dijadwalkan dan didistribusikan di antara simpul dan meningkatkan kemampuan untuk men-debug aplikasi.

Kapabilitas mesin antarmuka driver perangkat (DDI)

Antarmuka ini menyediakan kemampuan mesin dari node GPU tertentu:

Penunjuk ke fungsi DxgkDdiGetNodeMetadata disediakan oleh anggota DxgkDdiGetNodeMetadata dari struktur DRIVER_INITIALIZATION_DATA .

Arsitektur simpul GPU

Setiap adaptor tampilan pada sistem memiliki sejumlah mesin berbeda yang tersedia untuk menjadwalkan tugas. Setiap mesin hanya ditetapkan ke satu simpul, tetapi setiap simpul dapat berisi lebih dari satu mesin jika simpul tersebut dikaitkan dengan beberapa adaptor—seperti dalam konfigurasi adaptor tampilan tertaut (LDA), di mana beberapa GPU fisik ditautkan untuk membentuk GPU virtual tunggal yang lebih cepat.

Diagram yang menunjukkan arsitektur mesin dan simpul GPU.

Simpul yang berbeda mewakili inti pemrosesan asimetris GPU, sementara mesin dalam setiap simpul mewakili inti pemrosesan simetris di seluruh adaptor. Artinya, simpul 3-D hanya berisi mesin 3-D yang identik pada beberapa adaptor, dan tidak pernah memiliki jenis mesin yang berbeda.

Karena mesin selalu dikelompokkan bersama dalam simpul berdasarkan jenis mesin, informasi jenis mesin dapat dikueri berdasarkan simpul tertentu. Jenis mesin yang dapat ditentukan driver miniport tampilan tercantum dalam enumerasi DXGK_ENGINE_TYPE .

Contoh implementasi fungsi metadata simpul

Kode ini menunjukkan bagaimana driver miniport tampilan dapat mengimplementasikan beberapa jenis mesin yang dapat dikembalikan oleh fungsi 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;
}