Changeset 3277 in CLRX


Ignore:
Timestamp:
Sep 1, 2017, 2:24:39 PM (5 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmGallium?: Fixed support for binaries generated for GalliumCompute? with LLVM 4.0 (max proginfo entries,
LLVM version determining,...). Preliminary code for new config pseudo-ops.

Location:
CLRadeonExtender/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • CLRadeonExtender/trunk/CLRX/amdasm/AsmFormats.h

    r3194 r3277  
    352352};
    353353
     354/// Asm AMD HSA kernel configuration
     355struct AsmAmdHsaKernelConfig: AmdHsaKernelConfig
     356{
     357    cxuint dimMask;    ///< mask of dimension (bits: 0 - X, 1 - Y, 2 - Z)
     358    cxuint usedVGPRsNum;  ///< number of used VGPRs
     359    cxuint usedSGPRsNum;  ///< number of used SGPRs
     360    cxbyte userDataNum;   ///< number of user data
     361    bool ieeeMode;  ///< IEEE mode
     362    cxbyte floatMode; ///< float mode
     363    cxbyte priority;    ///< priority
     364    cxbyte exceptions;      ///< enabled exceptions
     365    bool tgSize;        ///< enable TG_SIZE_EN bit
     366    bool debugMode;     ///< debug mode
     367    bool privilegedMode;   ///< prvileged mode
     368    bool dx10Clamp;     ///< DX10 CLAMP mode
     369};
     370
    354371/// handles GalliumCompute format
    355372class AsmGalliumHandler: public AsmFormatHandler
     
    373390    {
    374391        cxuint defaultSection;
     392        std::unique_ptr<AsmAmdHsaKernelConfig> config;
    375393        bool hasProgInfo;
    376394        cxbyte progInfoEntries;
    377395        cxuint allocRegs[MAX_REGTYPES_NUM];
    378396        Flags allocRegFlags;
     397       
     398        void initializeAmdHsaKernelConfig();
    379399    };
    380400    std::vector<Kernel> kernelStates;
     
    419439};
    420440
    421 /// ROCm kernel configuration
    422 struct AsmROCmKernelConfig: ROCmKernelConfig
    423 {
    424     cxuint dimMask;    ///< mask of dimension (bits: 0 - X, 1 - Y, 2 - Z)
    425     cxuint usedVGPRsNum;  ///< number of used VGPRs
    426     cxuint usedSGPRsNum;  ///< number of used SGPRs
    427     cxbyte userDataNum;   ///< number of user data
    428     bool ieeeMode;  ///< IEEE mode
    429     cxbyte floatMode; ///< float mode
    430     cxbyte priority;    ///< priority
    431     cxbyte exceptions;      ///< enabled exceptions
    432     bool tgSize;        ///< enable TG_SIZE_EN bit
    433     bool debugMode;     ///< debug mode
    434     bool privilegedMode;   ///< prvileged mode
    435     bool dx10Clamp;     ///< DX10 CLAMP mode
    436 };
     441typedef AsmAmdHsaKernelConfig AsmROCmKernelConfig;
    437442
    438443/// handles ROCM binary format
  • CLRadeonExtender/trunk/amdasm/AsmGalliumFormat.cpp

    r3276 r3277  
    6464};
    6565
     66static cxuint determineLLVMVersion(Assembler& asmr)
     67{
     68    if (asmr.getLLVMVersion() == 0)
     69        return detectLLVMCompilerVersion();
     70    else
     71        return asmr.getLLVMVersion();
     72}
     73
     74void AsmGalliumHandler::Kernel::initializeAmdHsaKernelConfig()
     75{
     76    if (!config)
     77    {
     78        config.reset(new AsmROCmKernelConfig{});
     79        // set default values to kernel config
     80        ::memset(config.get(), 0xff, 128);
     81        ::memset(config->controlDirective, 0, 128);
     82        config->computePgmRsrc1 = config->computePgmRsrc2 = 0;
     83        config->enableSgprRegisterFlags = 0;
     84        config->enableFeatureFlags = 0;
     85        config->reserved1[0] = config->reserved1[1] = config->reserved1[2] = 0;
     86        config->dimMask = 0;
     87        config->usedVGPRsNum = BINGEN_DEFAULT;
     88        config->usedSGPRsNum = BINGEN_DEFAULT;
     89        config->userDataNum = BINGEN8_DEFAULT;
     90        config->ieeeMode = false;
     91        config->floatMode = 0xc0;
     92        config->priority = 0;
     93        config->exceptions = 0;
     94        config->tgSize = false;
     95        config->debugMode = false;
     96        config->privilegedMode = false;
     97        config->dx10Clamp = false;
     98    }
     99}
     100
    66101/*
    67102 * GalliumCompute format handler
     
    85120    cxuint thisKernel = output.kernels.size();
    86121    cxuint thisSection = sections.size();
    87     output.addEmptyKernel(kernelName, assembler.llvmVersion);
     122    output.addEmptyKernel(kernelName, determineLLVMVersion(assembler));
    88123    /// add kernel config section
    89124    sections.push_back({ thisKernel, AsmSectionType::CONFIG, ELFSECTID_UNDEF, nullptr });
    90     kernelStates.push_back({ thisSection, false, 0 });
     125    kernelStates.push_back({ thisSection, nullptr, false, 0 });
    91126   
    92127    if (assembler.currentKernel == ASMKERN_GLOBAL)
     
    326361    cxuint driverVersion = 0;
    327362    if (getLLVMVersion)
    328     {
    329         if (asmr.llvmVersion == 0)
    330             driverVersion = detectLLVMCompilerVersion();
    331         else
    332             driverVersion = asmr.llvmVersion;
    333     }
     363        driverVersion = determineLLVMVersion(asmr);
    334364    else
    335365    {
     
    374404    handler.inside = AsmGalliumHandler::Inside::CONFIG;
    375405    handler.output.kernels[asmr.currentKernel].useConfig = true;
     406    if (determineLLVMVersion(asmr) >= 40000U) // HSA since LLVM 4.0
     407        handler.kernelStates[asmr.currentKernel].initializeAmdHsaKernelConfig();
    376408}
    377409
     
    418450        return;
    419451    }
     452   
     453    /*if (target >= GALLIUMCVAL_HSA_FIRST_PARAM && handler.kern)
     454    {
     455        return;
     456    }*/
    420457   
    421458    skipSpacesToEnd(linePtr, end);
     
    429466        {
    430467            case GALLIUMCVAL_SGPRSNUM:
     468            case GALLIUMCVAL_HSA_SGPRSNUM:
    431469            {
    432470                const GPUArchitecture arch = getGPUArchitectureFromDeviceType(
     
    443481            }
    444482            case GALLIUMCVAL_VGPRSNUM:
     483            case GALLIUMCVAL_HSA_VGPRSNUM:
    445484            {
    446485                const GPUArchitecture arch = getGPUArchitectureFromDeviceType(
     
    487526            }
    488527            case GALLIUMCVAL_EXCEPTIONS:
     528            case GALLIUMCVAL_HSA_EXCEPTIONS:
    489529                asmr.printWarningForRange(7, value,
    490530                                  asmr.getSourcePos(valuePlace), WS_UNSIGNED);
     
    492532                break;
    493533            case GALLIUMCVAL_FLOATMODE:
     534            case GALLIUMCVAL_HSA_FLOATMODE:
    494535                asmr.printWarningForRange(8, value,
    495536                                  asmr.getSourcePos(valuePlace), WS_UNSIGNED);
     
    497538                break;
    498539            case GALLIUMCVAL_PRIORITY:
     540            case GALLIUMCVAL_HSA_PRIORITY:
    499541                asmr.printWarningForRange(2, value,
    500542                                  asmr.getSourcePos(valuePlace), WS_UNSIGNED);
     
    502544                break;
    503545            case GALLIUMCVAL_LOCALSIZE:
     546            case GALLIUMCVAL_WORKGROUP_GROUP_SEGMENT_SIZE:
    504547            {
    505548                const GPUArchitecture arch = getGPUArchitectureFromDeviceType(
     
    516559            }
    517560            case GALLIUMCVAL_USERDATANUM:
     561            case GALLIUMCVAL_HSA_USERDATANUM:
    518562                if (value > 16)
    519563                {
     
    524568            case GALLIUMCVAL_PGMRSRC1:
    525569            case GALLIUMCVAL_PGMRSRC2:
     570            case GALLIUMCVAL_HSA_PGMRSRC1:
     571            case GALLIUMCVAL_HSA_PGMRSRC2:
    526572                asmr.printWarningForRange(32, value,
    527573                                  asmr.getSourcePos(valuePlace), WS_UNSIGNED);
    528574                break;
     575           
     576            case GALLIUMCVAL_PRIVATE_ELEM_SIZE:
     577                if (value==0 || 1ULL<<(63-CLZ64(value)) != value)
     578                {
     579                    asmr.printError(valuePlace,
     580                                    "Private element size must be power of two");
     581                    good = false;
     582                }
     583                else if (value < 2 || value > 16)
     584                {
     585                    asmr.printError(valuePlace, "Private element size out of range");
     586                    good = false;
     587                }
     588                break;
     589            case GALLIUMCVAL_KERNARG_SEGMENT_ALIGN:
     590            case GALLIUMCVAL_GROUP_SEGMENT_ALIGN:
     591            case GALLIUMCVAL_PRIVATE_SEGMENT_ALIGN:
     592                if (value==0 || 1ULL<<(63-CLZ64(value)) != value)
     593                {
     594                    asmr.printError(valuePlace, "Alignment must be power of two");
     595                    good = false;
     596                }
     597                else if (value < 16)
     598                {
     599                    asmr.printError(valuePlace, "Alignment must be not smaller than 16");
     600                    good = false;
     601                }
     602                break;
     603            case GALLIUMCVAL_WAVEFRONT_SIZE:
     604                if (value==0 || 1ULL<<(63-CLZ64(value)) != value)
     605                {
     606                    asmr.printError(valuePlace, "Wavefront size must be power of two");
     607                    good = false;
     608                }
     609                else if (value > 256)
     610                {
     611                    asmr.printError(valuePlace,
     612                                "Wavefront size must be not greater than 256");
     613                    good = false;
     614                }
     615                break;
     616            case GALLIUMCVAL_WORKITEM_PRIVATE_SEGMENT_SIZE:
     617            case GALLIUMCVAL_GDS_SEGMENT_SIZE:
     618            case GALLIUMCVAL_WORKGROUP_FBARRIER_COUNT:
     619            case GALLIUMCVAL_CALL_CONVENTION:
     620                asmr.printWarningForRange(32, value,
     621                                  asmr.getSourcePos(valuePlace), WS_UNSIGNED);
     622                break;
     623            case GALLIUMCVAL_DEBUG_WAVEFRONT_PRIVATE_SEGMENT_OFFSET_SGPR:
     624            case GALLIUMCVAL_DEBUG_PRIVATE_SEGMENT_BUFFER_SGPR:
     625            {
     626                const GPUArchitecture arch = getGPUArchitectureFromDeviceType(
     627                            asmr.deviceType);
     628                cxuint maxSGPRsNum = getGPUMaxRegistersNum(arch, REGTYPE_SGPR, 0);
     629                if (value >= maxSGPRsNum)
     630                {
     631                    asmr.printError(valuePlace, "SGPR register out of range");
     632                    good = false;
     633                }
     634                break;
     635            }
    529636            default:
    530637                break;
     
    877984    AsmGalliumHandler::Kernel& kstate = handler.kernelStates[asmr.currentKernel];
    878985    kstate.hasProgInfo = true;
    879     if (kstate.progInfoEntries == 3)
     986    const cxuint llvmVersion = determineLLVMVersion(asmr);
     987    if (llvmVersion<30900U && kstate.progInfoEntries == 3)
    880988    {
    881989        asmr.printError(pseudoOpPlace, "Maximum 3 entries can be in ProgInfo");
     990        return;
     991    }
     992    if (llvmVersion>=30900U && kstate.progInfoEntries == 5)
     993    {
     994        asmr.printError(pseudoOpPlace, "Maximum 5 entries can be in ProgInfo");
    882995        return;
    883996    }
  • CLRadeonExtender/trunk/amdasm/AsmInternals.h

    r3156 r3277  
    317317    GALLIUMCVAL_EXCEPTIONS,
    318318    GALLIUMCVAL_SPILLEDSGPRS,
    319     GALLIUMCVAL_SPILLEDVGPRS
     319    GALLIUMCVAL_SPILLEDVGPRS,
     320    GALLIUMCVAL_HSA_SGPRSNUM,
     321    GALLIUMCVAL_HSA_VGPRSNUM,
     322    GALLIUMCVAL_HSA_PRIVMODE,
     323    GALLIUMCVAL_HSA_DEBUGMODE,
     324    GALLIUMCVAL_HSA_DX10CLAMP,
     325    GALLIUMCVAL_HSA_IEEEMODE,
     326    GALLIUMCVAL_HSA_TGSIZE,
     327    GALLIUMCVAL_HSA_FLOATMODE,
     328    GALLIUMCVAL_HSA_PRIORITY,
     329    GALLIUMCVAL_HSA_EXCEPTIONS,
     330    GALLIUMCVAL_HSA_USERDATANUM,
     331    GALLIUMCVAL_HSA_PGMRSRC1,
     332    GALLIUMCVAL_HSA_PGMRSRC2,
     333    GALLIUMCVAL_KERNEL_CODE_ENTRY_OFFSET,
     334    GALLIUMCVAL_KERNEL_CODE_PREFETCH_OFFSET,
     335    GALLIUMCVAL_KERNEL_CODE_PREFETCH_SIZE,
     336    GALLIUMCVAL_MAX_SCRATCH_BACKING_MEMORY,
     337    GALLIUMCVAL_USE_PRIVATE_SEGMENT_BUFFER,
     338    GALLIUMCVAL_USE_DISPATCH_PTR,
     339    GALLIUMCVAL_USE_QUEUE_PTR,
     340    GALLIUMCVAL_USE_KERNARG_SEGMENT_PTR,
     341    GALLIUMCVAL_USE_DISPATCH_ID,
     342    GALLIUMCVAL_USE_FLAT_SCRATCH_INIT,
     343    GALLIUMCVAL_USE_PRIVATE_SEGMENT_SIZE,
     344    GALLIUMCVAL_USE_ORDERED_APPEND_GDS,
     345    GALLIUMCVAL_PRIVATE_ELEM_SIZE,
     346    GALLIUMCVAL_USE_PTR64,
     347    GALLIUMCVAL_USE_DYNAMIC_CALL_STACK,
     348    GALLIUMCVAL_USE_DEBUG_ENABLED,
     349    GALLIUMCVAL_USE_XNACK_ENABLED,
     350    GALLIUMCVAL_WORKITEM_PRIVATE_SEGMENT_SIZE,
     351    GALLIUMCVAL_WORKGROUP_GROUP_SEGMENT_SIZE,
     352    GALLIUMCVAL_GDS_SEGMENT_SIZE,
     353    GALLIUMCVAL_KERNARG_SEGMENT_SIZE,
     354    GALLIUMCVAL_WORKGROUP_FBARRIER_COUNT,
     355    GALLIUMCVAL_WAVEFRONT_SGPR_COUNT,
     356    GALLIUMCVAL_WORKITEM_VGPR_COUNT,
     357    GALLIUMCVAL_DEBUG_WAVEFRONT_PRIVATE_SEGMENT_OFFSET_SGPR,
     358    GALLIUMCVAL_DEBUG_PRIVATE_SEGMENT_BUFFER_SGPR,
     359    GALLIUMCVAL_KERNARG_SEGMENT_ALIGN,
     360    GALLIUMCVAL_GROUP_SEGMENT_ALIGN,
     361    GALLIUMCVAL_PRIVATE_SEGMENT_ALIGN,
     362    GALLIUMCVAL_WAVEFRONT_SIZE,
     363    GALLIUMCVAL_CALL_CONVENTION,
     364    GALLIUMCVAL_RUNTIME_LOADER_KERNEL_SYMBOL,
     365    GALLIUMCVAL_HSA_FIRST_PARAM = GALLIUMCVAL_HSA_SGPRSNUM
    320366};
    321367
Note: See TracChangeset for help on using the changeset viewer.