Ignore:
Timestamp:
Jan 7, 2017, 9:28:51 PM (3 years ago)
Author:
matszpk
Message:

CLRadeonExtender: ROCmBin: Move detection device type (from binary) code to ROCmBinaries module.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • CLRadeonExtender/trunk/amdbin/ROCmBinaries.cpp

    r2705 r2710  
    122122        mapSort(regionsMap.begin(), regionsMap.end());
    123123    }
     124}
     125
     126struct AMDGPUArchValuesEntry
     127{
     128    uint32_t major;
     129    uint32_t minor;
     130    uint32_t stepping;
     131    GPUDeviceType deviceType;
     132};
     133
     134static const AMDGPUArchValuesEntry amdGpuArchValuesTbl[] =
     135{
     136    { 0, 0, 0, GPUDeviceType::CAPE_VERDE },
     137    { 7, 0, 0, GPUDeviceType::BONAIRE },
     138    { 7, 0, 1, GPUDeviceType::HAWAII },
     139    { 8, 0, 0, GPUDeviceType::ICELAND },
     140    { 8, 0, 1, GPUDeviceType::CARRIZO },
     141    { 8, 0, 2, GPUDeviceType::ICELAND },
     142    { 8, 0, 3, GPUDeviceType::FIJI },
     143    { 8, 0, 4, GPUDeviceType::FIJI },
     144    { 8, 1, 0, GPUDeviceType::STONEY }
     145};
     146
     147static const size_t amdGpuArchValuesNum = sizeof(amdGpuArchValuesTbl) /
     148                sizeof(AMDGPUArchValuesEntry);
     149
     150
     151GPUDeviceType ROCmBinary::determineGPUDeviceType(uint32_t& outArchMinor,
     152                     uint32_t& outArchStepping) const
     153{
     154    uint32_t archMajor = 0;
     155    uint32_t archMinor = 0;
     156    uint32_t archStepping = 0;
     157   
     158    {
     159        const cxbyte* noteContent = (const cxbyte*)getNotes();
     160        if (noteContent==nullptr)
     161            throw Exception("Missing notes in inner binary!");
     162        size_t notesSize = getNotesSize();
     163        // find note about AMDGPU
     164        for (size_t offset = 0; offset < notesSize; )
     165        {
     166            const Elf64_Nhdr* nhdr = (const Elf64_Nhdr*)(noteContent + offset);
     167            size_t namesz = ULEV(nhdr->n_namesz);
     168            size_t descsz = ULEV(nhdr->n_descsz);
     169            if (usumGt(offset, namesz+descsz, notesSize))
     170                throw Exception("Note offset+size out of range");
     171            if (ULEV(nhdr->n_type) == 0x3 && namesz==4 && descsz>=0x1a &&
     172                ::strcmp((const char*)noteContent+offset+sizeof(Elf64_Nhdr), "AMD")==0)
     173            {    // AMDGPU type
     174                const uint32_t* content = (const uint32_t*)
     175                        (noteContent+offset+sizeof(Elf64_Nhdr) + 4);
     176                archMajor = ULEV(content[1]);
     177                archMinor = ULEV(content[2]);
     178                archStepping = ULEV(content[3]);
     179            }
     180            size_t align = (((namesz+descsz)&3)!=0) ? 4-((namesz+descsz)&3) : 0;
     181            offset += sizeof(Elf64_Nhdr) + namesz + descsz + align;
     182        }
     183    }
     184    // determine device type
     185    GPUDeviceType deviceType = GPUDeviceType::CAPE_VERDE;
     186    if (archMajor==0)
     187        deviceType = GPUDeviceType::CAPE_VERDE;
     188    else if (archMajor==7)
     189        deviceType = GPUDeviceType::BONAIRE;
     190    else if (archMajor==8)
     191        deviceType = GPUDeviceType::ICELAND;
     192   
     193    for (cxuint i = 0; i < amdGpuArchValuesNum; i++)
     194        if (amdGpuArchValuesTbl[i].major==archMajor &&
     195            amdGpuArchValuesTbl[i].minor==archMinor &&
     196            amdGpuArchValuesTbl[i].stepping==archStepping)
     197        {
     198            deviceType = amdGpuArchValuesTbl[i].deviceType;
     199            break;
     200        }
     201    outArchMinor = archMinor;
     202    outArchStepping = archStepping;
     203    return deviceType;
    124204}
    125205
Note: See TracChangeset for help on using the changeset viewer.