Changeset 6074


Ignore:
Timestamp:
Jun 8, 2018, 2:27:42 PM (12 days ago)
Author:
xwa163
Message:

Bugs fix in LZ4ParallelByteStreamAIO for AVX512

File:
1 edited

Legend:

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

    r6070 r6074  
    77#include <llvm/Support/raw_ostream.h>
    88#include <kernels/streamset.h>
     9#include <IR_Gen/idisa_target.h>
    910
    1011using namespace llvm;
    1112using namespace kernel;
    1213using namespace std;
     14
    1315
    1416#define SIMD_WIDTH (64)
     
    2426
    2527                    // block data
    26                     Binding{b->getStreamSetTy(1, 1), "isCompressed", BoundedRate(0, 1), AlwaysConsume()},
     28                    Binding{b->getStreamSetTy(1, 8), "isCompressed", BoundedRate(0, 1), AlwaysConsume()},
    2729                    Binding{b->getStreamSetTy(1, 64), "blockStart", RateEqualTo("isCompressed"), AlwaysConsume()},
    2830                    Binding{b->getStreamSetTy(1, 64), "blockEnd", RateEqualTo("isCompressed"), AlwaysConsume()}
     
    291293
    292294
     295
    293296        Value* matchOffsetVec =  b->CreateCall(
    294297                gatherFunc,
     
    296299                        UndefValue::get(b->getBitBlockType()),
    297300                        bytePtrBase,
    298                         b->CreateTrunc(b->CreateSub(matchOffsetBeginPosVec, b->simd_fill(SIMD_WIDTH, firstTokenPos)), VectorType::get(b->getInt32Ty(), 4)),
     301                        b->CreateTrunc(b->CreateSub(matchOffsetBeginPosVec, b->simd_fill(SIMD_WIDTH, firstTokenPos)), VectorType::get(b->getInt32Ty(), b->getBitBlockWidth() / SIMD_WIDTH)),
    299302                        hasMatchPartMask,
    300303                        b->getInt8(1)
     
    344347        Value* outputPos = b->getProducedItemCount("outputStream");
    345348        Value* initOutputPosVec = b->simd_fill(SIMD_WIDTH, outputPos);
    346         initOutputPosVec = b->CreateAdd(
    347                 initOutputPosVec,
    348                 ConstantVector::get({
    349                                             b->getIntN(SIMD_WIDTH, 0),
    350                                             b->getIntN(SIMD_WIDTH, 1 * 4 * 1024 * 1024),
    351                                             b->getIntN(SIMD_WIDTH, 2 * 4 * 1024 * 1024),
    352                                             b->getIntN(SIMD_WIDTH, 3 * 4 * 1024 * 1024)
    353                                     }));
     349        std::vector<Constant*> initOutputPos;
     350        for (unsigned i = 0; i < b->getBitBlockWidth() / SIMD_WIDTH; i++) {
     351            initOutputPos.push_back(b->getIntN(SIMD_WIDTH, i * 4 * 1024 * 1024));
     352        }
     353
     354        initOutputPosVec = b->CreateAdd(initOutputPosVec, ConstantVector::get(initOutputPos));
    354355
    355356        // TODO handle uncompression blocks
     
    11271128
    11281129    llvm::Value* LZ4ParallelByteStreamAioKernel::simdFetchByteData(const std::unique_ptr<KernelBuilder> &b, llvm::Value* basePtr, llvm::Value* offsetVec, llvm::Value* mask) {
    1129         return this->simdFetchByteDataByGather(b, basePtr, offsetVec, mask);
    1130 //        return this->simdFetchByteDataByLoop(b, basePtr, offsetVec, mask);
     1130        if (AVX2_available()) {
     1131            return this->simdFetchByteDataByGather(b, basePtr, offsetVec, mask);
     1132        } else {
     1133            return this->simdFetchByteDataByLoop(b, basePtr, offsetVec, mask);
     1134        }
    11311135    }
    11321136
     
    11381142        Value* firstOffset = b->CreateExtractElement(offsetVec, (uint64_t)0);
    11391143
    1140         Type* i32BitBlockTy = VectorType::get(b->getInt32Ty(), 4);
     1144        Type* i32BitBlockTy = VectorType::get(b->getInt32Ty(), b->getBitBlockWidth() / SIMD_WIDTH);
    11411145
    11421146//        Value* tokenValuesVec =  b->CreateCall(
     
    11571161                        UndefValue::get(i32BitBlockTy),
    11581162                        b->CreateGEP(basePtr, firstOffset),
    1159                         b->CreateTrunc(b->CreateSub(offsetVec, b->simd_fill(SIMD_WIDTH, firstOffset)), VectorType::get(b->getInt32Ty(), 4)),
     1163                        b->CreateTrunc(b->CreateSub(offsetVec, b->simd_fill(SIMD_WIDTH, firstOffset)), i32BitBlockTy),
    11601164                        b->CreateTrunc(mask, i32BitBlockTy),
    11611165                        b->getInt8(1)
     
    11731177        Value* retVec = ConstantVector::getNullValue(b->getBitBlockType());
    11741178
    1175         for (uint64_t i = 0; i < 4; i++){ //TODO 4 here is a hardcode for AVX2, it may need to be changed to (BitBlockWidth / 64)
     1179        for (uint64_t i = 0; i < b->getBitBlockWidth() / SIMD_WIDTH; i++){
    11761180            Value* mask = b->CreateExtractElement(maskVec, i);
    11771181            Value* shouldLoad = b->CreateICmpNE(mask, b->getInt64(0));
Note: See TracChangeset for help on using the changeset viewer.