Ignore:
Timestamp:
Apr 4, 2017, 12:09:16 PM (2 years ago)
Author:
cameron
Message:

ParabixDriver/ObjectCache? separate compilation and linking: initial check-in with wc

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/toolchain.cpp

    r5377 r5391  
    2424#include <object_cache.h>
    2525#include <kernels/pipeline.h>
     26#include <kernels/interface.h>
     27#include <kernels/kernel.h>
    2628#ifdef CUDA_ENABLED
    2729#include <IR_Gen/llvm2ptx.h>
     
    249251
    250252void ApplyObjectCache(ExecutionEngine * e) {
    251     ICGrepObjectCache * cache = nullptr;
     253    ParabixObjectCache * cache = nullptr;
    252254    if (codegen::EnableObjectCache) {
    253255        if (codegen::ObjectCacheDir.empty())
    254256            // Default is $HOME/.cache/icgrep
    255             cache = new ICGrepObjectCache();
     257            cache = new ParabixObjectCache();
    256258        else
    257             cache = new ICGrepObjectCache(codegen::ObjectCacheDir);
     259            cache = new ParabixObjectCache(codegen::ObjectCacheDir);
    258260        e->setObjectCache(cache);
    259261    }
     
    272274
    273275
     276ParabixDriver::ParabixDriver(IDISA::IDISA_Builder * iBuilder) : iBuilder(iBuilder) {
     277    mMainModule = iBuilder->getModule();
     278    if (codegen::EnableObjectCache) {
     279        if (codegen::ObjectCacheDir.empty()) {
     280            mCache = llvm::make_unique<ParabixObjectCache>();
     281        }
     282        else {
     283            mCache = llvm::make_unique<ParabixObjectCache>(codegen::ObjectCacheDir);
     284        }
     285    }
     286}
     287
     288void ParabixDriver::JITcompileMain () {
     289
     290    // Use the pass manager to optimize the function.
     291    #ifndef NDEBUG
     292    try {
     293    #endif
     294    legacy::PassManager PM;
     295    #ifndef NDEBUG
     296    PM.add(createVerifierPass());
     297    #endif
     298    PM.add(createReassociatePass());             //Reassociate expressions.
     299    PM.add(createGVNPass());                     //Eliminate common subexpressions.
     300    PM.add(createInstructionCombiningPass());    //Simple peephole optimizations and bit-twiddling.
     301    PM.add(createCFGSimplificationPass());   
     302    PM.run(*mMainModule);
     303    #ifndef NDEBUG
     304    } catch (...) { mMainModule->dump(); throw; }
     305    #endif
     306    InitializeNativeTarget();
     307    InitializeNativeTargetAsmPrinter();
     308    InitializeNativeTargetAsmParser();
     309
     310    PassRegistry * Registry = PassRegistry::getPassRegistry();
     311    initializeCore(*Registry);
     312    initializeCodeGen(*Registry);
     313    initializeLowerIntrinsicsPass(*Registry);
     314
     315    std::string errMessage;
     316    EngineBuilder builder{std::unique_ptr<Module>(mMainModule)};
     317    builder.setErrorStr(&errMessage);
     318    TargetOptions opts = InitTargetOptionsFromCodeGenFlags();
     319    opts.MCOptions.AsmVerbose = codegen::AsmVerbose;
     320
     321    builder.setTargetOptions(opts);
     322    builder.setVerifyModules(true);
     323    CodeGenOpt::Level optLevel = CodeGenOpt::Level::None;
     324    switch (codegen::OptLevel) {
     325        case '0': optLevel = CodeGenOpt::None; break;
     326        case '1': optLevel = CodeGenOpt::Less; break;
     327        case '2': optLevel = CodeGenOpt::Default; break;
     328        case '3': optLevel = CodeGenOpt::Aggressive; break;
     329        default: errs() << codegen::OptLevel << " is an invalid optimization level.\n";
     330    }
     331    builder.setOptLevel(optLevel);
     332
     333    setAllFeatures(builder);
     334
     335    if (LLVM_UNLIKELY(codegen::DebugOptionIsSet(codegen::ShowIR))) {
     336        if (codegen::IROutputFilename.empty()) {
     337            mMainModule->dump();
     338        } else {
     339            std::error_code error;
     340            raw_fd_ostream out(codegen::IROutputFilename, error, sys::fs::OpenFlags::F_None);
     341            mMainModule->print(out, nullptr);
     342        }
     343    }
     344#if LLVM_VERSION_MINOR > 6
     345    if (codegen::DebugOptionIsSet(codegen::ShowASM)) {
     346        WriteAssembly(builder.selectTarget(), mMainModule);
     347    }
     348#endif
     349    ExecutionEngine * engine = builder.create();
     350    if (engine == nullptr) {
     351        throw std::runtime_error("Could not create ExecutionEngine: " + errMessage);
     352    }
     353    if (mCache) {
     354        engine->setObjectCache(mCache.get());
     355    }
     356    mEngine = engine;
     357}
     358
     359void ParabixDriver::addKernelCall(kernel::KernelBuilder & kb, const std::vector<parabix::StreamSetBuffer *> & inputs, const std::vector<parabix::StreamSetBuffer *> & outputs) {
     360    mKernelList.push_back(&kb);
     361    kb.setCallParameters(inputs, outputs);
     362}
     363
     364
     365void ParabixDriver::generatePipelineIR() {
     366    for (auto kb : mKernelList) {
     367        kb->addKernelDeclarations(mMainModule);
     368    }
     369    if (codegen::pipelineParallel) {
     370        generateParallelPipeline(iBuilder, mKernelList);
     371    } else if (codegen::segmentPipelineParallel) {
     372        generateSegmentParallelPipeline(iBuilder, mKernelList);
     373    } else {
     374        codegen::ThreadNum = 1;
     375        generatePipelineLoop(iBuilder, mKernelList);
     376    }
     377}
     378
     379void ParabixDriver::linkAndFinalize() {
     380    for (auto kb : mKernelList) {
     381        std::unique_ptr<Module> km = kb->createKernelStub();
     382        if (!(mCache && mCache->loadCachedObjectFile(km.get()))) {
     383            Module * saveM = iBuilder->getModule();
     384            iBuilder->setModule(km.get());
     385            kb->generateKernel();
     386            iBuilder->setModule(saveM);
     387        }
     388        mEngine->addModule(std::move(km));
     389    }
     390    mEngine->finalizeObject();
     391}
     392
     393void * ParabixDriver::getPointerToMain() {
     394    return mEngine->getPointerToNamedFunction("Main");
     395}
     396
Note: See TracChangeset for help on using the changeset viewer.