GeNN  4.0.0
GPU enhanced Neuronal Networks (GeNN)
CodeGenerator::CUDA::Backend Class Reference

#include <backend.h>

Inheritance diagram for CodeGenerator::CUDA::Backend:
CodeGenerator::BackendBase

Public Member Functions

 Backend (const KernelBlockSize &kernelBlockSizes, const Preferences &preferences, int localHostID, int device)
 
virtual void genNeuronUpdate (CodeStream &os, const ModelSpecInternal &model, NeuronGroupSimHandler simHandler, NeuronGroupHandler wuVarUpdateHandler) const override
 Generate platform-specific function to update the state of all neurons. More...
 
virtual void genSynapseUpdate (CodeStream &os, const ModelSpecInternal &model, SynapseGroupHandler wumThreshHandler, SynapseGroupHandler wumSimHandler, SynapseGroupHandler wumEventHandler, SynapseGroupHandler postLearnHandler, SynapseGroupHandler synapseDynamicsHandler) const override
 Generate platform-specific function to update the state of all synapses. More...
 
virtual void genInit (CodeStream &os, const ModelSpecInternal &model, NeuronGroupHandler localNGHandler, NeuronGroupHandler remoteNGHandler, SynapseGroupHandler sgDenseInitHandler, SynapseGroupHandler sgSparseConnectHandler, SynapseGroupHandler sgSparseInitHandler) const override
 
virtual void genDefinitionsPreamble (CodeStream &os) const override
 Definitions is the usercode-facing header file for the generated code. This function generates a 'preamble' to this header file. More...
 
virtual void genDefinitionsInternalPreamble (CodeStream &os) const override
 Definitions internal is the internal header file for the generated code. This function generates a 'preamble' to this header file. More...
 
virtual void genRunnerPreamble (CodeStream &os) const override
 
virtual void genAllocateMemPreamble (CodeStream &os, const ModelSpecInternal &model) const override
 
virtual void genStepTimeFinalisePreamble (CodeStream &os, const ModelSpecInternal &model) const override
 After all timestep logic is complete. More...
 
virtual void genVariableDefinition (CodeStream &definitions, CodeStream &definitionsInternal, const std::string &type, const std::string &name, VarLocation loc) const override
 
virtual void genVariableImplementation (CodeStream &os, const std::string &type, const std::string &name, VarLocation loc) const override
 
virtual void genVariableAllocation (CodeStream &os, const std::string &type, const std::string &name, VarLocation loc, size_t count) const override
 
virtual void genVariableFree (CodeStream &os, const std::string &name, VarLocation loc) const override
 
virtual void genExtraGlobalParamDefinition (CodeStream &definitions, const std::string &type, const std::string &name, VarLocation loc) const override
 
virtual void genExtraGlobalParamImplementation (CodeStream &os, const std::string &type, const std::string &name, VarLocation loc) const override
 
virtual void genExtraGlobalParamAllocation (CodeStream &os, const std::string &type, const std::string &name, VarLocation loc) const override
 
virtual void genExtraGlobalParamPush (CodeStream &os, const std::string &type, const std::string &name) const override
 
virtual void genExtraGlobalParamPull (CodeStream &os, const std::string &type, const std::string &name) const override
 
virtual void genPopVariableInit (CodeStream &os, VarLocation loc, const Substitutions &kernelSubs, Handler handler) const override
 
virtual void genVariableInit (CodeStream &os, VarLocation loc, size_t count, const std::string &indexVarName, const Substitutions &kernelSubs, Handler handler) const override
 
virtual void genSynapseVariableRowInit (CodeStream &os, VarLocation loc, const SynapseGroupInternal &sg, const Substitutions &kernelSubs, Handler handler) const override
 
virtual void genVariablePush (CodeStream &os, const std::string &type, const std::string &name, bool autoInitialized, size_t count) const override
 
virtual void genVariablePull (CodeStream &os, const std::string &type, const std::string &name, size_t count) const override
 
virtual void genCurrentTrueSpikePush (CodeStream &os, const NeuronGroupInternal &ng) const override
 
virtual void genCurrentTrueSpikePull (CodeStream &os, const NeuronGroupInternal &ng) const override
 
virtual void genCurrentSpikeLikeEventPush (CodeStream &os, const NeuronGroupInternal &ng) const override
 
virtual void genCurrentSpikeLikeEventPull (CodeStream &os, const NeuronGroupInternal &ng) const override
 
