source: icGREP/icgrep-devel/icgrep/kernels/lz4/aio/lz4_sequential_aio_base.h @ 6135

Last change on this file since 6135 was 6135, checked in by xwa163, 6 months ago
  1. Implement twist_kernel and untwist_kernel by PEXT and PDEP
  2. Use twist form for multiplexing lz4 grep
File size: 6.1 KB
Line 
1//
2// Created by wxy325 on 2018/6/22.
3//
4
5#ifndef ICGREP_LZ4_AIO_BASE_H
6#define ICGREP_LZ4_AIO_BASE_H
7
8#include "kernels/kernel.h"
9#include <string>
10#include <map>
11#include <vector>
12
13namespace llvm {
14    class Module;
15    class Function;
16    class BasicBlock;
17    class Value;
18}
19
20namespace IDISA { class IDISA_Builder; }
21
22namespace kernel{
23
24class LZ4SequentialAioBaseKernel : public SegmentOrientedKernel {
25public:
26    LZ4SequentialAioBaseKernel(const std::unique_ptr<kernel::KernelBuilder> &b, std::string&& kernelName, unsigned blockSize = 4 * 1024 * 1024);
27protected:
28    // ---- Constant
29    const static unsigned int ACCELERATION_WIDTH = 64;
30    const unsigned mBlockSize;
31    const unsigned COPY_FW = 64;
32    const unsigned BYTE_WIDTH = 8;
33
34    // ---- Kernel Methods
35    void generateDoSegmentMethod(const std::unique_ptr<KernelBuilder> &b) override;
36
37    // ---- LZ4 Format Parsing
38    virtual void processCompressedLz4Block(const std::unique_ptr<KernelBuilder> &b, llvm::Value *lz4BlockStart,
39                                   llvm::Value *lz4BlockEnd);
40
41    std::pair<std::pair<llvm::Value *, llvm::Value *>, llvm::Value *> doAcceleration(
42            const std::unique_ptr<KernelBuilder> &b,
43            llvm::Value *beginTokenPos,
44            llvm::Value *blockStart,
45            llvm::Value *blockEnd);
46
47
48    virtual llvm::Value *processLz4Sequence(
49            const std::unique_ptr<KernelBuilder> &b,
50            llvm::Value *beginTokenPos,
51            llvm::Value *lz4BlockStart,
52            llvm::Value *lz4BlockEnd
53    );
54
55    std::pair<llvm::Value*, llvm::Value*> parseMatchInfo(const std::unique_ptr<KernelBuilder> &b, llvm::Value* matchOffsetBeginPos, llvm::Value* tokenValue);
56    std::pair<llvm::Value*, llvm::Value*> parseMatchInfo2(const std::unique_ptr<KernelBuilder> &b, llvm::Value* matchOffsetBeginPos, llvm::Value* tokenValue);
57
58    std::pair<llvm::Value *, llvm::Value *> noExtensionLiteralLength(const std::unique_ptr<KernelBuilder> &b,
59                                                                            llvm::Value *currentTokenMarker,
60                                                                            llvm::Value *currentExtenderValue,
61                                                                            llvm::Value *tokenValue,
62                                                                            llvm::Value *blockPosBase,
63                                                                            llvm::Value *currentTokenLocalPos
64    );
65
66    std::pair<llvm::Value *, llvm::Value *> scanThruLiteralLength(const std::unique_ptr<KernelBuilder> &b,
67                                                                         llvm::Value *currentTokenMarker,
68                                                                         llvm::Value *currentExtenderValue,
69                                                                         llvm::Value *tokenValue,
70                                                                         llvm::Value *blockPosBase,
71                                                                         llvm::Value *currentTokenLocalPos
72    );
73
74    std::pair<llvm::Value *, llvm::Value *> noExtensionMatchLength(const std::unique_ptr<KernelBuilder> &b,
75                                                                          llvm::Value *matchOffsetEndMarker,
76                                                                          llvm::Value *currentExtenderValue,
77                                                                          llvm::Value *tokenValue,
78                                                                          llvm::Value *blockPosBase
79    );
80
81    std::pair<llvm::Value *, llvm::Value *> scanThruMatchLength(const std::unique_ptr<KernelBuilder> &b,
82                                                                       llvm::Value *matchOffsetEndMarker,
83                                                                       llvm::Value *currentExtenderValue,
84                                                                       llvm::Value *tokenValue,
85                                                                       llvm::Value *blockPosBase
86    );
87
88    // ---- Basic Function
89    llvm::Value *
90    generateLoadInt64NumberInput(const std::unique_ptr<KernelBuilder> &iBuilder, std::string inputBufferName,
91                                 llvm::Value *globalOffset);
92    llvm::Value *
93    scanThru(const std::unique_ptr<KernelBuilder> &iBuilder, llvm::Value *from, llvm::Value *thru);
94
95    // ---- Methods To Be Override
96
97    virtual void initializationMethod(const std::unique_ptr<KernelBuilder> &b){};
98    virtual void prepareProcessBlock(const std::unique_ptr<KernelBuilder> &b, llvm::Value* blockStart, llvm::Value* blockEnd){};
99    virtual void beforeTermination(const std::unique_ptr<KernelBuilder> &b){};
100
101
102    virtual void doLiteralCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value *literalStart,
103                               llvm::Value *literalLength, llvm::Value* blockStart) = 0;
104
105    virtual void doMatchCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value *matchOffset,
106                             llvm::Value *matchLength) = 0;
107
108    virtual void storePendingOutput(const std::unique_ptr<KernelBuilder> &b) {};
109
110    // Acceleration
111    virtual void prepareAcceleration(const std::unique_ptr<KernelBuilder> &b, llvm::Value* beginTokenPos) {};
112    virtual void doAccelerationLiteralCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value *literalStart,
113                                           llvm::Value *literalLength, llvm::Value* blockStart) {this->doLiteralCopy(b, literalStart, literalLength, blockStart);}
114    virtual void doAccelerationMatchCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value *matchOffset,
115                                         llvm::Value *matchLength) {this->doMatchCopy(b, matchOffset, matchLength);}
116    virtual void finishAcceleration(const std::unique_ptr<KernelBuilder> &b, llvm::Value* beginTokenPos, llvm::Value* literalMask) {};
117
118    virtual void setProducedOutputItemCount(const std::unique_ptr<KernelBuilder> &b, llvm::Value* produced) = 0;
119};
120}
121
122
123
124#endif //ICGREP_LZ4_AIO_BASE_H
Note: See TracBrowser for help on using the repository browser.