source: icGREP/icgrep-devel/icgrep/lz4/LZ4Generator.h @ 6118

Last change on this file since 6118 was 6118, checked in by xwa163, 10 months ago

Implement bitstream decompression version of LZ4 Aio Kernel

File size: 3.5 KB
Line 
1
2#ifndef ICGREP_LZ4GENERATOR_H
3#define ICGREP_LZ4GENERATOR_H
4#include <llvm/IR/Module.h>
5#include <llvm/IR/Function.h>
6
7#include <llvm/Support/Signals.h>
8#include <llvm/Support/ManagedStatic.h>
9#include <IR_Gen/idisa_target.h>
10
11#include <toolchain/toolchain.h>
12
13#include <toolchain/cpudriver.h>
14#include <string>
15
16namespace re { class CC; }
17
18
19typedef void (*MainFunctionType)(char * byte_data, size_t headerSize, size_t filesize, bool hasBlockChecksum);
20
21class LZ4Generator {
22
23public:
24    LZ4Generator();
25
26    MainFunctionType getMainFunc();
27
28    void generatePipeline(const std::string &outputFile);
29    void generateSwizzledPipeline(const std::string &outputFile);
30    void generateNewExtractOnlyPipeline(const std::string &outputFile);
31    void generateExtractOnlyPipeline(const std::string &outputFile);
32    void generateSwizzledExtractOnlyPipeline(const std::string &outputFile);
33    void generateExtractAndDepositOnlyPipeline(const std::string &outputFile);
34    void generateSwizzledExtractAndDepositOnlyPipeline(const std::string &outputFile);
35
36protected:
37    //// Protected Method
38    void generateMainFunc(const std::unique_ptr<kernel::KernelBuilder> & iBuilder);
39    // Pipeline
40    virtual void generateLoadByteStream(const std::unique_ptr<kernel::KernelBuilder> & iBuilder);
41    virtual void generateLoadByteStreamAndBitStream(const std::unique_ptr<kernel::KernelBuilder> & iBuilder);
42    virtual void generateExtractAndDepositMarkers(const std::unique_ptr<kernel::KernelBuilder> & iBuilder);
43    virtual parabix::StreamSetBuffer * generateParallelAIODecompression(const std::unique_ptr<kernel::KernelBuilder> & iBuilder, bool enableGather, bool enableScatter, int minParallelLevel);
44    virtual parabix::StreamSetBuffer * generateAIODecompression(const std::unique_ptr<kernel::KernelBuilder> & iBuilder);
45    virtual parabix::StreamSetBuffer * generateSwizzledAIODecompression(const std::unique_ptr<kernel::KernelBuilder> & iBuilder);
46    virtual parabix::StreamSetBuffer * generateBitStreamAIODecompression(const std::unique_ptr<kernel::KernelBuilder> & iBuilder);
47
48    virtual std::pair<parabix::StreamSetBuffer*, parabix::StreamSetBuffer*> generateSwizzleExtractData(const std::unique_ptr<kernel::KernelBuilder> & iBuilder);
49    virtual parabix::StreamSetBuffer* generateBitStreamExtractData(const std::unique_ptr<kernel::KernelBuilder> & iBuilder);
50
51    void generateCompressionMarker(const std::unique_ptr<kernel::KernelBuilder> & iBuilder);
52
53    // BufferSize related Helper Function
54    virtual int getInputBufferBlocks(const std::unique_ptr<kernel::KernelBuilder> & iBuilder);
55    virtual int getDecompressedBufferBlocks(const std::unique_ptr<kernel::KernelBuilder> & iBuilder);
56    int get4MbBufferBlocks();
57
58
59    //// Data Member
60    // Driver
61    ParabixDriver mPxDriver;
62
63    // Runtime Arguments
64    llvm::Value * mInputStream;
65    llvm::Value * mHeaderSize;
66    llvm::Value * mFileSize;
67    llvm::Value * mHasBlockChecksum;
68
69
70    // StreamSetBuffers
71    parabix::StreamSetBuffer * mCompressedByteStream;
72    parabix::StreamSetBuffer * mCompressedBasisBits;
73    parabix::StreamSetBuffer * mDeletionMarker;
74    parabix::StreamSetBuffer * mCompressionMarker;
75    parabix::StreamSetBuffer * mDepositMarker;
76    parabix::StreamSetBuffer * mMatchOffsetMarker;
77
78    // M0CountMarker will not contain anything, it will only be used to pass producedItemCount and manage processedItemCount between different kernel
79    parabix::StreamSetBuffer * mM0Marker;
80
81    unsigned mLz4BlockSize;
82};
83
84
85#endif //ICGREP_LZ4GENERATOR_H
Note: See TracBrowser for help on using the repository browser.