Changeset 4966 in CLRX


Ignore:
Timestamp:
Sep 16, 2019, 4:10:19 PM (4 weeks ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmROCm: Initialize kernel descriptor if config supplied. Calculate kernel code entry offset from kernel descriptor place.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • CLRadeonExtender/trunk/amdasm/AsmROCmFormat.cpp

    r4965 r4966  
    115115};
    116116
     117static const void configToKernelDescriptor(const AsmROCmKernelConfig& config,
     118                                      ROCmKernelDescriptor& desc)
     119{
     120    desc.groupSegmentFixedSize = config.workgroupGroupSegmentSize;
     121    desc.privateSegmentFixedSize = config.workitemPrivateSegmentSize;
     122    desc.kernelCodeEntryOffset = config.kernelCodeEntryOffset;
     123    desc.pgmRsrc1 = config.computePgmRsrc1;
     124    desc.pgmRsrc2 = config.computePgmRsrc2;
     125    desc.pgmRsrc3 = config.pgmRsrc3;
     126    desc.initialKernelExecState = config.enableSgprRegisterFlags;
     127}
     128
    117129/*
    118130 * ROCm format handler
     
    14931505            break;
    14941506        case ROCMCVAL_USE_WAVE32:
    1495             config.enableFeatureFlags |= ROCMFLAG_USE_WAVE32;
     1507            config.enableSgprRegisterFlags |= ROCMFLAG_USE_WAVE32;
    14961508            break;
    14971509        default:
     
    22432255    size_t sectionsNum = sections.size();
    22442256    output.deviceType = assembler.getDeviceType();
     2257   
     2258    const bool llvm10BinFormat = assembler.isLLVM10BinFormat();
     2259    // check whether ctrlDirSection if llvm10BinFormat
     2260    if (llvm10BinFormat)
     2261        for (const Kernel* kernel: kernelStates)
     2262            if (kernel->ctrlDirSection != ASMSECT_NONE)
     2263            {
     2264                good = false;
     2265                assembler.printError(AsmSourcePos(), "Some kernels have "
     2266                        "Control directive section if LLVM10 binary format used");
     2267                break;
     2268            }
    22452269   
    22462270    prepareKcodeState();
     
    23202344        amdGpuArchValues.stepping = output.archStepping;
    23212345   
     2346    size_t kdescBaseOffset = 0;
     2347    if (llvm10BinFormat)
     2348    {
     2349        AsmSection& asmDSection = assembler.sections[dataSection];
     2350        kdescBaseOffset = ((asmDSection.content.size() + 4095)&0xfff);
     2351    }
    23222352    // prepare kernels configuration
    23232353    for (size_t i = 0; i < kernelStates.size(); i++)
     
    23422372        if (config.amdMachineStepping == BINGEN16_DEFAULT)
    23432373            config.amdMachineStepping = amdGpuArchValues.stepping;
    2344         if (config.kernelCodeEntryOffset == BINGEN64_DEFAULT)
     2374        if (config.kernelCodeEntryOffset == BINGEN64_DEFAULT && !llvm10BinFormat)
    23452375            config.kernelCodeEntryOffset = 256;
    23462376        if (config.kernelCodePrefetchOffset == BINGEN64_DEFAULT)
     
    24722502            config.runtimeLoaderKernelSymbol = 0;
    24732503       
    2474         config.toLE(); // to little-endian
    2475         // put control directive section to config
    2476         if (kernel.ctrlDirSection!=ASMSECT_NONE &&
    2477             assembler.sections[kernel.ctrlDirSection].content.size()==128)
    2478             ::memcpy(config.controlDirective,
    2479                  assembler.sections[kernel.ctrlDirSection].content.data(), 128);
     2504        if (!llvm10BinFormat)
     2505        {
     2506            config.toLE(); // to little-endian
     2507            // put control directive section to config
     2508            if (kernel.ctrlDirSection!=ASMSECT_NONE &&
     2509                assembler.sections[kernel.ctrlDirSection].content.size()==128)
     2510                ::memcpy(config.controlDirective,
     2511                    assembler.sections[kernel.ctrlDirSection].content.data(), 128);
     2512        }
    24802513    }
    24812514   
     
    25182551        kinput.offset = symbol.value;
    25192552       
    2520         if (asmCSection.content.size() < symbol.value + sizeof(ROCmKernelConfig))
     2553        if (!llvm10BinFormat)
    25212554        {
    2522             // if kernel configuration out of section size
    2523             assembler.printError(assembler.kernels[ki].sourcePos, (std::string(
    2524                 "Code for kernel '")+kinput.symbolName.c_str()+
    2525                 "' is too small for configuration").c_str());
    2526             good = false;
    2527             continue;
    2528         }
    2529         else if (kernel.config!=nullptr)
    2530             // put config to code section
    2531             ::memcpy(asmCSection.content.data() + symbol.value,
    2532                      kernel.config.get(), sizeof(ROCmKernelConfig));
     2555            if (asmCSection.content.size() < symbol.value + sizeof(ROCmKernelConfig))
     2556            {
     2557                // if kernel configuration out of section size
     2558                assembler.printError(assembler.kernels[ki].sourcePos, (std::string(
     2559                    "Code for kernel '")+kinput.symbolName.c_str()+
     2560                    "' is too small for configuration").c_str());
     2561                good = false;
     2562                continue;
     2563            }
     2564            else if (kernel.config!=nullptr)
     2565                // put config to code section
     2566                ::memcpy(asmCSection.content.data() + symbol.value,
     2567                        kernel.config.get(), sizeof(ROCmKernelConfig));
     2568        }
     2569        else
     2570        {
     2571            AsmSection& asmDSection = assembler.sections[dataSection];
     2572            if (asmDSection.content.size() < sizeof(ROCmKernelDescriptor)*(ki+1))
     2573            {
     2574                // if kernel descriptor out of section size
     2575                assembler.printError(assembler.kernels[ki].sourcePos, (std::string(
     2576                    "Global data for kernel '")+kinput.symbolName.c_str()+
     2577                    "' is too small for descriptor").c_str());
     2578                good = false;
     2579                continue;
     2580            }
     2581            else if (kernel.config!=nullptr)
     2582            {
     2583                AsmROCmKernelConfig& config = *kernel.config.get();
     2584                if (config.kernelCodeEntryOffset == BINGEN64_DEFAULT)
     2585                    // calculate kernel entry offset (if default)
     2586                    config.kernelCodeEntryOffset = kdescBaseOffset + kinput.offset -
     2587                                ki*sizeof(ROCmKernelDescriptor);
     2588               
     2589                // put kernel descriptor to global data
     2590                ROCmKernelDescriptor kdesc{};
     2591                configToKernelDescriptor(config, kdesc);
     2592                kdesc.toLE();
     2593                ::memcpy(asmDSection.content.data() + ki*sizeof(ROCmKernelDescriptor),
     2594                         &kdesc, sizeof(ROCmKernelDescriptor));
     2595            }
     2596        }
    25332597        // set symbol type
    25342598        kinput.type = kernel.isFKernel ? ROCmRegionType::FKERNEL : ROCmRegionType::KERNEL;
Note: See TracChangeset for help on using the changeset viewer.