source: icGREP/icgrep-devel/icgrep/kernels/lz4/aio/lz4_sequential_aio_base.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: 5.4 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
31    // ---- Kernel Methods
32    void generateDoSegmentMethod(const std::unique_ptr<KernelBuilder> &b) override;
33
34    // ---- LZ4 Format Parsing
35    virtual void processCompressedLz4Block(const std::unique_ptr<KernelBuilder> &b, llvm::Value *lz4BlockStart,
36                                   llvm::Value *lz4BlockEnd);
37
38    std::pair<std::pair<llvm::Value *, llvm::Value *>, llvm::Value *>
39    doAcceleration(const std::unique_ptr<KernelBuilder> &b, llvm::Value *beginTokenPos,
40                   llvm::Value *blockEnd);
41
42
43    virtual llvm::Value *processLz4Sequence(const std::unique_ptr<KernelBuilder> &b,
44                                    llvm::Value *beginTokenPos, llvm::Value *lz4BlockEnd);
45
46    std::pair<llvm::Value*, llvm::Value*> parseMatchInfo(const std::unique_ptr<KernelBuilder> &b, llvm::Value* matchOffsetBeginPos, llvm::Value* tokenValue);
47    std::pair<llvm::Value*, llvm::Value*> parseMatchInfo2(const std::unique_ptr<KernelBuilder> &b, llvm::Value* matchOffsetBeginPos, llvm::Value* tokenValue);
48
49    std::pair<llvm::Value *, llvm::Value *> noExtensionLiteralLength(const std::unique_ptr<KernelBuilder> &b,
50                                                                            llvm::Value *currentTokenMarker,
51                                                                            llvm::Value *currentExtenderValue,
52                                                                            llvm::Value *tokenValue,
53                                                                            llvm::Value *blockPosBase,
54                                                                            llvm::Value *currentTokenLocalPos
55    );
56
57    std::pair<llvm::Value *, llvm::Value *> scanThruLiteralLength(const std::unique_ptr<KernelBuilder> &b,
58                                                                         llvm::Value *currentTokenMarker,
59                                                                         llvm::Value *currentExtenderValue,
60                                                                         llvm::Value *tokenValue,
61                                                                         llvm::Value *blockPosBase,
62                                                                         llvm::Value *currentTokenLocalPos
63    );
64
65    std::pair<llvm::Value *, llvm::Value *> noExtensionMatchLength(const std::unique_ptr<KernelBuilder> &b,
66                                                                          llvm::Value *matchOffsetEndMarker,
67                                                                          llvm::Value *currentExtenderValue,
68                                                                          llvm::Value *tokenValue,
69                                                                          llvm::Value *blockPosBase
70    );
71
72    std::pair<llvm::Value *, llvm::Value *> scanThruMatchLength(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    // ---- Basic Function
80    llvm::Value *
81    generateLoadInt64NumberInput(const std::unique_ptr<KernelBuilder> &iBuilder, std::string inputBufferName,
82                                 llvm::Value *globalOffset);
83    llvm::Value *
84    scanThru(const std::unique_ptr<KernelBuilder> &iBuilder, llvm::Value *from, llvm::Value *thru);
85
86    // ---- Methods To Be Override
87
88
89    virtual void doLiteralCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value *literalStart,
90                               llvm::Value *literalLength) = 0;
91
92    virtual void doMatchCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value *matchOffset,
93                             llvm::Value *matchLength) = 0;
94
95    // Acceleration
96    virtual void prepareAcceleration(const std::unique_ptr<KernelBuilder> &b, llvm::Value* beginTokenPos) {};
97    virtual void doAccelerationLiteralCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value *literalStart,
98                                           llvm::Value *literalLength) {this->doLiteralCopy(b, literalStart, literalLength);}
99    virtual void doAccelerationMatchCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value *matchOffset,
100                                         llvm::Value *matchLength) {this->doMatchCopy(b, matchOffset, matchLength);}
101    virtual void finishAcceleration(const std::unique_ptr<KernelBuilder> &b, llvm::Value* beginTokenPos, llvm::Value* literalMask) {};
102
103    virtual void setProducedOutputItemCount(const std::unique_ptr<KernelBuilder> &b, llvm::Value* produced) = 0;
104};
105}
106
107
108
109#endif //ICGREP_LZ4_AIO_BASE_H
Note: See TracBrowser for help on using the repository browser.