source: icGREP/icgrep-devel/icgrep/kernels/pipeline_kernel.h

Last change on this file was 6288, checked in by cameron, 6 months ago

Repeat of prior check in

File size: 4.3 KB
Line 
1#ifndef PIPELINE_KERNEL_H
2#define PIPELINE_KERNEL_H
3
4#include "kernel.h"
5#include <type_traits>
6#include <functional>
7#include <toolchain/driver.h>
8#include <boost/container/flat_map.hpp>
9
10namespace llvm { class Value; }
11
12namespace kernel {
13
14const static std::string INITIALIZE_FUNCTION_POINTER_SUFFIX = "_IFP";
15const static std::string DO_SEGMENT_FUNCTION_POINTER_SUFFIX = "_SFP";
16const static std::string FINALIZE_FUNCTION_POINTER_SUFFIX = "_FIP";
17
18class PipelineCompiler;
19
20class PipelineKernel : public Kernel {
21    friend class PipelineCompiler;
22    friend class PipelineBuilder;
23public:
24
25    static bool classof(const Kernel * const k) {
26        return k->getTypeId() == TypeId::Pipeline;
27    }
28
29    static bool classof(const void *) { return false; }
30
31public:
32
33    using Scalars = std::vector<Scalar *>;
34    using Kernels = std::vector<Kernel *>;
35
36    struct CallBinding {
37        const std::string Name;
38        llvm::FunctionType * const Type;
39        void * const FunctionPointer;
40        const Scalars Args;
41
42        llvm::Constant * Callee;
43
44        CallBinding(const std::string Name, llvm::FunctionType * Type, void * FunctionPointer, std::initializer_list<Scalar *> && Args)
45        : Name(Name), Type(Type), FunctionPointer(FunctionPointer), Args(Args), Callee(nullptr) { }
46    };
47
48    using CallBindings = std::vector<CallBinding>;
49
50    template <typename Value>
51    using StreamSetBufferMap = boost::container::flat_map<const StreamSetBuffer *, Value>;
52
53    const std::string getName() const final;
54
55    bool isCachable() const final { return true; }
56
57    bool hasSignature() const final { return true; }
58
59    std::string makeSignature(const std::unique_ptr<KernelBuilder> &) final {
60        return mSignature;
61    }
62
63    const unsigned getNumOfThreads() const {
64        return mNumOfThreads;
65    }
66
67    const Kernels & getKernels() const {
68        return mKernels;
69    }
70
71    const CallBindings & getCallBindings() const {
72        return mCallBindings;
73    }
74
75    virtual ~PipelineKernel();
76
77    enum MainMethodGenerationType {
78        AddInternal
79        , DeclareExternal
80        , AddExternal
81    };
82
83    llvm::Function * addOrDeclareMainFunction(const std::unique_ptr<kernel::KernelBuilder> & b, const MainMethodGenerationType method);
84
85    LLVM_READNONE bool hasStaticMain() const;
86
87protected:
88
89    PipelineKernel(const std::unique_ptr<KernelBuilder> & b,
90                   std::string && signature, const unsigned numOfThreads,
91                   Kernels && kernels, CallBindings && callBindings,
92                   Bindings && stream_inputs, Bindings && stream_outputs,
93                   Bindings && scalar_inputs, Bindings && scalar_outputs);
94
95    static LLVM_READNONE std::string makeKernelName(const Kernel * const kernel, const unsigned kernelIndex);
96
97    static LLVM_READNONE std::string makeBufferName(const Kernel * const kernel, const unsigned kernelIndex, const Binding & binding);
98
99    void linkExternalMethods(const std::unique_ptr<KernelBuilder> & b) final;
100
101    void addKernelDeclarations(const std::unique_ptr<KernelBuilder> & b) final;
102
103    void generateInitializeMethod(const std::unique_ptr<KernelBuilder> & b) final;
104
105    void initializeInstance(const std::unique_ptr<KernelBuilder> & b, std::vector<llvm::Value *> & args) final;
106
107    void generateKernelMethod(const std::unique_ptr<KernelBuilder> & b) final;
108
109    void generateFinalizeMethod(const std::unique_ptr<KernelBuilder> & b) final;
110
111    void addAdditionalFunctions(const std::unique_ptr<KernelBuilder> & b) final;
112
113    void addInternalKernelProperties(const std::unique_ptr<kernel::KernelBuilder> & b) final;
114
115    void setInputStreamSetAt(const unsigned i, StreamSet * const value) final;
116
117    void setOutputStreamSetAt(const unsigned i, StreamSet * const value) final;
118
119    void setInputScalarAt(const unsigned i, Scalar * const value) final;
120
121    void setOutputScalarAt(const unsigned i, Scalar * const value) final;
122
123    std::vector<llvm::Value *> getFinalOutputScalars(const std::unique_ptr<KernelBuilder> & b) final;
124
125protected:
126
127    mutable std::unique_ptr<PipelineCompiler> mCompiler;
128    const unsigned                            mNumOfThreads;
129    const Kernels                             mKernels;
130    CallBindings                              mCallBindings;
131    const std::string                         mSignature;
132};
133
134}
135
136#endif // PIPELINE_KERNEL_H
Note: See TracBrowser for help on using the repository browser.