virtual void genGlobalRNG (CodeStream &definitions, CodeStream &definitionsInternal, CodeStream &runner, CodeStream &allocations, CodeStream &free, const ModelSpecInternal &model) const override
 
virtual void genPopulationRNG (CodeStream &definitions, CodeStream &definitionsInternal, CodeStream &runner, CodeStream &allocations, CodeStream &free, const std::string &name, size_t count) const override
 
virtual void genTimer (CodeStream &definitions, CodeStream &definitionsInternal, CodeStream &runner, CodeStream &allocations, CodeStream &free, CodeStream &stepTimeFinalise, const std::string &name, bool updateInStepTime) const override
 
virtual void genMakefilePreamble (std::ostream &os) const override
 This function can be used to generate a preamble for the GNU makefile used to build. More...
 
virtual void genMakefileLinkRule (std::ostream &os) const override
 
virtual void genMakefileCompileRule (std::ostream &os) const override
 
virtual void genMSBuildConfigProperties (std::ostream &os) const override
 
virtual void genMSBuildImportProps (std::ostream &os) const override
 
virtual void genMSBuildItemDefinitions (std::ostream &os) const override
 
virtual void genMSBuildCompileModule (const std::string &moduleName, std::ostream &os) const override
 
virtual void genMSBuildImportTarget (std::ostream &os) const override
 
virtual std::string getVarPrefix () const override
 
virtual bool isGlobalRNGRequired (const ModelSpecInternal &model) const override
 Different backends use different RNGs for different things. Does this one require a global RNG for the specified model? More...
 
virtual bool isSynRemapRequired () const override
 
virtual bool isPostsynapticRemapRequired () const override
 
const cudaDeviceProp & getChosenCUDADevice () const
 
int getChosenDeviceID () const
 
std::string getNVCCFlags () const
 
- Public Member Functions inherited from CodeGenerator::BackendBase
 BackendBase (int localHostID)
 
virtual ~BackendBase ()
 
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. More...
 
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. More...
 
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. More...
 
int getLocalHostID () const
 Gets ID of local host backend is building code for. More...
 

Static Public Member Functions

static size_t getNumPresynapticUpdateThreads (const SynapseGroupInternal &sg)
 
static size_t getNumPostsynapticUpdateThreads (const SynapseGroupInternal &sg)
 
static size_t getNumSynapseDynamicsThreads (const SynapseGroupInternal &sg)
 

Static Public Attributes

static const char * KernelNames [KernelMax]
 

Additional Inherited Members

- Public Types inherited from CodeGenerator::BackendBase
typedef std::function< void(CodeStream &, Substitutions &)> Handler
 
template<typename T >
using GroupHandler = std::function< void(CodeStream &, const T &, Substitutions &)>
 
typedef GroupHandler< NeuronGroupInternalNeuronGroupHandler
 Standard callback type which provides a CodeStream to write platform-independent code for the specified NeuronGroup to. More...
 
typedef GroupHandler< SynapseGroupInternalSynapseGroupHandler
 Standard callback type which provides a CodeStream to write platform-independent code for the specified SynapseGroup to. More...
 
typedef std::function< void(CodeStream &, const NeuronGroupInternal &, Substitutions &, NeuronGroupHandler, NeuronGroupHandler)> NeuronGroupSimHandler
 Callback function type for generation neuron group simulation code. More...
 

Constructor & Destructor Documentation

◆ Backend()

CodeGenerator::CUDA::Backend::Backend ( const KernelBlockSize kernelBlockSizes,
const Preferences preferences,
int  localHostID,
int  device 
)

Member Function Documentation

◆ genAllocateMemPreamble()

void CodeGenerator::CUDA::Backend::genAllocateMemPreamble ( CodeStream os,
const ModelSpecInternal model 
) const
overridevirtual

Allocate memory is the first function in GeNN generated code called by usercode and it should only ever be called once. Therefore it's a good place for any global initialisation. This function generates a 'preamble' to this function.

Implements CodeGenerator::BackendBase.

◆ genCurrentSpikeLikeEventPull()

virtual void CodeGenerator::CUDA::Backend::genCurrentSpikeLikeEventPull ( CodeStream os,
const NeuronGroupInternal ng 
) const
inlineoverridevirtual

◆ genCurrentSpikeLikeEventPush()

virtual void CodeGenerator::CUDA::Backend::genCurrentSpikeLikeEventPush ( CodeStream os,
const NeuronGroupInternal ng 
) const
inlineoverridevirtual

