source: icGREP/icgrep-devel/icgrep/kernels/lz4/aio/lz4_parallel_bytestream_aio.h @ 6111

Last change on this file since 6111 was 6111, checked in by xwa163, 11 months ago
  1. Cleanup LZ4 AIO related kernels
  2. Improve LZ4ParallelByteStreamAIOKernel
  3. Implement simd_cttz
File size: 9.4 KB
Line 
1
2#ifndef ICGREP_LZ4_PARALLEL_BYTESTREAM_AIO_H
3#define ICGREP_LZ4_PARALLEL_BYTESTREAM_AIO_H
4
5#include "kernels/kernel.h"
6#include <string>
7#include <map>
8#include <vector>
9#include <llvm/IR/DerivedTypes.h>
10
11namespace llvm {
12    class Module;
13    class Function;
14    class BasicBlock;
15    class Value;
16}
17
18namespace IDISA { class IDISA_Builder; }
19
20
21namespace kernel {
22
23    class LZ4ParallelByteStreamAioKernel : public SegmentOrientedKernel {
24
25    public:
26        // By default, output block size in LZ4 is 4MB
27        LZ4ParallelByteStreamAioKernel(const std::unique_ptr<kernel::KernelBuilder> &b, unsigned lz4BlockSize, bool enableGather = true, bool enableScatter = true, int minParallelLevel = 1);
28
29    protected:
30        void generateDoSegmentMethod(const std::unique_ptr<KernelBuilder> &b) override;
31
32    private:
33
34
35        // ---- SIMD
36        void generateSimdDecompression(const std::unique_ptr<KernelBuilder> &iBuilder, llvm::Value* blockDataIndex);
37        void generateSimdDecompression1(const std::unique_ptr<KernelBuilder> &iBuilder, llvm::Value* blockDataIndex);
38        void generateSimdDecompression2(const std::unique_ptr<KernelBuilder> &iBuilder, llvm::Value* blockDataIndex);
39        std::pair<llvm::Value*, llvm::Value*> simdProcessBlockBoundary(const std::unique_ptr<KernelBuilder> &b,
40                                                                       llvm::Value *tokenPosVec, llvm::Value *lz4BlockEnd, llvm::Value* outputPosVec);
41        std::pair<llvm::Value*, llvm::Value*> simdProcessBlockBoundaryByLoop(const std::unique_ptr<KernelBuilder> &b,
42                                                                       llvm::Value *tokenPosVec, llvm::Value *lz4BlockEnd, llvm::Value* outputPosVec);
43        llvm::Value* generateSimdAcceleration(const std::unique_ptr<KernelBuilder> &b, llvm::Value *beginTokenPosVec,
44                                              llvm::Value *blockEndVec); // TODO incomplete
45        // Literal
46        std::pair<llvm::Value*, llvm::Value*> parallelParseLiteralInfo(const std::unique_ptr<KernelBuilder> &b, llvm::Value *tokenPosVec, llvm::Value* tokenValuesVec, llvm::Value* notFinishMask);
47        std::pair<llvm::Value*, llvm::Value*> simdParseLiteralInfo(const std::unique_ptr<KernelBuilder> &b, llvm::Value *tokenPosVec, llvm::Value* tokenValuesVec, llvm::Value* notFinishMask);
48        std::pair<llvm::Value*, llvm::Value*> simdParseLiteralInfo2(const std::unique_ptr<KernelBuilder> &b, llvm::Value *tokenPosVec, llvm::Value* tokenValuesVec, llvm::Value* notFinishMask);
49        std::pair<llvm::Value*, llvm::Value*> parseMultipleLiteralInfoByLoop(const std::unique_ptr<KernelBuilder> &b, llvm::Value *tokenPosVec, llvm::Value* tokenValuesVec, llvm::Value* notFinishMask);
50
51        // Match
52        std::pair<llvm::Value*, llvm::Value*> parallelParseMatchInfo(const std::unique_ptr<KernelBuilder> &b, llvm::Value *matchOffsetPosVec, llvm::Value* tokenValuesVec, llvm::Value* notFinishMask);
53        std::pair<llvm::Value*, llvm::Value*> simdParseMatchInfo(const std::unique_ptr<KernelBuilder> &b, llvm::Value *matchOffsetPosVec, llvm::Value* tokenValuesVec, llvm::Value* notFinishMask);
54        std::pair<llvm::Value*, llvm::Value*> simdParseMatchInfo2(const std::unique_ptr<KernelBuilder> &b, llvm::Value *matchOffsetPosVec, llvm::Value* tokenValuesVec, llvm::Value* notFinishMask);
55        std::pair<llvm::Value*, llvm::Value*> parseMultipleMatchInfoByLoop(const std::unique_ptr<KernelBuilder> &b, llvm::Value *matchOffsetPosVec, llvm::Value* tokenValuesVec, llvm::Value* notFinishMask);
56
57
58        // Copy
59        void handleSimdLiteralCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value* literalStartVec, llvm::Value* literalLengthVec, llvm::Value* outputPosVec);
60        void generateSimdSequentialLiteralCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value *literalStartVec,
61                                               llvm::Value *literalLengthVec, llvm::Value *outputPosVec);
62        void generateSimdLiteralCopyByScatter(const std::unique_ptr<KernelBuilder> &b, llvm::Value *literalStartVec,
63                                              llvm::Value *literalLengthVec, llvm::Value *outputPosVec);
64        void handleSimdMatchCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value* matchOffsetVec, llvm::Value* matchLengthVec, llvm::Value* outputPosVec);
65        void generateSimdSequentialMatchCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value* matchOffsetVec, llvm::Value* matchLengthVec, llvm::Value* outputPosVec);
66        void generateSimdMatchCopyByScatter(const std::unique_ptr<KernelBuilder> &b, llvm::Value* matchOffsetVec, llvm::Value* matchLengthVec, llvm::Value* outputPosVec);
67
68
69        // ---- Sequential
70        void generateSequentialDecompression(const std::unique_ptr<KernelBuilder> &b, llvm::Value* startBlockDataIndex, llvm::Value* endBlockDataIndex);
71        llvm::Value* generateProcessCompressedBlock(const std::unique_ptr<KernelBuilder> &b, llvm::Value *lz4BlockStart,
72                                                    llvm::Value *lz4BlockEnd, llvm::Value* initOutputPos);
73        std::pair<llvm::Value*, llvm::Value*> processBlockBoundary(const std::unique_ptr<KernelBuilder> &b,
74                                                                   llvm::Value *beginTokenPos, llvm::Value *lz4BlockEnd, llvm::Value* outputPos);
75        std::pair<llvm::Value *, llvm::Value *> parseLiteralInfo(const std::unique_ptr<KernelBuilder> &b, llvm::Value *tokenPos, llvm::Value* tokenValue);
76        std::pair<llvm::Value *, llvm::Value *> parseMatchInfo(const std::unique_ptr<KernelBuilder> &b, llvm::Value *matchOffsetPos, llvm::Value* tokenValue);
77
78        // Copy
79        void handleLiteralCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value* literalStart, llvm::Value* literalLength, llvm::Value* outputPos);
80        void handleMatchCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value* matchOffset, llvm::Value* matchLength, llvm::Value* outputPos);
81
82
83        // ---- Basic Method
84        // -- SIMD
85        // Load
86        llvm::Value *
87        generateLoadSimdInt64NumberInput(const std::unique_ptr<KernelBuilder> &iBuilder, std::string inputBufferName,
88                                         llvm::Value *globalOffset);
89        llvm::Value* simdFetchData(const std::unique_ptr<KernelBuilder> &b, llvm::Value* basePtr, llvm::Value* offsetVec, llvm::Value* mask);
90        llvm::Value* simdFetchByteData(const std::unique_ptr<KernelBuilder> &b, llvm::Value* basePtr, llvm::Value* offsetVec, llvm::Value* mask);
91        llvm::Value* simdFetchI64DataByGather(const std::unique_ptr<KernelBuilder> &b, llvm::Value *basePtr,
92                                              llvm::Value *offsetVec, llvm::Value *mask);
93        llvm::Value* simdFetchI32DataByGather(const std::unique_ptr<KernelBuilder> &b, llvm::Value *basePtr,
94                                              llvm::Value *offsetVec, llvm::Value *mask);
95        llvm::Value* simdFetchDataByLoop(const std::unique_ptr<KernelBuilder> &b, llvm::Value *basePtr,
96                                         llvm::Value *offsetVec, llvm::Value *mask, unsigned resultBitWidth = 64);
97        // Store
98        void simdPutData(const std::unique_ptr<KernelBuilder> &b, llvm::Value* basePtr, llvm::Value* offsetVec,llvm::Value* values, llvm::Value* mask /*i256*/);
99        void simdPutDataByLoop(const std::unique_ptr<KernelBuilder> &b, llvm::Value* basePtr, llvm::Value* offsetVec,llvm::Value* values, llvm::Value* mask /*i256*/);
100        void simdPutDataByScatter(const std::unique_ptr<KernelBuilder> &b, llvm::Value* basePtr, llvm::Value* offsetVec,llvm::Value* values, llvm::Value* mask /*i256*/);
101
102        // Memcpy
103
104
105        // -- Sequential
106        // Load
107        llvm::Value *
108        generateLoadInt64NumberInput(const std::unique_ptr<KernelBuilder> &iBuilder, std::string inputBufferName,
109                                     llvm::Value *globalOffset);
110        // Memcpy
111        void generateOverwritingMemcpy(const std::unique_ptr<KernelBuilder> &b, llvm::Value *inputBasePtr,
112                                       llvm::Value *outputBasePtr, llvm::Value *copyBytes, llvm::PointerType *targetPtrTy,
113                                       size_t stepSize);
114        void generateOverwritingMemcpy(const std::unique_ptr<KernelBuilder> &b, llvm::Value *inputBasePtr,
115                                       llvm::Value *outputBasePtr, llvm::Value *copyBytes, llvm::PointerType *targetPtrTy,
116                                       llvm::Value* stepSize);
117
118
119        // ---- Data Member
120        size_t mMininumParallelLevel;
121        bool mEnableGather;
122        bool mEnableScatter;
123        unsigned mLz4BlockSize;
124
125
126        // ---- Parallel Level Measurement
127        void initParallelLevelMeasurement(const std::unique_ptr<KernelBuilder> &b);
128        void recordParallelLevel(const std::unique_ptr<KernelBuilder> &b, llvm::Value* v);
129        void printParallelLevelResult(const std::unique_ptr<KernelBuilder> &b);
130
131
132        // ---- Constants and Types
133        void initializeConstantsAndTypes(const std::unique_ptr<KernelBuilder> &b);
134
135        llvm::Value* BIT_BLOCK_0;
136        llvm::Value* BIT_BLOCK_1;
137        llvm::Value* BIT_BLOCK_F0;
138        llvm::Value* BIT_BLOCK_0F;
139        llvm::Value* BIT_BLOCK_FF;
140        llvm::Value* BIT_BLOCK_FFFF;
141        llvm::Constant* INT_BIT_BLOCK_TY_0;
142
143        llvm::Constant* SIZE_0;
144        llvm::Constant* SIZE_1;
145        llvm::Constant* BYTE_FF;
146        llvm::Constant* BYTE_F0;
147        llvm::Constant* BYTE_0F;
148
149        llvm::Type* INT_BIT_BLOCK_TY;
150        llvm::Type* BIT_BLOCK_TY;
151    };
152
153}
154
155
156#endif //ICGREP_LZ4_PARALLEL_BYTESTREAM_AIO_H
Note: See TracBrowser for help on using the repository browser.