source: icGREP/icgrep-devel/icgrep/kernels/kernel.h @ 4968

Last change on this file since 4968 was 4968, checked in by nmedfort, 3 years ago

Some fixes for threading and kernel builder.

File size: 3.9 KB
Line 
1#ifndef KERNEL_H
2#define KERNEL_H
3/*
4 *  Copyright (c) 2016 International Characters.
5 *  This software is licensed to the public under the Open Software License 3.0.
6 */
7
8#include <string>
9#include <vector>
10
11namespace llvm {
12    class Value;
13    class Module;
14    class ExecutionEngine;
15    class VectorType;
16    class PointerType;
17    class Constant;
18    class FunctionType;
19    class Function;
20    class BasicBlock;
21    class Type;
22}
23
24namespace pablo {
25    class PabloAST;
26    class PabloFunction;
27}
28
29namespace IDISA {
30    class IDISA_Builder;
31}
32
33class KernelBuilder {
34
35public:
36    // sets name & sets internal state to the kernel superclass state
37    KernelBuilder(std::string name, llvm::Module * m, IDISA::IDISA_Builder * b);
38
39    unsigned addInternalStateType(llvm::Type * const type);
40    void addOutputStream(const unsigned fields);
41    void addOutputAccum(llvm::Type * const type);
42    void addInputStream(const unsigned fields, std::string name);
43    void addInputScalar(llvm::Type * const type, std::string name);
44
45    llvm::Function * prepareFunction();
46
47    void increment();
48    void incrementCircularBuffer();
49
50    llvm::Value * getInputStream(const unsigned index, const unsigned streamOffset = 0);
51    llvm::Value * getInputScalar(const unsigned index);
52    llvm::Value * getKernelState(const unsigned index, const unsigned streamOffset = 0);
53    llvm::Value * getOutputStream(const unsigned index, const unsigned streamOffset = 0);
54    llvm::Value * getOutputScalar(const unsigned index);
55
56    void finalize();
57
58    llvm::Value * generateKernelInstance();
59        void generateInitCall();
60    void generateDoBlockCall(llvm::Value * inputStreams);
61
62    unsigned getSegmentBlocks() const;
63    llvm::Function * getDoBlockFunction() const;
64    llvm::Type * getKernelStructType() const;
65    llvm::Value * getKernelStructParam() const;
66
67    void setLongestLookaheadAmount(const unsigned bits);
68    void setBlocksPerSegment(const unsigned blocks);
69
70    void setInternalState(const unsigned index, llvm::Value * const value);
71    llvm::Value * getInternalState(const unsigned index);
72
73protected:
74
75    llvm::Value * getOffset(const unsigned value);
76
77private:
78    llvm::Module *                      mMod;
79    IDISA::IDISA_Builder *              iBuilder;
80    std::string                                                 mKernelName;
81    llvm::Type *                        mBitBlockType;
82    std::vector<llvm::Type *>                   mStates;
83    std::vector<llvm::Type *>           mInputStreams;
84    std::vector<llvm::Type *>           mOutputStreams;
85    std::vector<llvm::Type *>           mInputScalars;
86    std::vector<llvm::Type *>           mOutputAccums;
87    std::vector<std::string>            mInputStreamNames;
88    std::vector<std::string>            mInputScalarNames;
89    llvm::Function*                                     mConstructor;
90    llvm::Function*                                             mInitFunction;
91    llvm::Function*                                             mFunction;
92    unsigned                            mBlockSize;
93    unsigned                            mBlocksPerSegment;
94    unsigned                            mCircularBufferModulo;
95    llvm::Type *                        mKernelStructType;
96    llvm::Type *                        mInputStreamType;
97    llvm::Type *                        mInputScalarType;
98    llvm::Value *                       mInputParam;
99    llvm::Value *                       mKernelStruct;
100    llvm::Value *                       mKernelParam;
101    unsigned                            mSegmentIndex;
102    unsigned                            mStartIndex;
103};
104
105inline unsigned KernelBuilder::getSegmentBlocks() const {
106    return mBlocksPerSegment;
107}
108
109inline llvm::Function * KernelBuilder::getDoBlockFunction() const {
110    return mFunction;
111}
112
113inline llvm::Type * KernelBuilder::getKernelStructType() const{
114    return mKernelStructType;
115}
116
117inline llvm::Value * KernelBuilder::getKernelStructParam() const {
118    return mKernelParam;
119}
120
121inline void KernelBuilder::setBlocksPerSegment(const unsigned blocks) {
122    mBlocksPerSegment = blocks;
123}
124
125inline void KernelBuilder::increment() {
126    ++mSegmentIndex;
127}
128
129#endif // KERNEL_H
Note: See TracBrowser for help on using the repository browser.