Ignore:
Timestamp:
Mar 22, 2016, 5:14:05 PM (3 years ago)
Author:
nmedfort
Message:

First attempt at dynamic segment size intergration.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/kernels/kernel.h

    r4974 r4986  
    4242public:
    4343    // sets name & sets internal state to the kernel superclass state
    44     KernelBuilder(std::string name, llvm::Module * m, IDISA::IDISA_Builder * b);
     44    KernelBuilder(std::string name, llvm::Module * m, IDISA::IDISA_Builder * b, const unsigned bufferSize = 1);
    4545
    4646    unsigned addInternalState(llvm::Type * const type);
     
    5858    llvm::Function * prepareFunction();
    5959
    60     void increment();
    61 
    6260    inline llvm::Value * getInputStream(const unsigned index, const unsigned streamOffset = 0) {
    63         return getInputStream(mInputParam, index, streamOffset);
     61        return getInputStream(mKernelParam, index, streamOffset);
    6462    }
    6563
    6664    inline llvm::Value * getInputScalar(const unsigned index) {
    67         return getInputScalar(mInputParam, index);
     65        return getInputScalar(mKernelParam, index);
    6866    }
    6967
     
    8785        return getOutputStream(mKernelParam, index, streamOffset);
    8886    }
    89     llvm::Value * getOutputStreamSet(const unsigned streamOffset = 0) {
    90         return getOutputStreamSet(mKernelParam, streamOffset);
     87
     88    inline unsigned getNumOfOutputStreams() const {
     89        return mOutputStream.size();
    9190    }
    9291
     
    9594    }
    9695
     96    inline unsigned getNumOfOutputScalars() const {
     97        return mOutputScalar.size();
     98    }
     99
    97100    llvm::Value * getBlockNo() {
    98101        return getBlockNo(mKernelParam);
     
    101104    llvm::Type * getInputStreamType() const;
    102105
     106    void setInputBufferSize(const unsigned bufferSize);
     107
     108    unsigned getInputBufferSize() const;
     109
     110    unsigned getBufferSize() const;
     111
    103112    void finalize();
    104113
    105     kernel::Instance * instantiate();
    106 
    107     unsigned getSegmentBlocks() const;
     114    kernel::Instance * instantiate(llvm::Value * const inputStream);
     115
     116    kernel::Instance * instantiate(std::pair<llvm::Value *, unsigned> &&inputStream);
    108117
    109118    llvm::Type * getKernelStateType() const;
     
    113122    llvm::Function * getDoBlockFunction() const;
    114123
     124    void clearOutputStream(llvm::Value * const instance, const unsigned streamOffset = 0);
     125
    115126    void setLongestLookaheadAmount(const unsigned bits);
    116127
    117     void setBlocksPerSegment(const unsigned blocks);
    118 
    119128protected:
    120129
     
    133142    llvm::Value * getOutputStream(llvm::Value * const instance, const unsigned index, const unsigned streamOffset);
    134143
    135     llvm::Value * getOutputStreamSet(llvm::Value * const instance, const unsigned streamOffset);
    136 
    137144    llvm::Value * getOutputScalar(llvm::Value * const instance, const unsigned index);
    138145
     
    141148    llvm::Value * getBlockNo(llvm::Value * const instance);
    142149
    143     void call(llvm::Value * const instance, llvm::Value * inputStreams);
     150    llvm::Function * getOutputStreamSetFunction() const;
     151
     152    void CreateDoBlockCall(llvm::Value * const instance);
     153
     154    llvm::Function * CreateModFunction(const unsigned size);
    144155
    145156private:
     
    148159    std::string                                                 mKernelName;
    149160    llvm::Type *                        mBitBlockType;
    150     llvm::Function*                                     mConstructor;
    151     llvm::Function*                                             mFunction;
    152     unsigned                            mBlockSize;
    153     unsigned                            mBlocksPerSegment;
    154     unsigned                            mCircularBufferModulo;
    155     llvm::Type *                        mKernelStructType;
     161    llvm::Function *                                    mConstructor;
     162    llvm::Function *                                    mDoBlock;
     163
     164    unsigned                            mBufferSize;
     165
     166    llvm::Type *                        mKernelStateType;
    156167    llvm::Type *                        mInputStreamType;
    157168    llvm::Type *                        mInputScalarType;
     169    llvm::Type *                        mOutputStreamType;
     170
    158171    llvm::Value *                       mInputParam;
    159172    llvm::Value *                       mKernelParam;
    160     unsigned                            mSegmentIndex;
    161     unsigned                            mBlockIndex;
     173    unsigned                            mBlockNoIndex;
     174
    162175    std::vector<llvm::Type *>           mInputStream;
    163176    std::vector<std::string>            mInputStreamName;
    164177    std::vector<llvm::Type *>           mInputScalar;
    165     std::vector<std::string>            mInputScalarName;
     178    std::vector<std::string>            mInputScalarName;   
    166179    std::vector<llvm::Type *>           mOutputStream;
    167180    std::vector<llvm::Type *>           mOutputScalar;
     
    170183};
    171184
    172 inline unsigned KernelBuilder::getSegmentBlocks() const {
    173     return mBlocksPerSegment;
    174 }
    175 
    176185inline llvm::Function * KernelBuilder::getDoBlockFunction() const {
    177     return mFunction;
     186    return mDoBlock;
    178187}
    179188
    180189inline llvm::Type * KernelBuilder::getKernelStateType() const{
    181     return mKernelStructType;
     190    return mKernelStateType;
    182191}
    183192
     
    186195}
    187196
    188 inline void KernelBuilder::setBlocksPerSegment(const unsigned blocks) {
    189     mBlocksPerSegment = blocks;
    190 }
    191 
    192197inline llvm::Type * KernelBuilder::getInputStreamType() const {
    193198    return mInputStreamType;
    194199}
    195200
    196 inline void KernelBuilder::increment() {
    197     ++mSegmentIndex;
    198 }
    199 
    200201inline llvm::Value * KernelBuilder::getBlockNo(llvm::Value * const instance) {
    201     return getInternalState(instance, mBlockIndex);
     202    return getInternalState(instance, mBlockNoIndex);
     203}
     204
     205inline unsigned KernelBuilder::getBufferSize() const {
     206    return mBufferSize;
    202207}
    203208
Note: See TracChangeset for help on using the changeset viewer.