Changeset 4961 in CLRX


Ignore:
Timestamp:
Sep 14, 2019, 12:50:45 PM (5 weeks ago)
Author:
matszpk
Message:

CLRadeonExtender: ROCmBin: Write metadata in V3 format (in ROCmBinGenerator).

Location:
CLRadeonExtender/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • CLRadeonExtender/trunk/CLRX/amdbin/ROCmBinaries.h

    r4953 r4961  
    471471    std::unique_ptr<cxbyte[]> noteBuf;
    472472    std::string metadataStr;
     473    std::vector<cxbyte> metadataBytes;
    473474    size_t metadataSize;
    474475    const char* metadata;
  • CLRadeonExtender/trunk/amdbin/ROCmBinaries.cpp

    r4945 r4961  
    554554void ROCmBinGenerator::prepareBinaryGen()
    555555{
     556    if (input->globalData == nullptr && (input->llvm10BinFormat || input->metadataV3Format))
     557        throw BinGenException("LLVM10 binary format requires global data");
     558   
    556559    AMDGPUArchVersion amdGpuArchValues = getGPUArchVersion(input->deviceType,
    557560                GPUArchVersionTable::ROCM);
     
    671674       
    672675        const size_t mdKernelsNum = input->metadataInfo.kernels.size();
    673         std::unique_ptr<const ROCmKernelConfig*[]> kernelConfigPtrs(
    674                 new const ROCmKernelConfig*[mdKernelsNum]);
    675         // generate ROCm kernel config pointers
    676         for (size_t k = 0; k < mdKernelsNum; k++)
    677         {
    678             auto it = binaryMapFind(symbolIndices.begin(), symbolIndices.end(),
    679                         input->metadataInfo.kernels[k].name);
    680             if (it == symbolIndices.end() ||
    681                 (input->symbols[it->second].type != ROCmRegionType::FKERNEL &&
    682                  input->symbols[it->second].type != ROCmRegionType::KERNEL))
    683                 throw BinGenException("Kernel in metadata doesn't exists in code");
    684             kernelConfigPtrs[k] = reinterpret_cast<const ROCmKernelConfig*>(
    685                         input->code + input->symbols[it->second].offset);
    686         }
    687         // just generate ROCm metadata from info
    688         generateROCmMetadata(input->metadataInfo, kernelConfigPtrs.get(), metadataStr);
    689         metadataSize = metadataStr.size();
    690         metadata = metadataStr.c_str();
     676        if (!input->metadataV3Format)
     677        {
     678            std::unique_ptr<const ROCmKernelConfig*[]> kernelConfigPtrs(
     679                    new const ROCmKernelConfig*[mdKernelsNum]);
     680            // generate ROCm kernel config pointers
     681            for (size_t k = 0; k < mdKernelsNum; k++)
     682            {
     683                auto it = binaryMapFind(symbolIndices.begin(), symbolIndices.end(),
     684                            input->metadataInfo.kernels[k].name);
     685                if (it == symbolIndices.end() ||
     686                    (input->symbols[it->second].type != ROCmRegionType::FKERNEL &&
     687                    input->symbols[it->second].type != ROCmRegionType::KERNEL))
     688                    throw BinGenException("Kernel in metadata doesn't exists in code");
     689                kernelConfigPtrs[k] = reinterpret_cast<const ROCmKernelConfig*>(
     690                            input->code + input->symbols[it->second].offset);
     691            }
     692            // just generate ROCm metadata from info
     693            generateROCmMetadata(input->metadataInfo, kernelConfigPtrs.get(), metadataStr);
     694            metadataSize = metadataStr.size();
     695            metadata = metadataStr.c_str();
     696        }
     697        else
     698        {
     699            std::unique_ptr<const ROCmKernelDescriptor*[]> kernelDescPtrs(
     700                    new const ROCmKernelDescriptor*[mdKernelsNum]);
     701            for (size_t k = 0; k < mdKernelsNum; k++)
     702                kernelDescPtrs[k] = reinterpret_cast<const ROCmKernelDescriptor*>(
     703                            input->globalData + k*sizeof(ROCmKernelDescriptor));
     704            // just generate ROCm metadata from info
     705            generateROCmMetadataMsgPack(input->metadataInfo,
     706                                kernelDescPtrs.get(), metadataBytes);
     707            metadataSize = metadataStr.size();
     708            metadata = metadataStr.c_str();
     709        }
    691710    }
    692711   
    693712    if (metadataSize != 0)
    694         elfBinGen64->addNote({"AMD", metadataSize, (const cxbyte*)metadata, 0xaU});
     713    {
     714        if (!input->metadataV3Format)
     715            elfBinGen64->addNote({"AMD", metadataSize, (const cxbyte*)metadata, 0xaU});
     716        else
     717            elfBinGen64->addNote({"AMDGPU", metadataSize, (const cxbyte*)metadata, 0x20U});
     718    }
    695719   
    696720    /// region and sections
Note: See TracChangeset for help on using the changeset viewer.