GeNN  4.0.0
GPU enhanced Neuronal Networks (GeNN)
genn_single_threaded_cpu_backend/backend.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 
8 // GeNN includes
9 #include "backendExport.h"
10 
11 // GeNN code generator includes
13 
14 // Forward declarations
15 namespace filesystem
16 {
17  class path;
18 }
19 
20 //--------------------------------------------------------------------------
21 // CodeGenerator::SingleThreadedCPU::Preferences
22 //--------------------------------------------------------------------------
23 namespace CodeGenerator
24 {
25 namespace SingleThreadedCPU
26 {
28 {
29 };
30 
31 //--------------------------------------------------------------------------
32 // CodeGenerator::SingleThreadedCPU::Backend
33 //--------------------------------------------------------------------------
35 {
36 public:
37  Backend(int localHostID, const Preferences &preferences)
38  : BackendBase(localHostID), m_Preferences(preferences)
39  {
40  }
41 
42  //--------------------------------------------------------------------------
43  // CodeGenerator::BackendBase virtuals
44  //--------------------------------------------------------------------------
45  virtual void genNeuronUpdate(CodeStream &os, const ModelSpecInternal &model, NeuronGroupSimHandler simHandler, NeuronGroupHandler wuVarUpdateHandler) const override;
46 
47  virtual void genSynapseUpdate(CodeStream &os, const ModelSpecInternal &model,
48  SynapseGroupHandler wumThreshHandler, SynapseGroupHandler wumSimHandler, SynapseGroupHandler wumEventHandler,
49  SynapseGroupHandler postLearnHandler, SynapseGroupHandler synapseDynamicsHandler) const override;
50 
51  virtual void genInit(CodeStream &os, const ModelSpecInternal &model,
52  NeuronGroupHandler localNGHandler, NeuronGroupHandler remoteNGHandler,
53  SynapseGroupHandler sgDenseInitHandler, SynapseGroupHandler sgSparseConnectHandler,
54  SynapseGroupHandler sgSparseInitHandler) const override;
55 
56  virtual void genDefinitionsPreamble(CodeStream &os) const override;
57  virtual void genDefinitionsInternalPreamble(CodeStream &os) const override;
58  virtual void genRunnerPreamble(CodeStream &os) const override;
59  virtual void genAllocateMemPreamble(CodeStream &os, const ModelSpecInternal &model) const override;
60  virtual void genStepTimeFinalisePreamble(CodeStream &os, const ModelSpecInternal &model) const override;
61 
62  virtual void genVariableDefinition(CodeStream &definitions, CodeStream &definitionsInternal, const std::string &type, const std::string &name, VarLocation loc) const override;
63  virtual void genVariableImplementation(CodeStream &os, const std::string &type, const std::string &name, VarLocation loc) const override;
64  virtual void genVariableAllocation(CodeStream &os, const std::string &type, const std::string &name, VarLocation loc, size_t count) const override;
65  virtual void genVariableFree(CodeStream &os, const std::string &name, VarLocation loc) const override;
66 
67  virtual void genExtraGlobalParamDefinition(CodeStream &definitions, const std::string &type, const std::string &name, VarLocation loc) const override;
68  virtual void genExtraGlobalParamImplementation(CodeStream &os, const std::string &type, const std::string &name, VarLocation loc) const override;
69  virtual void genExtraGlobalParamAllocation(CodeStream &os, const std::string &type, const std::string &name, VarLocation loc) const override;
70  virtual void genExtraGlobalParamPush(CodeStream &os, const std::string &type, const std::string &name) const override;
71  virtual void genExtraGlobalParamPull(CodeStream &os, const std::string &type, const std::string &name) const override;
72 
73  virtual void genPopVariableInit(CodeStream &os, VarLocation loc, const Substitutions &kernelSubs, Handler handler) const override;
74  virtual void genVariableInit(CodeStream &os, VarLocation loc, size_t count, const std::string &indexVarName,
75  const Substitutions &kernelSubs, Handler handler) const override;
76  virtual void genSynapseVariableRowInit(CodeStream &os, VarLocation loc, const SynapseGroupInternal &sg,
77  const Substitutions &kernelSubs, Handler handler) const override;
78 
79  virtual void genCurrentTrueSpikePush(CodeStream &os, const NeuronGroupInternal &ng) const override;
80  virtual void genCurrentTrueSpikePull(CodeStream &os, const NeuronGroupInternal &ng) const override;
81  virtual void genCurrentSpikeLikeEventPush(CodeStream &os, const NeuronGroupInternal &ng) const override;
82  virtual void genCurrentSpikeLikeEventPull(CodeStream &os, const NeuronGroupInternal &ng) const override;
83 
84  virtual void genVariablePush(CodeStream &os, const std::string &type, const std::string &name, bool autoInitialized, size_t count) const override;
85  virtual void genVariablePull(CodeStream &os, const std::string &type, const std::string &name, size_t count) const override;
86 
87  virtual void genGlobalRNG(CodeStream &definitions, CodeStream &definitionsInternal, CodeStream &runner, CodeStream &allocations, CodeStream &free, const ModelSpecInternal &model) const override;
88  virtual void genPopulationRNG(CodeStream &definitions, CodeStream &definitionsInternal, CodeStream &runner, CodeStream &allocations, CodeStream &free,
89  const std::string &name, size_t count) const override;
90  virtual void genTimer(CodeStream &definitions, CodeStream &definitionsInternal, CodeStream &runner, CodeStream &allocations, CodeStream &free,
91  CodeStream &stepTimeFinalise, const std::string &name, bool updateInStepTime) const override;
92 
93  virtual void genMakefilePreamble(std::ostream &os) const override;
94  virtual void genMakefileLinkRule(std::ostream &os) const override;
95  virtual void genMakefileCompileRule(std::ostream &os) const override;
96 
97  virtual void genMSBuildConfigProperties(std::ostream &os) const override;
98  virtual void genMSBuildImportProps(std::ostream &os) const override;
99  virtual void genMSBuildItemDefinitions(std::ostream &os) const override;
100  virtual void genMSBuildCompileModule(const std::string &moduleName, std::ostream &os) const override;
101  virtual void genMSBuildImportTarget(std::ostream &os) const override;
102 
103  virtual std::string getVarPrefix() const override{ return ""; }
104 
105  virtual bool isGlobalRNGRequired(const ModelSpecInternal &model) const override;
106  virtual bool isSynRemapRequired() const override{ return false; }
107  virtual bool isPostsynapticRemapRequired() const override{ return true; }
108 
109 private:
110  //--------------------------------------------------------------------------
111  // Private methods
112  //--------------------------------------------------------------------------
113  void genPresynapticUpdate(CodeStream &os, const SynapseGroupInternal &sg, const Substitutions &popSubs, bool trueSpike,
114  SynapseGroupHandler wumThreshHandler, SynapseGroupHandler wumSimHandler) const;
115 
116  void genEmitSpike(CodeStream &os, const NeuronGroupInternal &ng, const Substitutions &subs, bool trueSpike) const;
117 
118 
119  //--------------------------------------------------------------------------
120  // Members
121  //--------------------------------------------------------------------------
122  const Preferences m_Preferences;
123 };
124 } // namespace SingleThreadedCPU
125 } // namespace CodeGenerator
Definition: neuronGroupInternal.h:9
VarLocation
< Flags defining which memory space variables should be allocated in
Definition: variableMode.h:10
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
Backend(int localHostID, const Preferences &preferences)
Definition: genn_single_threaded_cpu_backend/backend.h:37
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
virtual bool isSynRemapRequired() const override
Definition: genn_single_threaded_cpu_backend/backend.h:106
Definition: codeStream.h:19
#define BACKEND_EXPORT
Definition: backendExport.h:13
Definition: substitutions.h:19
Definition: genn_single_threaded_cpu_backend/backend.h:27
Definition: backendBase.h:54
virtual bool isPostsynapticRemapRequired() const override
Definition: genn_single_threaded_cpu_backend/backend.h:107
virtual std::string getVarPrefix() const override
Definition: genn_single_threaded_cpu_backend/backend.h:103
Definition: genn_single_threaded_cpu_backend/backend.h:34
Definition: modelSpecInternal.h:10
Definition: generateAll.h:18
std::function< void(CodeStream &, Substitutions &)> Handler
Definition: backendBase.h:60