Ignore:
Timestamp:
Aug 5, 2018, 9:06:54 PM (11 months ago)
Author:
xwa163
Message:

UTF-8 support for Multiplexing LZ4 Grep

File:
1 edited

Legend:

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

    r6136 r6140  
    1515namespace kernel {
    1616
    17     TwistByPDEPKernel::TwistByPDEPKernel(const std::unique_ptr <kernel::KernelBuilder> &b, unsigned numberOfInputStream, unsigned twistWidth)
    18             : BlockOrientedKernel("TwistByPDEPKernel",
    19                                   {Binding{b->getStreamSetTy(numberOfInputStream, 1), "basisBits"}},
    20                                   {Binding{b->getStreamSetTy(1, twistWidth), "byteStream"}},
    21                                   {}, {}, {}),
    22               mNumberOfInputStream(numberOfInputStream),
    23               mTwistWidth(twistWidth)
    24     {
    25         assert(twistWidth == 2 || twistWidth == 4);
    26         assert(numberOfInputStream <= twistWidth);
    27     }
    28 
    29     void TwistByPDEPKernel::generateDoBlockMethod(const std::unique_ptr <kernel::KernelBuilder> &b) {
    30         Function *PDEPFunc = Intrinsic::getDeclaration(getModule(), Intrinsic::x86_bmi_pdep_64);
     17    void twistByPDEP(const std::unique_ptr <kernel::KernelBuilder> &b, Value *inputBlocks[], unsigned mTwistWidth, Value* outputBasePtr) {
     18        Function *PDEPFunc = Intrinsic::getDeclaration(b->getModule(), Intrinsic::x86_bmi_pdep_64);
    3119        uint64_t pdepBaseMask = mTwistWidth == 2? 0x5555555555555555 : 0x1111111111111111;
    32 
    33         Value *inputBlocks[mTwistWidth];
    34         for (unsigned i = 0; i < mTwistWidth; i++) {
    35             if (i < mNumberOfInputStream) {
    36                 inputBlocks[i] = b->loadInputStreamBlock("basisBits", b->getInt32(i));
    37 //            b->CallPrintRegister("input" + std::to_string(i), inputBlocks[i]);
    38 
    39             } else {
    40                 inputBlocks[i] = ConstantVector::getNullValue(b->getBitBlockType());
    41             }
    42         }
    43 
    44         Value *outputBasePtr = b->CreatePointerCast(b->getOutputStreamBlockPtr("byteStream", b->getSize(0)),
    45                                                     b->getInt64Ty()->getPointerTo());
    4620
    4721        for (unsigned i = 0; i < b->getBitBlockWidth() / 64; i++) {
     
    6842    }
    6943
     44
     45
     46
     47    TwistByPDEPKernel::TwistByPDEPKernel(const std::unique_ptr <kernel::KernelBuilder> &b, unsigned numberOfInputStream, unsigned twistWidth)
     48            : BlockOrientedKernel("TwistByPDEPKernel",
     49                                  {Binding{b->getStreamSetTy(numberOfInputStream, 1), "basisBits"}},
     50                                  {Binding{b->getStreamSetTy(1, twistWidth), "byteStream"}},
     51                                  {}, {}, {}),
     52              mNumberOfInputStream(numberOfInputStream),
     53              mTwistWidth(twistWidth)
     54    {
     55        assert(twistWidth == 2 || twistWidth == 4);
     56        assert(numberOfInputStream <= twistWidth);
     57    }
     58
     59    void TwistByPDEPKernel::generateDoBlockMethod(const std::unique_ptr <kernel::KernelBuilder> &b) {
     60        Value *inputBlocks[mTwistWidth];
     61
     62        for (unsigned i = 0; i < mTwistWidth; i++) {
     63            if (i < mNumberOfInputStream) {
     64                inputBlocks[i] = b->loadInputStreamBlock("basisBits", b->getInt32(i));
     65            } else {
     66                inputBlocks[i] = ConstantVector::getNullValue(b->getBitBlockType());
     67            }
     68        }
     69
     70        Value *outputBasePtr = b->CreatePointerCast(b->getOutputStreamBlockPtr("byteStream", b->getSize(0)),
     71                                                    b->getInt64Ty()->getPointerTo());
     72        twistByPDEP(b, inputBlocks, mTwistWidth, outputBasePtr);
     73    }
     74
     75
     76    TwistMultipleByPDEPKernel::TwistMultipleByPDEPKernel(const std::unique_ptr<kernel::KernelBuilder> &b,
     77                                                         unsigned numberOfInputStreamSet, unsigned twistWidth)
     78            : BlockOrientedKernel("TwistMultipleByPDEPKernel",
     79                                  {},
     80                                  {Binding{b->getStreamSetTy(1, twistWidth), "byteStream"}},
     81                                  {}, {}, {}),
     82              mNumberOfInputStreamSet(numberOfInputStreamSet),
     83              mTwistWidth(twistWidth)
     84    {
     85        for (unsigned i = 0; i < numberOfInputStreamSet; i++) {
     86            mStreamSetInputs.push_back(Binding{b->getStreamSetTy(1), "basisBits_" + std::to_string(i) });
     87        }
     88    }
     89
     90    void TwistMultipleByPDEPKernel::generateDoBlockMethod(const std::unique_ptr<kernel::KernelBuilder> &b) {
     91        Value *inputBlocks[mTwistWidth];
     92
     93        for (unsigned i = 0; i < mTwistWidth; i++) {
     94            if (i < mNumberOfInputStreamSet) {
     95                inputBlocks[i] = b->loadInputStreamBlock("basisBits_" + std::to_string(i), b->getInt32(0));
     96                if (i == 0) {
     97                    b->CallPrintRegister("basisBits_" + std::to_string(i), inputBlocks[i]);
     98                }
     99            } else {
     100                inputBlocks[i] = ConstantVector::getNullValue(b->getBitBlockType());
     101            }
     102        }
     103
     104        Value *outputBasePtr = b->CreatePointerCast(b->getOutputStreamBlockPtr("byteStream", b->getSize(0)),
     105                                                    b->getInt64Ty()->getPointerTo());
     106        twistByPDEP(b, inputBlocks, mTwistWidth, outputBasePtr);
     107    }
    70108}
Note: See TracChangeset for help on using the changeset viewer.