◆ genCurrentTrueSpikePull()

virtual void CodeGenerator::CUDA::Backend::genCurrentTrueSpikePull ( CodeStream os,
const NeuronGroupInternal ng 
) const
inlineoverridevirtual

◆ genCurrentTrueSpikePush()

virtual void CodeGenerator::CUDA::Backend::genCurrentTrueSpikePush ( CodeStream os,
const NeuronGroupInternal ng 
) const
inlineoverridevirtual

◆ genDefinitionsInternalPreamble()

void CodeGenerator::CUDA::Backend::genDefinitionsInternalPreamble ( CodeStream os) const
overridevirtual

Definitions internal is the internal header file for the generated code. This function generates a 'preamble' to this header file.

This will only be included by the platform-specific compiler used to build this backend so can include platform-specific types or headers

Implements CodeGenerator::BackendBase.

◆ genDefinitionsPreamble()

void CodeGenerator::CUDA::Backend::genDefinitionsPreamble ( CodeStream os) const
overridevirtual

Definitions is the usercode-facing header file for the generated code. This function generates a 'preamble' to this header file.

This will be included from a standard C++ compiler so shouldn't include any platform-specific types or headers

Implements CodeGenerator::BackendBase.

◆ genExtraGlobalParamAllocation()

void CodeGenerator::CUDA::Backend::genExtraGlobalParamAllocation ( CodeStream os,
const std::string &  type,
const std::string &  name,
VarLocation  loc 
) const
overridevirtual

◆ genExtraGlobalParamDefinition()

void CodeGenerator::CUDA::Backend::genExtraGlobalParamDefinition ( CodeStream definitions,
const std::string &  type,
const std::string &  name,
VarLocation  loc 
) const
overridevirtual

◆ genExtraGlobalParamImplementation()

void CodeGenerator::CUDA::Backend::genExtraGlobalParamImplementation ( CodeStream os,
const std::string &  type,
const std::string &  name,
VarLocation  loc 
) const
overridevirtual

◆ genExtraGlobalParamPull()

void CodeGenerator::CUDA::Backend::genExtraGlobalParamPull ( CodeStream os,
const std::string &  type,
const std::string &  name 
) const
overridevirtual

◆ genExtraGlobalParamPush()

void CodeGenerator::CUDA::Backend::genExtraGlobalParamPush ( CodeStream os,
const std::string &  type,
const std::string &  name 
) const
overridevirtual

◆ genGlobalRNG()

void CodeGenerator::CUDA::Backend::genGlobalRNG ( CodeStream definitions,
CodeStream definitionsInternal,
CodeStream runner,
CodeStream allocations,
CodeStream free,
const ModelSpecInternal model 
) const
overridevirtual

◆ genInit()

void CodeGenerator::CUDA::Backend::genInit ( CodeStream os,
const ModelSpecInternal model,
NeuronGroupHandler  localNGHandler,
NeuronGroupHandler  remoteNGHandler,
SynapseGroupHandler  sgDenseInitHandler,
SynapseGroupHandler  sgSparseConnectHandler,
SynapseGroupHandler  sgSparseInitHandler 
) const
overridevirtual

◆ genMakefileCompileRule()

void CodeGenerator::CUDA::Backend::genMakefileCompileRule ( std::ostream &  os) const
overridevirtual

