Ignore:
Timestamp:
Jul 30, 2018, 1:36:48 AM (8 months ago)
Author:
xwa163
Message:
  1. Implement twist_kernel and untwist_kernel by PEXT and PDEP
  2. Use twist form for multiplexing lz4 grep
File:
1 edited

Legend:

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

    r6132 r6135  
    1717
    1818const int PACK_LANES = 2;
    19 
    2019void s2p_step(const std::unique_ptr<KernelBuilder> & iBuilder, Value * s0, Value * s1, Value * hi_mask, unsigned shift, Value * &p0, Value * &p1) {
    2120    Value * t0 = nullptr;
     
    3130        t0 = iBuilder->hsimd_packh(16, s0, s1);
    3231        t1 = iBuilder->hsimd_packl(16, s0, s1);
    33     }
    34     if (shift == 1) {
    35 //        iBuilder->CallPrintRegister("t0", t0);
    36 //        iBuilder->CallPrintRegister("t1", t1);
    3732    }
    3833
     
    5651        s2p_step(iBuilder, bit2200[0], bit2200[1],
    5752                 iBuilder->simd_himask(4), 2, out[2], out[0]);
    58         for (unsigned i = 0; i < 4; i++) {
    59 //            iBuilder->CallPrintRegister("input" + std::to_string(i), input[i]);
    60         }
    61         for (unsigned i = 0; i < 4; i++) {
    62 //            iBuilder->CallPrintRegister("out" + std::to_string(i), out[i]);
    63         }
    6453    }
    6554
     
    6857    Value * bit66442200[4];
    6958    Value * bit77553311[4];
    70 //    iBuilder->CallPrintRegister("himask2", iBuilder->simd_himask(2));
    71 //    iBuilder->CallPrintRegister("himask4", iBuilder->simd_himask(4));
    72 //    iBuilder->CallPrintRegister("himask8", iBuilder->simd_himask(8));
    7359
    7460    for (unsigned i = 0; i < 4; i++) {
    7561        Value * s0 = input[2 * i];
    7662        Value * s1 = input[2 * i + 1];
    77 //        iBuilder->CallPrintRegister("s0_" + std::to_string(2 * i), s0);
    78 //        iBuilder->CallPrintRegister("s1_" + std::to_string(2 * i + 1), s1);
    7963        s2p_step(iBuilder, s0, s1, iBuilder->simd_himask(2), 1, bit77553311[i], bit66442200[i]);
    80 //        iBuilder->CallPrintRegister("bit77553311", bit77553311[i]);
    81 //        iBuilder->CallPrintRegister("bit66442200", bit66442200[i]);
    8264    }
    8365    Value * bit44440000[2];
     
    10284        s2p_step(iBuilder, bit66662222[0], bit66662222[1], iBuilder->simd_himask(8), 4, output[1], output[5]);
    10385        s2p_step(iBuilder, bit77773333[0], bit77773333[1], iBuilder->simd_himask(8), 4, output[0], output[4]);
    104     }
    105 
    106     for (unsigned i = 0; i < 8; i++) {
    107 //        iBuilder->CallPrintRegister("input" + std::to_string(i), input[i]);
    108     }
    109     for (unsigned i = 0; i < 8; i++) {
    110 //        iBuilder->CallPrintRegister("output" + std::to_string(i), output[i]);
    11186    }
    11287}
     
    155130#endif
    156131
    157 
    158     S2P4StreamByPEXTKernel::S2P4StreamByPEXTKernel(const std::unique_ptr<kernel::KernelBuilder> & b)
    159             :BlockOrientedKernel("s2p4StreamByPEXT",
    160                                  {
    161                                          Binding{b->getStreamSetTy(1, 4), "byteStream", FixedRate(), Principal()}
    162                                  },
    163                                  {
    164                                          Binding{b->getStreamSetTy(4, 1), "basisBits"}
    165                                  }, {}, {}, {}) {
    166 
    167     }
    168 
    169     void S2P4StreamByPEXTKernel::generateDoBlockMethod(const std::unique_ptr<KernelBuilder> & b) {
    170         Function* PEXT_func = Intrinsic::getDeclaration(b->getModule(), Intrinsic::x86_bmi_pext_64);
    171         uint64_t pextBaseMask = 0x1111111111111111;
    172 
    173         Value* inputBasePtr = b->CreatePointerCast(b->getInputStreamBlockPtr("byteStream", b->getSize(0)), b->getInt64Ty()->getPointerTo());
    174 
    175         Value* outputBlocks[4];
    176         for (unsigned i = 0; i < 4; i++) {
    177             outputBlocks[i] = ConstantVector::getNullValue(b->getBitBlockType());
    178         }
    179 
    180         for (unsigned i = 0; i < b->getBitBlockWidth() / 64; i++) {
    181             Value* currentOutput[4];
    182             for (unsigned iIndex = 0; iIndex < 4; iIndex++) {
    183                 currentOutput[iIndex] = b->getInt64(0);
    184             }
    185 
    186             for (unsigned j = 0; j < 4; j++) {
    187                 unsigned inputIndex = i * 4 + j;
    188 
    189                 Value* currentInput = b->CreateLoad(b->CreateGEP(inputBasePtr, b->getInt32(inputIndex)));
    190                 for (unsigned k = 0; k < 4; k++) {
    191 
    192                     Value* newBits = b->CreateCall(
    193                             PEXT_func,{
    194                                     currentInput,
    195                                     b->getInt64(pextBaseMask << k)
    196                             }
    197                     );
    198 
    199                     currentOutput[k] = b->CreateOr(currentOutput[k], b->CreateShl(newBits, 16 * j));
    200                 }
    201             }
    202 
    203             for (unsigned iIndex = 0; iIndex < 4; iIndex++) {
    204                 outputBlocks[iIndex] = b->CreateInsertElement(outputBlocks[iIndex], currentOutput[iIndex], i);
    205             }
    206         }
    207 
    208         for (unsigned i = 0; i < 4; i++) {
    209             b->storeOutputStreamBlock("basisBits", b->getInt32(i), outputBlocks[i]);
    210 //            b->CallPrintRegister("outputBlocks" + std::to_string(i), outputBlocks[i]);
    211         }
    212     }
    213 
    214132void S2PKernel::generateMultiBlockLogic(const std::unique_ptr<KernelBuilder> & kb, Value * const numOfBlocks) {
    215133    BasicBlock * entry = kb->GetInsertBlock();
     
    345263}
    346264
    347 }
     265
     266}
Note: See TracChangeset for help on using the changeset viewer.