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

Last change on this file since 6132 was 6132, checked in by xwa163, 9 months ago
  1. More experiment on lz4 grep
  2. Improve performance of lzparabix grep
File size: 6.0 KB
RevLine 
[6111]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;
[6132]30    const unsigned mBlockSize;
[6111]31
32    // ---- Kernel Methods
33    void generateDoSegmentMethod(const std::unique_ptr<KernelBuilder> &b) override;
34
35    // ---- LZ4 Format Parsing
36    virtual void processCompressedLz4Block(const std::unique_ptr<KernelBuilder> &b, llvm::Value *lz4BlockStart,
37                                   llvm::Value *lz4BlockEnd);
38
[6132]39    std::pair<std::pair<llvm::Value *, llvm::Value *>, llvm::Value *> doAcceleration(
40            const std::unique_ptr<KernelBuilder> &b,
41            llvm::Value *beginTokenPos,
42            llvm::Value *blockStart,
43            llvm::Value *blockEnd);
[6111]44
45
[6132]46    virtual llvm::Value *processLz4Sequence(
47            const std::unique_ptr<KernelBuilder> &b,
48            llvm::Value *beginTokenPos,
49            llvm::Value *lz4BlockStart,
50            llvm::Value *lz4BlockEnd
51    );
[6111]52
53    std::pair<llvm::Value*, llvm::Value*> parseMatchInfo(const std::unique_ptr<KernelBuilder> &b, llvm::Value* matchOffsetBeginPos, llvm::Value* tokenValue);
54    std::pair<llvm::Value*, llvm::Value*> parseMatchInfo2(const std::unique_ptr<KernelBuilder> &b, llvm::Value* matchOffsetBeginPos, llvm::Value* tokenValue);
55
56    std::pair<llvm::Value *, llvm::Value *> noExtensionLiteralLength(const std::unique_ptr<KernelBuilder> &b,
57                                                                            llvm::Value *currentTokenMarker,
58                                                                            llvm::Value *currentExtenderValue,
59                                                                            llvm::Value *tokenValue,
60                                                                            llvm::Value *blockPosBase,
61                                                                            llvm::Value *currentTokenLocalPos
62    );
63
64    std::pair<llvm::Value *, llvm::Value *> scanThruLiteralLength(const std::unique_ptr<KernelBuilder> &b,
65                                                                         llvm::Value *currentTokenMarker,
66                                                                         llvm::Value *currentExtenderValue,
67                                                                         llvm::Value *tokenValue,
68                                                                         llvm::Value *blockPosBase,
69                                                                         llvm::Value *currentTokenLocalPos
70    );
71
72    std::pair<llvm::Value *, llvm::Value *> noExtensionMatchLength(const std::unique_ptr<KernelBuilder> &b,
73                                                                          llvm::Value *matchOffsetEndMarker,
74                                                                          llvm::Value *currentExtenderValue,
75                                                                          llvm::Value *tokenValue,
76                                                                          llvm::Value *blockPosBase
77    );
78
79    std::pair<llvm::Value *, llvm::Value *> scanThruMatchLength(const std::unique_ptr<KernelBuilder> &b,
80                                                                       llvm::Value *matchOffsetEndMarker,
81                                                                       llvm::Value *currentExtenderValue,
82                                                                       llvm::Value *tokenValue,
83                                                                       llvm::Value *blockPosBase
84    );
85
86    // ---- Basic Function
87    llvm::Value *
88    generateLoadInt64NumberInput(const std::unique_ptr<KernelBuilder> &iBuilder, std::string inputBufferName,
89                                 llvm::Value *globalOffset);
90    llvm::Value *
91    scanThru(const std::unique_ptr<KernelBuilder> &iBuilder, llvm::Value *from, llvm::Value *thru);
92
93    // ---- Methods To Be Override
94
[6132]95    virtual void initializationMethod(const std::unique_ptr<KernelBuilder> &b){};
96    virtual void prepareProcessBlock(const std::unique_ptr<KernelBuilder> &b, llvm::Value* blockStart, llvm::Value* blockEnd){};
97    virtual void beforeTermination(const std::unique_ptr<KernelBuilder> &b){};
[6111]98
[6132]99
[6111]100    virtual void doLiteralCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value *literalStart,
[6132]101                               llvm::Value *literalLength, llvm::Value* blockStart) = 0;
[6111]102
103    virtual void doMatchCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value *matchOffset,
104                             llvm::Value *matchLength) = 0;
105
[6118]106    virtual void storePendingOutput(const std::unique_ptr<KernelBuilder> &b) {};
107
[6111]108    // Acceleration
109    virtual void prepareAcceleration(const std::unique_ptr<KernelBuilder> &b, llvm::Value* beginTokenPos) {};
110    virtual void doAccelerationLiteralCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value *literalStart,
[6132]111                                           llvm::Value *literalLength, llvm::Value* blockStart) {this->doLiteralCopy(b, literalStart, literalLength, blockStart);}
[6111]112    virtual void doAccelerationMatchCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value *matchOffset,
113                                         llvm::Value *matchLength) {this->doMatchCopy(b, matchOffset, matchLength);}
114    virtual void finishAcceleration(const std::unique_ptr<KernelBuilder> &b, llvm::Value* beginTokenPos, llvm::Value* literalMask) {};
115
116    virtual void setProducedOutputItemCount(const std::unique_ptr<KernelBuilder> &b, llvm::Value* produced) = 0;
117};
118}
119
120
121
122#endif //ICGREP_LZ4_AIO_BASE_H
Note: See TracBrowser for help on using the repository browser.