Ignore:
Timestamp:
Jul 23, 2018, 4:56:33 AM (7 months ago)
Author:
xwa163
Message:
  1. More experiment on lz4 grep
  2. Improve performance of lzparabix grep
File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/kernels/p2s_kernel.cpp

    r6093 r6132  
    4545    }
    4646}
     47
     48
     49    P2S4StreamByPDEP::P2S4StreamByPDEP(const std::unique_ptr<kernel::KernelBuilder> & b)
     50            : BlockOrientedKernel("P2S4StreamByPDEP",
     51                                  {Binding{b->getStreamSetTy(4, 1), "basisBits"}},
     52                                  {Binding{b->getStreamSetTy(1, 4), "byteStream"}},
     53                                  {}, {}, {})
     54    {
     55    }
     56
     57
     58    void P2S4StreamByPDEP::generateDoBlockMethod(const std::unique_ptr<KernelBuilder> & b) {
     59        Function * PDEPFunc = Intrinsic::getDeclaration(getModule(), Intrinsic::x86_bmi_pdep_64);
     60        uint64_t pdepBaseMask = 0x1111111111111111;
     61
     62        Value* inputBlocks[4];
     63
     64        for (unsigned i = 0; i < 4; i++) {
     65            inputBlocks[i] = b->loadInputStreamBlock("basisBits", b->getInt32(i));
     66        }
     67        Value* outputBasePtr = b->CreatePointerCast(b->getOutputStreamBlockPtr("byteStream", b->getSize(0)), b->getInt64Ty()->getPointerTo());
     68
     69        for (unsigned i = 0; i < b->getBitBlockWidth() / 64; i++) {
     70            Value* currentInput[4];
     71            for (unsigned iIndex = 0; iIndex < 4; iIndex++) {
     72                currentInput[iIndex] = b->CreateExtractElement(inputBlocks[iIndex], i);
     73            }
     74
     75            for (unsigned j = 0; j < 4; j++) {
     76                unsigned outputIndex = i * 4 + j;
     77                Value* retI64 = b->getInt64(0);
     78                for (unsigned k = 0; k < 4; k++) {
     79                    Value* newBits = b->CreateCall(
     80                            PDEPFunc,{
     81                                    b->CreateLShr(currentInput[k], b->getInt64(j * 16)),
     82                                    b->getInt64(pdepBaseMask << k)
     83                            }
     84                    );
     85                    retI64 = b->CreateOr(retI64, newBits);
     86                }
     87                b->CreateStore(retI64, b->CreateGEP(outputBasePtr, b->getInt32(outputIndex)));
     88            }
     89        }
     90
     91//        for (unsigned i = 0; i < 4; i++) {
     92//            b->CallPrintRegister("input" + std::to_string(i), inputBlocks[i]);
     93//        }
     94//
     95//        Value* outputBaseBlockPtr = b->CreatePointerCast(b->getOutputStreamBlockPtr("byteStream", b->getSize(0)), b->getBitBlockType()->getPointerTo());
     96//        for (unsigned i = 0; i < 4; i++) {
     97//            b->CallPrintRegister("output" + std::to_string(i), b->CreateLoad(b->CreateGEP(outputBaseBlockPtr, b->getInt32(i))));
     98//        }
     99
     100    }
     101
    47102               
    48103void P2SKernel::generateDoBlockMethod(const std::unique_ptr<KernelBuilder> & b) {
    49104    Value * p_bitblock[8];
    50105    for (unsigned i = 0; i < 8; i++) {
    51         p_bitblock[i] = b->loadInputStreamBlock("basisBits", b->getInt32(i));
     106        if (i < mNumOfStreams) {
     107            p_bitblock[i] = b->loadInputStreamBlock("basisBits", b->getInt32(i));
     108        } else {
     109            p_bitblock[i] = ConstantVector::getNullValue(b->getBitBlockType());
     110        }
     111
    52112    }
    53113    Value * s_bytepack[8];
     
    171231}
    172232
    173 P2SKernel::P2SKernel(const std::unique_ptr<kernel::KernelBuilder> & b, cc::BitNumbering numbering)
    174     : BlockOrientedKernel("p2s" + cc::numberingSuffix(numbering),
    175               {Binding{b->getStreamSetTy(8, 1), "basisBits"}},
     233
     234
     235
     236P2SKernel::P2SKernel(const std::unique_ptr<kernel::KernelBuilder> & b, cc::BitNumbering numbering, std::string prefix, unsigned numOfStreams)
     237    : BlockOrientedKernel(prefix + "p2s" + cc::numberingSuffix(numbering),
     238              {Binding{b->getStreamSetTy(numOfStreams, 1), "basisBits"}},
    176239              {Binding{b->getStreamSetTy(1, 8), "byteStream"}},
    177240              {}, {}, {}),
    178     mBasisSetNumbering(numbering) {
     241    mBasisSetNumbering(numbering),
     242      mNumOfStreams(numOfStreams) {
    179243}
    180244
Note: See TracChangeset for help on using the changeset viewer.