The GNU make build system uses 'pattern rules' (https://www.gnu.org/software/make/manual/html_node/Pattern-Intro.html) to build backend modules into objects. This function should generate a GNU make pattern rule capable of building each module (i.e. compiling .cc file $< into .o file $@).

Implements CodeGenerator::BackendBase.

◆ genMakefileLinkRule()

void CodeGenerator::CUDA::Backend::genMakefileLinkRule ( std::ostream &  os) const
overridevirtual

The GNU make build system will populate a variable called with a list of objects to link. This function should generate a GNU make rule to build these objects into a shared library.

Implements CodeGenerator::BackendBase.

◆ genMakefilePreamble()

void CodeGenerator::CUDA::Backend::genMakefilePreamble ( std::ostream &  os) const
overridevirtual

This function can be used to generate a preamble for the GNU makefile used to build.

Implements CodeGenerator::BackendBase.

◆ genMSBuildCompileModule()

void CodeGenerator::CUDA::Backend::genMSBuildCompileModule ( const std::string &  moduleName,
std::ostream &  os 
) const
overridevirtual

◆ genMSBuildConfigProperties()

void CodeGenerator::CUDA::Backend::genMSBuildConfigProperties ( std::ostream &  os) const
overridevirtual

In MSBuild, 'properties' are used to configure global project settings e.g. whether the MSBuild project builds a static or dynamic library This function can be used to add additional XML properties to this section.

see https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-properties for more information.

Implements CodeGenerator::BackendBase.

◆ genMSBuildImportProps()

void CodeGenerator::CUDA::Backend::genMSBuildImportProps ( std::ostream &  os) const
overridevirtual

◆ genMSBuildImportTarget()

void CodeGenerator::CUDA::Backend::genMSBuildImportTarget ( std::ostream &  os) const
overridevirtual

◆ genMSBuildItemDefinitions()

void CodeGenerator::CUDA::Backend::genMSBuildItemDefinitions ( std::ostream &  os) const
overridevirtual

In MSBuild, the 'item definitions' are used to override the default properties of 'items' such as <ClCompile> or <Link>. This function should generate XML to correctly configure the 'items' required to build the generated code, taking into account etc.

see https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-items#item-definitions for more information.

Implements CodeGenerator::BackendBase.

◆ genNeuronUpdate()

void CodeGenerator::CUDA::Backend::genNeuronUpdate ( CodeStream os,
const ModelSpecInternal model,
NeuronGroupSimHandler  simHandler,
NeuronGroupHandler  wuVarUpdateHandler 
) const
overridevirtual

Generate platform-specific function to update the state of all neurons.

Parameters
osCodeStream to write function to
modelmodel to generate code for
simHandlercallback to write platform-independent code to update an individual NeuronGroup
wuVarUpdateHandlercallback to write platform-independent code to update pre and postsynaptic weight update model variables when neuron spikes

Implements CodeGenerator::BackendBase.

◆ genPopulationRNG()

void CodeGenerator::CUDA::Backend::genPopulationRNG ( CodeStream definitions,
CodeStream definitionsInternal,
CodeStream runner,
CodeStream allocations,
CodeStream free,
const std::string &  name,
size_t  count 
) const
overridevirtual

◆ genPopVariableInit()

void CodeGenerator::CUDA::Backend::genPopVariableInit ( CodeStream os,
VarLocation  loc,
const Substitutions kernelSubs,
Handler  handler 
) const
overridevirtual

◆ genRunnerPreamble()

void CodeGenerator::CUDA::Backend::genRunnerPreamble ( CodeStream os) const
overridevirtual

◆ genStepTimeFinalisePreamble()

void CodeGenerator::CUDA::Backend::genStepTimeFinalisePreamble ( CodeStream os,
const ModelSpecInternal model 
) const
overridevirtual

After all timestep logic is complete.

Implements CodeGenerator::BackendBase.

◆ genSynapseUpdate()

void CodeGenerator::CUDA::Backend::genSynapseUpdate ( CodeStream os,
const ModelSpecInternal model,
SynapseGroupHandler  wumThreshHandler,
SynapseGroupHandler  wumSimHandler,
SynapseGroupHandler  wumEventHandler,
SynapseGroupHandler  postLearnHandler,
SynapseGroupHandler  synapseDynamicsHandler 
) const
overridevirtual

Generate platform-specific function to update the state of all synapses.

Parameters
osCodeStream to write function to
modelmodel to generate code for
wumThreshHandlercallback to write platform-independent code to update an individual NeuronGroup
wumSimHandlercallback to write platform-independent code to process presynaptic spikes. "id_pre", "id_post" and "id_syn" variables; and either "addToInSynDelay" or "addToInSyn" function will be provided to callback via Substitutions.
wumEventHandlercallback to write platform-independent code to process presynaptic spike-like events. "id_pre", "id_post" and "id_syn" variables; and either "addToInSynDelay" or "addToInSyn" function will be provided to callback via Substitutions.
postLearnHandlercallback to write platform-independent code to process postsynaptic spikes. "id_pre", "id_post" and "id_syn" variables will be provided to callback via Substitutions.
synapseDynamicsHandlercallback to write platform-independent code to update time-driven synapse dynamics. "id_pre", "id_post" and "id_syn" variables; and either "addToInSynDelay" or "addToInSyn" function will be provided to callback via Substitutions.

Implements CodeGenerator::BackendBase.

◆ genSynapseVariableRowInit()

void CodeGenerator::CUDA::Backend::genSynapseVariableRowInit ( CodeStream os,
VarLocation  loc,
const SynapseGroupInternal sg,
const Substitutions kernelSubs,
Handler  handler 
) const
overridevirtual

◆ genTimer()

void CodeGenerator::CUDA::Backend::genTimer ( CodeStream definitions,
CodeStream definitionsInternal,
CodeStream runner,
CodeStream allocations,
CodeStream free,
CodeStream stepTimeFinalise,
const std::string &  name,
bool  updateInStepTime 
) const
overridevirtual

◆ genVariableAllocation()

void CodeGenerator::CUDA::Backend::genVariableAllocation ( CodeStream os,
const std::string &  type,
const std::string &  name,
VarLocation  loc,
size_t  count 
) const
overridevirtual

◆ genVariableDefinition()

void CodeGenerator::CUDA::Backend::genVariableDefinition ( CodeStream definitions,
CodeStream definitionsInternal,
const std::string &  type,
const std::string &  name,
VarLocation  loc 
) const
overridevirtual

◆ genVariableFree()

void CodeGenerator::CUDA::Backend::genVariableFree ( CodeStream os,
const std::string &  name,
VarLocation  loc 
) const
overridevirtual

◆ genVariableImplementation()

void CodeGenerator::CUDA::Backend::genVariableImplementation ( CodeStream os,
const std::string &  type,
const std::string &  name,
VarLocation  loc 
) const
overridevirtual

◆ genVariableInit()

void CodeGenerator::CUDA::Backend::genVariableInit ( CodeStream os,
VarLocation  loc,
size_t  count,
const std::string &  indexVarName,
const Substitutions kernelSubs,
Handler  handler 
) const
overridevirtual

◆ genVariablePull()

void CodeGenerator::CUDA::Backend::genVariablePull ( CodeStream os,
const std::string &  type,
const std::string &  name,
size_t  count 
) const
overridevirtual

◆ genVariablePush()

void CodeGenerator::CUDA::Backend::genVariablePush ( CodeStream os,
const std::string &  type,
const std::string &  name,
bool  autoInitialized,
size_t  count 
) const
overridevirtual

◆ getChosenCUDADevice()

const cudaDeviceProp& CodeGenerator::CUDA::Backend::getChosenCUDADevice ( ) const
inline

◆ getChosenDeviceID()

int CodeGenerator::CUDA::Backend::getChosenDeviceID ( ) const
inline

◆ getNumPostsynapticUpdateThreads()

size_t CodeGenerator::CUDA::Backend::getNumPostsynapticUpdateThreads ( const SynapseGroupInternal sg)
static

◆ getNumPresynapticUpdateThreads()

size_t CodeGenerator::CUDA::Backend::getNumPresynapticUpdateThreads ( const SynapseGroupInternal sg)
static

◆ getNumSynapseDynamicsThreads()

size_t CodeGenerator::CUDA::Backend::getNumSynapseDynamicsThreads ( const SynapseGroupInternal sg)
static

◆ getNVCCFlags()

std::string CodeGenerator::CUDA::Backend::getNVCCFlags ( ) const

◆ getVarPrefix()

virtual std::string CodeGenerator::CUDA::Backend::getVarPrefix ( ) const
inlineoverridevirtual

When backends require separate 'device' and 'host' versions of variables, they are identified with a prefix. This function returns this prefix so it can be used in otherwise platform-independent code.

Reimplemented from CodeGenerator::BackendBase.

◆ isGlobalRNGRequired()

bool CodeGenerator::CUDA::Backend::isGlobalRNGRequired ( const ModelSpecInternal model) const
overridevirtual

Different backends use different RNGs for different things. Does this one require a global RNG for the specified model?

Implements CodeGenerator::BackendBase.

◆ isPostsynapticRemapRequired()

virtual bool CodeGenerator::CUDA::Backend::isPostsynapticRemapRequired ( ) const
inlineoverridevirtual

◆ isSynRemapRequired()

virtual bool CodeGenerator::CUDA::Backend::isSynRemapRequired ( ) const
inlineoverridevirtual

Member Data Documentation

◆ KernelNames

const char * CodeGenerator::CUDA::Backend::KernelNames
static
Initial value:
= {
"updateNeuronsKernel",
"updatePresynapticKernel",
"updatePostsynapticKernel",
"updateSynapseDynamicsKernel",
"initializeKernel",
"initializeSparseKernel",
"preNeuronResetKernel",
"preSynapseResetKernel"}

The documentation for this class was generated from the following files: