source: icGREP/icgrep-devel/icgrep/kernels/lz4/lz4_swizzled_aio.h @ 6059

Last change on this file since 6059 was 6059, checked in by xwa163, 11 months ago
  1. Enable swizzled match copy in multiplexing lz4_grep for some special case
  2. Implement some lz4 AIO (all-in-one) pipeline and related kernel
File size: 4.5 KB
Line 
1
2#ifndef ICGREP_LZ4_SWIZZLED_AIO_H
3#define ICGREP_LZ4_SWIZZLED_AIO_H
4
5#include "kernels/kernel.h"
6#include <string>
7#include <map>
8#include <vector>
9
10namespace llvm {
11    class Module;
12    class Function;
13    class BasicBlock;
14    class Value;
15}
16
17namespace IDISA { class IDISA_Builder; }
18
19namespace kernel {
20    class LZ4SwizzledAioKernel : public SegmentOrientedKernel {
21
22    public:
23        LZ4SwizzledAioKernel(const std::unique_ptr<kernel::KernelBuilder> &b, unsigned streamCount, unsigned streamSize, unsigned swizzleFactor);
24
25    protected:
26        void generateDoSegmentMethod(const std::unique_ptr<KernelBuilder> &b) override;
27
28    private:
29        unsigned mStreamCount;
30        unsigned mStreamSize;
31        unsigned mSwizzleFactor;
32        unsigned mPDEPWidth;
33
34        const static unsigned int ACCELERATION_WIDTH = 64; // TODO for now, we only consider 64 or 32 since cttz only have i64 or i32 version
35
36        llvm::Value *
37        generateLoadInt64NumberInput(const std::unique_ptr<KernelBuilder> &iBuilder, std::string inputBufferName,
38                                     llvm::Value *globalOffset);
39
40        void generateProcessCompressedBlock(const std::unique_ptr<KernelBuilder> &b, llvm::Value *lz4BlockStart,
41                                            llvm::Value *lz4BlockEnd);
42
43        std::pair<std::pair<llvm::Value *, llvm::Value *>, llvm::Value *>
44        generateAcceleration(const std::unique_ptr<KernelBuilder> &b, llvm::Value *beginTokenPos,
45                             llvm::Value *blockEnd);
46
47        llvm::Value *processBlockBoundary(const std::unique_ptr<KernelBuilder> &b,
48                                          llvm::Value *beginTokenPos, llvm::Value *lz4BlockEnd);
49
50
51
52
53        inline std::pair<llvm::Value *, llvm::Value *> scanThruLiteralLength(const std::unique_ptr<KernelBuilder> &b,
54                                                                             llvm::Value *currentTokenMarker,
55                                                                             llvm::Value *currentExtenderValue,
56                                                                             llvm::Value *tokenValue,
57                                                                             llvm::Value *blockPosBase,
58                                                                             llvm::Value *currentTokenLocalPos
59        );
60
61        inline std::pair<llvm::Value *, llvm::Value *> scanThruMatchLength(const std::unique_ptr<KernelBuilder> &b,
62                                                                           llvm::Value *matchOffsetEndMarker,
63                                                                           llvm::Value *currentExtenderValue,
64                                                                           llvm::Value *tokenValue,
65                                                                           llvm::Value *blockPosBase
66        );
67        inline llvm::Value *
68        scanThru(const std::unique_ptr<KernelBuilder> &iBuilder, llvm::Value *from, llvm::Value *thru);
69
70
71
72        void handleLiteralCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value* literalStart, llvm::Value* literalLength);
73        void handleAccelerationLiteralCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value *literalStart,
74                                                                 llvm::Value *literalLength, const std::vector<llvm::Value*>& inputLiteralValues);
75        void handleAccelerationPdepOutput(
76                const std::unique_ptr<KernelBuilder> &b,
77                llvm::Value *literalBlockIndex,
78                llvm::Value *literalMasks,
79                llvm::Value *literalLengthArray,
80                llvm::Value *matchOffsetArray,
81                llvm::Value *matchLengthArray,
82                llvm::Value *numOfElements
83        );
84
85        void handleAccelerationMatchCopyOutput(
86                const std::unique_ptr<KernelBuilder> &b,
87                llvm::Value *literalBlockIndex,
88                llvm::Value *literalMasks,
89                llvm::Value *literalLengthArray,
90                llvm::Value *matchOffsetArray,
91                llvm::Value *matchLengthArray,
92                llvm::Value *numOfElements
93        );
94
95        void handleMatchCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value* matchPos, llvm::Value* matchOffset, llvm::Value* matchLength, bool clearBuffer = true);
96        void handleMatchCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value* matchOffset, llvm::Value* matchLength);
97
98    };
99};
100
101
102#endif //ICGREP_LZ4_SWIZZLED_AIO_H
Note: See TracBrowser for help on using the repository browser.