GeNN  4.0.0
GPU enhanced Neuronal Networks (GeNN)
backendBase.h
Go to the documentation of this file.
1 #pragma once
2 
3 // Standard C++ includes
4 #include <functional>
5 #include <map>
6 #include <string>
7 #include <vector>
8 
9 // PLOG includes
10 #include <plog/Severity.h>
11 
12 // GeNN includes
13 #include "codeStream.h"
14 #include "gennExport.h"
15 #include "variableMode.h"
16 
17 // Forward declarations
19 class ModelSpecInternal;
21 
22 namespace CodeGenerator
23 {
24  class Substitutions;
25 }
26 
27 //--------------------------------------------------------------------------
28 // CodeGenerator::PreferencesBase
29 //--------------------------------------------------------------------------
30 namespace CodeGenerator
31 {
34 {
36  bool optimizeCode = false;
37 
39  bool debugCode = false;
40 
42  std::string userCxxFlagsGNU = "";
43 
45  std::string userNvccFlagsGNU = "";
46 
48  plog::Severity logLevel = plog::info;
49 };
50 
51 //--------------------------------------------------------------------------
52 // CodeGenerator::BackendBase
53 //--------------------------------------------------------------------------
55 {
56 public:
57  //--------------------------------------------------------------------------
58  // Typedefines
59  //--------------------------------------------------------------------------
60  typedef std::function<void(CodeStream &, Substitutions&)> Handler;
61 
62  template<typename T>
63  using GroupHandler = std::function <void(CodeStream &, const T &, Substitutions&)> ;
64 
67 
70 
72 
73  typedef std::function <void(CodeStream &, const NeuronGroupInternal &, Substitutions&,
74  NeuronGroupHandler, NeuronGroupHandler)> NeuronGroupSimHandler;
75 
76  BackendBase(int localHostID)
77  : m_LocalHostID(localHostID)
78  {
79  }
80  virtual ~BackendBase(){}
81 
82  //--------------------------------------------------------------------------
83  // Declared virtuals
84  //--------------------------------------------------------------------------
86 
90  virtual void genNeuronUpdate(CodeStream &os, const ModelSpecInternal &model, NeuronGroupSimHandler simHandler, NeuronGroupHandler wuVarUpdateHandler) const = 0;
91 
93 
107  virtual void genSynapseUpdate(CodeStream &os, const ModelSpecInternal &model,
108  SynapseGroupHandler wumThreshHandler, SynapseGroupHandler wumSimHandler, SynapseGroupHandler wumEventHandler,
109  SynapseGroupHandler postLearnHandler, SynapseGroupHandler synapseDynamicsHandler) const = 0;
110 
111  virtual void genInit(CodeStream &os, const ModelSpecInternal &model,
112  NeuronGroupHandler localNGHandler, NeuronGroupHandler remoteNGHandler,
113  SynapseGroupHandler sgDenseInitHandler, SynapseGroupHandler sgSparseConnectHandler,
114  SynapseGroupHandler sgSparseInitHandler) const = 0;
115 
117 
118  virtual void genDefinitionsPreamble(CodeStream &os) const = 0;
119 
121 
122  virtual void genDefinitionsInternalPreamble(CodeStream &os) const = 0;
123 
124 
125  virtual void genRunnerPreamble(CodeStream &os) const = 0;
126 
129  virtual void genAllocateMemPreamble(CodeStream &os, const ModelSpecInternal &model) const = 0;
130 
132  virtual void genStepTimeFinalisePreamble(CodeStream &os, const ModelSpecInternal &model) const = 0;
133 
134  virtual void genVariableDefinition(CodeStream &definitions, CodeStream &definitionsInternal, const std::string &type, const std::string &name, VarLocation loc) const = 0;
135  virtual void genVariableImplementation(CodeStream &os, const std::string &type, const std::string &name, VarLocation loc) const = 0;
136  virtual void genVariableAllocation(CodeStream &os, const std::string &type, const std::string &name, VarLocation loc, size_t count) const = 0;
137  virtual void genVariableFree(CodeStream &os, const std::string &name, VarLocation loc) const = 0;
138 
139  virtual void genExtraGlobalParamDefinition(CodeStream &definitions, const std::string &type, const std::string &name, VarLocation loc) const = 0;
140  virtual void genExtraGlobalParamImplementation(CodeStream &os, const std::string &type, const std::string &name, VarLocation loc) const = 0;
141  virtual void genExtraGlobalParamAllocation(CodeStream &os, const std::string &type, const std::string &name, VarLocation loc) const = 0;
142  virtual void genExtraGlobalParamPush(CodeStream &os, const std::string &type, const std::string &name) const = 0;
143  virtual void genExtraGlobalParamPull(CodeStream &os, const std::string &type, const std::string &name) const = 0;
144 
145  virtual void genPopVariableInit(CodeStream &os, VarLocation loc, const Substitutions &kernelSubs, Handler handler) const = 0;
146  virtual void genVariableInit(CodeStream &os, VarLocation loc, size_t count, const std::string &indexVarName,
147  const Substitutions &kernelSubs, Handler handler) const = 0;
148  virtual void genSynapseVariableRowInit(CodeStream &os, VarLocation loc, const SynapseGroupInternal &sg,
149  const Substitutions &kernelSubs, Handler handler) const = 0;
150 
151  virtual void genVariablePush(CodeStream &os, const std::string &type, const std::string &name, bool autoInitialized, size_t count) const = 0;
152  virtual void genVariablePull(CodeStream &os, const std::string &type, const std::string &name, size_t count) const = 0;
153  virtual void genCurrentTrueSpikePush(CodeStream &os, const NeuronGroupInternal &ng) const = 0;
154  virtual void genCurrentTrueSpikePull(CodeStream &os, const NeuronGroupInternal &ng) const = 0;
155  virtual void genCurrentSpikeLikeEventPush(CodeStream &os, const NeuronGroupInternal &ng) const = 0;
156  virtual void genCurrentSpikeLikeEventPull(CodeStream &os, const NeuronGroupInternal &ng) const = 0;
157 
158  virtual void genGlobalRNG(CodeStream &definitions, CodeStream &definitionsInternal, CodeStream &runner, CodeStream &allocations, CodeStream &free, const ModelSpecInternal &model) const = 0;
159  virtual void genPopulationRNG(CodeStream &definitions, CodeStream &definitionsInternal, CodeStream &runner, CodeStream &allocations, CodeStream &free,
160  const std::string &name, size_t count) const = 0;
161  virtual void genTimer(CodeStream &definitions, CodeStream &definitionsInternal, CodeStream &runner, CodeStream &allocations, CodeStream &free,
162  CodeStream &stepTimeFinalise, const std::string &name, bool updateInStepTime) const = 0;
163 
165  virtual void genMakefilePreamble(std::ostream &os) const = 0;
166 
169  virtual void genMakefileLinkRule(std::ostream &os) const = 0;
170 
173  virtual void genMakefileCompileRule(std::ostream &os) const = 0;
174 
177 
178  virtual void genMSBuildConfigProperties(std::ostream &os) const = 0;
179  virtual void genMSBuildImportProps(std::ostream &os) const = 0;
180 
183 
184  virtual void genMSBuildItemDefinitions(std::ostream &os) const = 0;
185  virtual void genMSBuildCompileModule(const std::string &moduleName, std::ostream &os) const = 0;
186  virtual void genMSBuildImportTarget(std::ostream &os) const = 0;
187 
190  virtual std::string getVarPrefix() const{ return ""; }
191 
193  virtual bool isGlobalRNGRequired(const ModelSpecInternal &model) const = 0;
194  virtual bool isSynRemapRequired() const = 0;
195  virtual bool isPostsynapticRemapRequired() const = 0;
196 
197  //--------------------------------------------------------------------------
198  // Public API
199  //--------------------------------------------------------------------------
202  const std::string &type, const std::string &name, bool autoInitialized, size_t count) const
203  {
204  genVariablePush(push, type, name, autoInitialized, count);
205  genVariablePull(pull, type, name, count);
206  }
207 
209  void genArray(CodeStream &definitions, CodeStream &definitionsInternal, CodeStream &runner, CodeStream &allocations, CodeStream &free,
210  const std::string &type, const std::string &name, VarLocation loc, size_t count) const
211  {
212  genVariableDefinition(definitions, definitionsInternal, type + "*", name, loc);
213  genVariableImplementation(runner, type + "*", name, loc);
214  genVariableAllocation(allocations, type, name, loc, count);
215  genVariableFree(free, name, loc);
216  }
217 
219  void genScalar(CodeStream &definitions, CodeStream &definitionsInternal, CodeStream &runner, const std::string &type, const std::string &name, VarLocation loc) const
220  {
221  genVariableDefinition(definitions, definitionsInternal, type, name, loc);
222  genVariableImplementation(runner, type, name, loc);
223  }
224 
226  int getLocalHostID() const{ return m_LocalHostID; }
227 
228 private:
229  //--------------------------------------------------------------------------
230  // Members
231  //--------------------------------------------------------------------------
232  const int m_LocalHostID;
233 };
234 } // namespace CodeGenerator
void genVariablePushPull(CodeStream &push, CodeStream &pull, const std::string &type, const std::string &name, bool autoInitialized, size_t count) const
Helper function to generate matching push and pull functions for a variable.
Definition: backendBase.h:201
Definition: neuronGroupInternal.h:9
void genArray(CodeStream &definitions, CodeStream &definitionsInternal, CodeStream &runner, CodeStream &allocations, CodeStream &free, const std::string &type, const std::string &name, VarLocation loc, size_t count) const
Helper function to generate matching definition, declaration, allocation and free code for an array...
Definition: backendBase.h:209
BackendBase(int localHostID)
Definition: backendBase.h:76
VarLocation
< Flags defining which memory space variables should be allocated in
Definition: variableMode.h:10
#define GENN_EXPORT
Definition: gennExport.h:13
Base class for backend preferences - can be accessed via a global in &#39;classic&#39; C++ code generator...
Definition: backendBase.h:33
std::function< void(CodeStream &, const NeuronGroupInternal &, Substitutions &, NeuronGroupHandler, NeuronGroupHandler)> NeuronGroupSimHandler
Callback function type for generation neuron group simulation code.
Definition: backendBase.h:74
GroupHandler< SynapseGroupInternal > SynapseGroupHandler
Standard callback type which provides a CodeStream to write platform-independent code for the specifi...
Definition: backendBase.h:69
Helper class for generating code - automatically inserts brackets, indents etc.
Definition: backendBase.h:22
GroupHandler< NeuronGroupInternal > NeuronGroupHandler
Standard callback type which provides a CodeStream to write platform-independent code for the specifi...
Definition: backendBase.h:66
Definition: synapseGroupInternal.h:9
Definition: codeStream.h:19
Definition: substitutions.h:19
void genScalar(CodeStream &definitions, CodeStream &definitionsInternal, CodeStream &runner, const std::string &type, const std::string &name, VarLocation loc) const
Helper function to generate matching definition and declaration code for a scalar variable...
Definition: backendBase.h:219
Definition: backendBase.h:54
bool debugCode
Generate code with debug symbols.
Definition: backendBase.h:39
std::string userCxxFlagsGNU
C++ compiler options to be used for building all host side code (used for unix based platforms) ...
Definition: backendBase.h:42
Definition: modelSpecInternal.h:10
int getLocalHostID() const
Gets ID of local host backend is building code for.
Definition: backendBase.h:226
std::function< void(CodeStream &, const T &, Substitutions &)> GroupHandler
Definition: backendBase.h:63
virtual ~BackendBase()
Definition: backendBase.h:80
plog::Severity logLevel
Logging level to use for code generation.
Definition: backendBase.h:48
std::string userNvccFlagsGNU
NVCC compiler options they may want to use for all GPU code (used for unix based platforms) ...
Definition: backendBase.h:45
virtual std::string getVarPrefix() const
Definition: backendBase.h:190
std::function< void(CodeStream &, Substitutions &)> Handler
Definition: backendBase.h:60
bool optimizeCode
Generate speed-optimized code, potentially at the expense of floating-point accuracy.
Definition: backendBase.h:36