Changeset 5845


Ignore:
Timestamp:
Jan 26, 2018, 3:17:00 AM (10 months ago)
Author:
xwa163
Message:

Update consumedItemCount early in pipeline

File:
1 edited

Legend:

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

    r5833 r5845  
    9898    StreamSetBufferMap<Value *> producedItemCount;
    9999    StreamSetBufferMap<Value *> consumedItemCount;
     100    StreamSetBufferMap<Kernel *> lastUsedKernel;
    100101
    101102    Value * cycleCountStart = nullptr;
     
    108109
    109110    const bool serialize = codegen::DebugOptionIsSet(codegen::SerializeThreads);
     111
     112    for (Kernel * const kernel : kernels) {
     113        const auto & inputs = kernel->getStreamInputs();
     114        for (unsigned i = 0; i < inputs.size(); ++i) {
     115            const StreamSetBuffer * const buffer = kernel->getStreamSetInputBuffer(i);
     116            auto f = lastUsedKernel.find(buffer);
     117            if (f == lastUsedKernel.end()) {
     118                lastUsedKernel.emplace(buffer, kernel);
     119            } else {
     120                f->second = kernel;
     121            }
     122        }
     123    }
    110124
    111125    for (unsigned k = 0; k < n; ++k) {
     
    182196        }
    183197
     198        for (auto i = lastUsedKernel.begin(); i != lastUsedKernel.end(); i++) {
     199            if (i->second == kernel) {
     200                const StreamSetBuffer * const buffer = i->first;
     201                Kernel * const producerKernel = buffer->getProducer();
     202                const auto & binding = producerKernel->getStreamOutput(buffer);
     203                if (LLVM_UNLIKELY(binding.getRate().isDerived())) {
     204                    continue;
     205                }
     206                auto f = consumedItemCount.find(buffer);
     207                if (f != consumedItemCount.end()) {
     208                    const Kernel* tempKernel = b->getKernel();
     209                    b->setKernel(producerKernel);
     210                    b->setConsumedItemCount(binding.getName(), f->second);
     211                    b->setKernel(tempKernel);
     212                }
     213            }
     214        }
     215
     216
    184217        if (DebugOptionIsSet(codegen::EnableCycleCounter)) {
    185218            cycleCountEnd = b->CreateReadCycleCounter();
     
    193226
    194227    exitThreadBlock->moveAfter(b->GetInsertBlock());
    195     for (const auto consumed : consumedItemCount) {
    196         const StreamSetBuffer * const buf = consumed.first;
    197         Kernel * const k = buf->getProducer();
    198         const auto & outputs = k->getStreamSetOutputBuffers();
    199         for (unsigned i = 0; i < outputs.size(); ++i) {
    200             if (outputs[i] == buf) {
    201                 const auto & binding = k->getStreamOutput(i);
    202                 if (LLVM_UNLIKELY(binding.getRate().isDerived())) {
    203                     continue;
    204                 }
    205                 b->setKernel(k);
    206                 b->setConsumedItemCount(binding.getName(), consumed.second);
    207                 break;
    208             }
    209         }
    210     }
    211228
    212229    segNo->addIncoming(b->CreateAdd(segNo, b->getSize(codegen::ThreadNum)), b->GetInsertBlock());
     
    314331    StreamSetBufferMap<Value *> producedItemCount;
    315332    StreamSetBufferMap<Value *> consumedItemCount;
     333    StreamSetBufferMap<Kernel *> lastUsedKernel;
    316334
    317335    b->CreateBr(pipelineLoop);
     
    326344
    327345    for (Kernel * const kernel : kernels) {
     346        const auto & inputs = kernel->getStreamInputs();
     347        for (unsigned i = 0; i < inputs.size(); ++i) {
     348            const StreamSetBuffer * const buffer = kernel->getStreamSetInputBuffer(i);
     349            auto f = lastUsedKernel.find(buffer);
     350            if (f == lastUsedKernel.end()) {
     351                lastUsedKernel.emplace(buffer, kernel);
     352            } else {
     353                f->second = kernel;
     354            }
     355        }
     356    }
     357
     358    for (Kernel * const kernel : kernels) {
    328359
    329360        b->setKernel(kernel);
     
    343374        std::vector<Value *> args = {kernel->getInstance(), isFinal};
    344375
     376        const auto name = kernel->getName();
    345377        for (unsigned i = 0; i < inputs.size(); ++i) {
    346378            const StreamSetBuffer * const buffer = kernel->getStreamSetInputBuffer(i);
     
    390422        }
    391423
     424        for (auto i = lastUsedKernel.begin(); i != lastUsedKernel.end(); i++) {
     425            if (i->second == kernel) {
     426                const StreamSetBuffer * const buffer = i->first;
     427                Kernel * const producerKernel = buffer->getProducer();
     428                const auto & binding = producerKernel->getStreamOutput(buffer);
     429                if (LLVM_UNLIKELY(binding.getRate().isDerived())) {
     430                    continue;
     431                }
     432                auto f = consumedItemCount.find(buffer);
     433                if (f != consumedItemCount.end()) {
     434                    const Kernel* tempKernel = b->getKernel();
     435                    b->setKernel(producerKernel);
     436                    b->setConsumedItemCount(binding.getName(), f->second);
     437                    b->setKernel(tempKernel);
     438                }
     439            }
     440        }
     441
    392442        if (LLVM_UNLIKELY(DebugOptionIsSet(codegen::EnableCycleCounter))) {
    393443            cycleCountEnd = b->CreateReadCycleCounter();
     
    399449//        Value * nextSegNo = b->CreateAdd(segNo, b->getSize(1));
    400450//        b->releaseLogicalSegmentNo(nextSegNo);
    401     }
    402 
    403     for (const auto consumed : consumedItemCount) {
    404         const StreamSetBuffer * const buffer = consumed.first;
    405         Kernel * const kernel = buffer->getProducer();
    406         const auto & binding = kernel->getStreamOutput(buffer);
    407         if (LLVM_UNLIKELY(binding.getRate().isDerived())) {
    408             continue;
    409         }
    410         b->setKernel(kernel);
    411         b->setConsumedItemCount(binding.getName(), consumed.second);
    412451    }
    413452
Note: See TracChangeset for help on using the changeset viewer.