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

Last change on this file since 6081 was 6081, checked in by xwa163, 12 months ago
  1. Add command line parameter -enable-gather and -enable-scatter in lz4 parallel grep
  2. fix some bugs for AVX512 machine
File size: 5.6 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, bool enableGather = true, bool enableScatter = true, size_t outputBlockSize = 4 * 1024 * 1024 );
28
29    protected:
30        void generateDoSegmentMethod(const std::unique_ptr<KernelBuilder> &b) override;
31
32    private:
33        void generateSimdDecompression(const std::unique_ptr<KernelBuilder> &iBuilder, llvm::Value* blockDataIndex);
34
35        llvm::Value *
36        generateLoadSimdInt64NumberInput(const std::unique_ptr<KernelBuilder> &iBuilder, std::string inputBufferName,
37                                     llvm::Value *globalOffset);
38
39        llvm::Value *
40        generateLoadInt64NumberInput(const std::unique_ptr<KernelBuilder> &iBuilder, std::string inputBufferName,
41                                     llvm::Value *globalOffset);
42
43        llvm::Value* generateProcessCompressedBlock(const std::unique_ptr<KernelBuilder> &b, llvm::Value *lz4BlockStart,
44                                            llvm::Value *lz4BlockEnd, llvm::Value* initOutputPos);
45
46        llvm::Value* generateSimdAcceleration(const std::unique_ptr<KernelBuilder> &b, llvm::Value *beginTokenPosVec,
47                                      llvm::Value *blockEndVec);
48
49        std::pair<llvm::Value*, llvm::Value*> simdProcessBlockBoundary(const std::unique_ptr<KernelBuilder> &b,
50                                          llvm::Value *beginTokenPos, llvm::Value *lz4BlockEnd, llvm::Value* outputPosVec);
51
52        std::pair<llvm::Value*, llvm::Value*> processBlockBoundary(const std::unique_ptr<KernelBuilder> &b,
53                                          llvm::Value *beginTokenPos, llvm::Value *lz4BlockEnd, llvm::Value* outputPos);
54
55
56
57        void handleSimdLiteralCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value* literalStartVec, llvm::Value* literalLengthVec, llvm::Value* outputPosVec);
58        void generateSimdSequentialLiteralCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value *literalStartVec,
59                                               llvm::Value *literalLengthVec, llvm::Value *outputPosVec);
60
61        void generateSimdLiteralCopyByScatter(const std::unique_ptr<KernelBuilder> &b, llvm::Value *literalStartVec,
62                                              llvm::Value *literalLengthVec, llvm::Value *outputPosVec);
63
64        void generateOverwritingMemcpy(const std::unique_ptr<KernelBuilder> &b, llvm::Value *inputBasePtr,
65                                       llvm::Value *outputBasePtr, llvm::Value *copyBytes, llvm::PointerType *targetPtrTy,
66                                       size_t stepSize);
67        void generateOverwritingMemcpy(const std::unique_ptr<KernelBuilder> &b, llvm::Value *inputBasePtr,
68                                       llvm::Value *outputBasePtr, llvm::Value *copyBytes, llvm::PointerType *targetPtrTy,
69                                       llvm::Value* stepSize);
70
71        void handleSimdMatchCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value* matchOffsetVec, llvm::Value* matchLengthVec, llvm::Value* outputPosVec);
72        void generateSimdSequentialMatchCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value* matchOffsetVec, llvm::Value* matchLengthVec, llvm::Value* outputPosVec);
73
74        void handleLiteralCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value* literalStart, llvm::Value* literalLength, llvm::Value* outputPos);
75        void handleMatchCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value* matchOffset, llvm::Value* matchLength, llvm::Value* outputPos);
76
77        void generateSequentialDecompression(const std::unique_ptr<KernelBuilder> &b, llvm::Value* startBlockDataIndex, llvm::Value* endBlockDataIndex);
78
79
80        llvm::Value* simdFetchData(const std::unique_ptr<KernelBuilder> &b, llvm::Value* basePtr, llvm::Value* offsetVec, llvm::Value* mask);
81        llvm::Value* simdFetchByteData(const std::unique_ptr<KernelBuilder> &b, llvm::Value* basePtr, llvm::Value* offsetVec, llvm::Value* mask);
82        llvm::Value* simdFetchI64DataByGather(const std::unique_ptr<KernelBuilder> &b, llvm::Value *basePtr,
83                                              llvm::Value *offsetVec, llvm::Value *mask);
84        llvm::Value* simdFetchI32DataByGather(const std::unique_ptr<KernelBuilder> &b, llvm::Value *basePtr,
85                                              llvm::Value *offsetVec, llvm::Value *mask);
86        llvm::Value* simdFetchDataByLoop(const std::unique_ptr<KernelBuilder> &b, llvm::Value *basePtr,
87                                         llvm::Value *offsetVec, llvm::Value *mask);
88
89        void simdPutData(const std::unique_ptr<KernelBuilder> &b, llvm::Value* basePtr, llvm::Value* offsetVec,llvm::Value* values, llvm::Value* mask /*i256*/);
90        void simdPutDataByLoop(const std::unique_ptr<KernelBuilder> &b, llvm::Value* basePtr, llvm::Value* offsetVec,llvm::Value* values, llvm::Value* mask /*i256*/);
91        void simdPutDataByScatter(const std::unique_ptr<KernelBuilder> &b, llvm::Value* basePtr, llvm::Value* offsetVec,llvm::Value* values, llvm::Value* mask /*i256*/);
92
93        size_t mOutputBlockSize;
94        bool mEnableGather;
95        bool mEnableScatter;
96    };
97
98}
99
100
101#endif //ICGREP_LZ4_PARALLEL_BYTESTREAM_AIO_H
Note: See TracBrowser for help on using the repository browser.