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

Last change on this file since 6065 was 6065, checked in by xwa163, 14 months ago
  1. Fix some typo in LZ4 Grep Extract and Deposit pipeline
  2. Small fix for LZ4ParallelByteStreamAIOKernel
File size: 3.3 KB
Line 
1//
2// Created by wxy325 on 2018/5/31.
3//
4
5#ifndef ICGREP_LZ4_PARALLEL_BYTESTREAM_AIO_H
6#define ICGREP_LZ4_PARALLEL_BYTESTREAM_AIO_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
22
23namespace kernel {
24
25    class LZ4ParallelByteStreamAioKernel : public SegmentOrientedKernel {
26
27    public:
28        LZ4ParallelByteStreamAioKernel(const std::unique_ptr<kernel::KernelBuilder> &b);
29
30    protected:
31        void generateDoSegmentMethod(const std::unique_ptr<KernelBuilder> &b) override;
32
33    private:
34        void generateSimdDecompression(const std::unique_ptr<KernelBuilder> &iBuilder, llvm::Value* blockDataIndex);
35
36        llvm::Value *
37        generateLoadSimdInt64NumberInput(const std::unique_ptr<KernelBuilder> &iBuilder, std::string inputBufferName,
38                                     llvm::Value *globalOffset);
39
40        llvm::Value *
41        generateLoadInt64NumberInput(const std::unique_ptr<KernelBuilder> &iBuilder, std::string inputBufferName,
42                                     llvm::Value *globalOffset);
43
44        llvm::Value* generateProcessCompressedBlock(const std::unique_ptr<KernelBuilder> &b, llvm::Value *lz4BlockStart,
45                                            llvm::Value *lz4BlockEnd, llvm::Value* initOutputPos);
46
47        llvm::Value* generateSimdAcceleration(const std::unique_ptr<KernelBuilder> &b, llvm::Value *beginTokenPosVec,
48                                      llvm::Value *blockEndVec);
49
50        std::pair<llvm::Value*, llvm::Value*> simdProcessBlockBoundary(const std::unique_ptr<KernelBuilder> &b,
51                                          llvm::Value *beginTokenPos, llvm::Value *lz4BlockEnd, llvm::Value* outputPosVec);
52
53        std::pair<llvm::Value*, llvm::Value*> processBlockBoundary(const std::unique_ptr<KernelBuilder> &b,
54                                          llvm::Value *beginTokenPos, llvm::Value *lz4BlockEnd, llvm::Value* outputPos);
55
56
57
58        void handleSimdLiteralCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value* literalStartVec, llvm::Value* literalLengthVec, llvm::Value* outputPosVec);
59        void handleSimdMatchCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value* matchOffsetVec, llvm::Value* matchLengthVec, llvm::Value* outputPosVec);
60
61        void handleLiteralCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value* literalStart, llvm::Value* literalLength, llvm::Value* outputPos);
62        void handleMatchCopy(const std::unique_ptr<KernelBuilder> &b, llvm::Value* matchOffset, llvm::Value* matchLength, llvm::Value* outputPos);
63
64        void generateSequentialDecompression(const std::unique_ptr<KernelBuilder> &b, llvm::Value* startBlockDataIndex, llvm::Value* endBlockDataIndex);
65
66
67        llvm::Value* simdFetchByteData(const std::unique_ptr<KernelBuilder> &b, llvm::Value* basePtr, llvm::Value* offsetVec, llvm::Value* mask);
68        llvm::Value* simdFetchByteDataByGather(const std::unique_ptr<KernelBuilder> &b, llvm::Value* basePtr, llvm::Value* offsetVec, llvm::Value* mask);
69        llvm::Value* simdFetchByteDataByLoop(const std::unique_ptr<KernelBuilder> &b, llvm::Value* basePtr, llvm::Value* offsetVec, llvm::Value* mask);
70
71
72    };
73
74}
75
76
77#endif //ICGREP_LZ4_PARALLEL_BYTESTREAM_AIO_H
Note: See TracBrowser for help on using the repository browser.