Changeset 6077


Ignore:
Timestamp:
Jun 10, 2018, 2:16:01 AM (4 months ago)
Author:
xwa163
Message:

Some bug fixing for LZ4 related kernels in AVX512 machine

Location:
icGREP/icgrep-devel/icgrep
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/IR_Gen/idisa_target.h

    r5755 r6077  
    1111
    1212extern bool AVX2_available();
     13extern bool AVX512BW_available();
    1314
    1415namespace IDISA {
  • icGREP/icgrep-devel/icgrep/kernels/lz4/lz4_block_decoder.cpp

    r6026 r6077  
    3939Binding{iBuilder->getInt1Ty(), "reachFinalBlock"},
    4040
    41 Binding{iBuilder->getInt1Ty(), "pendingIsCompressed"},
     41Binding{iBuilder->getInt8Ty(), "pendingIsCompressed"},
    4242Binding{iBuilder->getInt64Ty(), "pendingBlockStart"},
    4343Binding{iBuilder->getInt64Ty(), "pendingBlockEnd"},
     
    9494    appendOutput(iBuilder, phiIsCompressed, phiBlockStart, phiBlockEnd);
    9595
    96     phiIsCompressed->addIncoming(iBuilder->getFalse(), storeOutputBlock);
     96
     97    phiIsCompressed->addIncoming(iBuilder->getInt8(0), storeOutputBlock);
    9798    phiBlockStart->addIncoming(INT64_0, storeOutputBlock);
    9899    phiBlockEnd->addIncoming(INT64_0, storeOutputBlock);
  • icGREP/icgrep-devel/icgrep/kernels/lz4/lz4_parallel_bytestream_aio.cpp

    r6074 r6077  
    114114            const std::unique_ptr<KernelBuilder> &b, Value *beginTokenPosVec, Value *lz4BlockEndVec, Value* initOutputPosVec
    115115    ) {
    116         Function *gatherFunc = Intrinsic::getDeclaration(b->getModule(), Intrinsic::x86_avx2_gather_d_q_256); // Maybe it will be better to use <4 * i32> version
    117 
    118116        // Constant
    119117        Value* BIT_BLOCK_0 = ConstantVector::getNullValue(b->getBitBlockType());
     
    293291
    294292
    295 
    296         Value* matchOffsetVec =  b->CreateCall(
    297                 gatherFunc,
    298                 {
    299                         UndefValue::get(b->getBitBlockType()),
    300                         bytePtrBase,
    301                         b->CreateTrunc(b->CreateSub(matchOffsetBeginPosVec, b->simd_fill(SIMD_WIDTH, firstTokenPos)), VectorType::get(b->getInt32Ty(), b->getBitBlockWidth() / SIMD_WIDTH)),
    302                         hasMatchPartMask,
    303                         b->getInt8(1)
    304                 }
     293        Value* matchOffsetVec = this->simdFetchData(
     294                b,
     295                bytePtrBase,
     296                b->CreateSub(matchOffsetBeginPosVec, b->simd_fill(SIMD_WIDTH, firstTokenPos)),
     297                hasMatchPartMask
    305298        );
    306         matchOffsetVec = b->CreateAnd(matchOffsetVec, notFinishMask);
    307299        matchOffsetVec = b->CreateAnd(matchOffsetVec, BIT_BLOCK_FFFF);
    308 
    309 //        Value* matchOffsetVec = this->simdFetchByteData(b, byteRawInputPtr, matchOffsetBeginPosVec, b->CreateAnd(hasMatchPartMask, notFinishMask));
    310 
    311 
    312300
    313301        this->handleSimdMatchCopy(b, matchOffsetVec, matchLength, outputPosAfterLiteralCpy);
     
    368356
    369357        Value* hasRemaining = b->simd_ult(SIMD_WIDTH, phiCursorVec, blockEndVec);
    370         hasRemaining = b->CreateICmpNE(b->CreateBitCast(hasRemaining, b->getIntNTy(256)), Constant::getNullValue(b->getIntNTy(256)));
     358
     359        hasRemaining = b->CreateICmpNE(b->CreateBitCast(hasRemaining, b->getIntNTy(b->getBitBlockWidth())), Constant::getNullValue(b->getIntNTy(b->getBitBlockWidth())));
    371360
    372361        b->CreateCondBr(hasRemaining, processBody, exitBlock);
     
    11271116    }
    11281117
     1118    llvm::Value* LZ4ParallelByteStreamAioKernel::simdFetchData(const std::unique_ptr<KernelBuilder> &b, llvm::Value* basePtr, llvm::Value* offsetVec, llvm::Value* mask) {
     1119//        return this->simdFetchDataByLoop(b, basePtr, offsetVec, mask);
     1120        if (AVX2_available()) {
     1121            return this->simdFetchDataByGather(b, basePtr, offsetVec, mask);
     1122        } else {
     1123            return this->simdFetchDataByLoop(b, basePtr, offsetVec, mask);
     1124        }
     1125    }
    11291126    llvm::Value* LZ4ParallelByteStreamAioKernel::simdFetchByteData(const std::unique_ptr<KernelBuilder> &b, llvm::Value* basePtr, llvm::Value* offsetVec, llvm::Value* mask) {
    1130         if (AVX2_available()) {
    1131             return this->simdFetchByteDataByGather(b, basePtr, offsetVec, mask);
    1132         } else {
    1133             return this->simdFetchByteDataByLoop(b, basePtr, offsetVec, mask);
    1134         }
    1135     }
    1136 
    1137     llvm::Value* LZ4ParallelByteStreamAioKernel::simdFetchByteDataByGather(const std::unique_ptr<KernelBuilder> &b, llvm::Value* basePtr, llvm::Value* offsetVec, llvm::Value* mask) {
    1138         Value* BIT_BLOCK_FF = b->simd_fill(SIMD_WIDTH, b->getIntN(SIMD_WIDTH, 0xff));
    1139 //        Function *gatherFunc = Intrinsic::getDeclaration(b->getModule(), Intrinsic::x86_avx2_gather_d_q_256);
     1127        return b->CreateAnd(
     1128                this->simdFetchData(b, basePtr, offsetVec, mask),
     1129                b->simd_fill(SIMD_WIDTH, b->getIntN(SIMD_WIDTH, 0xff))
     1130        );
     1131    }
     1132
     1133    llvm::Value* LZ4ParallelByteStreamAioKernel::simdFetchDataByGather(const std::unique_ptr<KernelBuilder> &b,
     1134                                                                       llvm::Value *basePtr, llvm::Value *offsetVec,
     1135                                                                       llvm::Value *mask) {
     1136
     1137//        Function *gatherFnc = Intrinsic::getDeclaration(b->getModule(), Intrinsic::x86_avx2_gather_d_q_256);
    11401138        Function *gatherFunc2 = Intrinsic::getDeclaration(b->getModule(), Intrinsic::x86_avx2_gather_d_d);
     1139        Function *gatherFunc3 = Intrinsic::getDeclaration(b->getModule(), Intrinsic::x86_avx2_gather_d_d_256);
     1140
     1141//        gatherFunc2->dump();
     1142//        gatherFunc3->dump();
     1143//        Function *gatherFunc4 = Intrinsic::getDeclaration(b->getModule(), Intrinsic::x86_avx512_gather_qpi_512);
     1144
     1145        Function *gatherFunc = AVX512BW_available() ? gatherFunc3 : gatherFunc2;
    11411146
    11421147        Value* firstOffset = b->CreateExtractElement(offsetVec, (uint64_t)0);
     
    11571162        ////
    11581163        Value* tokenValuesVec =  b->CreateCall(
    1159                 gatherFunc2,
     1164                gatherFunc,
    11601165                {
    11611166                        UndefValue::get(i32BitBlockTy),
     
    11671172        );
    11681173        tokenValuesVec = b->CreateZExt(tokenValuesVec, b->getBitBlockType());
    1169         /////
    1170        
    11711174        tokenValuesVec = b->CreateAnd(tokenValuesVec, mask);
    1172         tokenValuesVec = b->CreateAnd(tokenValuesVec, BIT_BLOCK_FF);
     1175
    11731176        return tokenValuesVec;
    11741177    }
    11751178
    1176     llvm::Value* LZ4ParallelByteStreamAioKernel::simdFetchByteDataByLoop(const std::unique_ptr<KernelBuilder> &b, llvm::Value* basePtr, llvm::Value* offsetVec, llvm::Value* maskVec) {
     1179    llvm::Value* LZ4ParallelByteStreamAioKernel::simdFetchDataByLoop(const std::unique_ptr<KernelBuilder> &b,
     1180                                                                     llvm::Value *basePtr, llvm::Value *offsetVec,
     1181                                                                     llvm::Value *maskVec) {
    11771182        Value* retVec = ConstantVector::getNullValue(b->getBitBlockType());
    11781183
     
    11811186            Value* shouldLoad = b->CreateICmpNE(mask, b->getInt64(0));
    11821187            Value* loadPtr = b->CreateSelect(shouldLoad, b->CreateGEP(basePtr, b->CreateExtractElement(offsetVec, i)), basePtr);
    1183             Value* loadValue = b->CreateZExt(b->CreateLoad(loadPtr), b->getInt64Ty());
    1184 
     1188            Value* loadValue = b->CreateZExt(b->CreateLoad(b->CreatePointerCast(loadPtr, b->getInt64Ty()->getPointerTo())), b->getInt64Ty());
    11851189            Value* finalValue = b->CreateSelect(shouldLoad, loadValue, b->getInt64(0));
    11861190            retVec = b->CreateInsertElement(retVec, finalValue, i);
  • icGREP/icgrep-devel/icgrep/kernels/lz4/lz4_parallel_bytestream_aio.h

    r6070 r6077  
    8585
    8686
     87        llvm::Value* simdFetchData(const std::unique_ptr<KernelBuilder> &b, llvm::Value* basePtr, llvm::Value* offsetVec, llvm::Value* mask);
    8788        llvm::Value* simdFetchByteData(const std::unique_ptr<KernelBuilder> &b, llvm::Value* basePtr, llvm::Value* offsetVec, llvm::Value* mask);
    88         llvm::Value* simdFetchByteDataByGather(const std::unique_ptr<KernelBuilder> &b, llvm::Value* basePtr, llvm::Value* offsetVec, llvm::Value* mask);
    89         llvm::Value* simdFetchByteDataByLoop(const std::unique_ptr<KernelBuilder> &b, llvm::Value* basePtr, llvm::Value* offsetVec, llvm::Value* mask);
     89        llvm::Value* simdFetchDataByGather(const std::unique_ptr<KernelBuilder> &b, llvm::Value *basePtr,
     90                                           llvm::Value *offsetVec, llvm::Value *mask);
     91        llvm::Value* simdFetchDataByLoop(const std::unique_ptr<KernelBuilder> &b, llvm::Value *basePtr,
     92                                         llvm::Value *offsetVec, llvm::Value *mask);
    9093
    9194        size_t mOutputBlockSize;
Note: See TracChangeset for help on using the changeset viewer.