class CodeGenerator::CUDA::Backend

Overview

#include <backend.h>

class Backend: public CodeGenerator::BackendBase
{
public:
    // fields

    static const char* KernelNames[KernelMax];

    // methods

    Backend(
        const KernelBlockSize& kernelBlockSizes,
        const Preferences& preferences,
        int localHostID,
        const std::string& scalarType,
        int device
        );

    virtual void genNeuronUpdate(CodeStream& os, const ModelSpecInternal& model, NeuronGroupSimHandler simHandler, NeuronGroupHandler wuVarUpdateHandler) const;

    virtual void genSynapseUpdate(
        CodeStream& os,
        const ModelSpecInternal& model,
        SynapseGroupHandler wumThreshHandler,
        SynapseGroupHandler wumSimHandler,
        SynapseGroupHandler wumEventHandler,
        SynapseGroupHandler postLearnHandler,
        SynapseGroupHandler synapseDynamicsHandler
        ) const;

    virtual void genInit(
        CodeStream& os,
        const ModelSpecInternal& model,
        NeuronGroupHandler localNGHandler,
        NeuronGroupHandler remoteNGHandler,
        SynapseGroupHandler sgDenseInitHandler,
        SynapseGroupHandler sgSparseConnectHandler,
        SynapseGroupHandler sgSparseInitHandler
        ) const;

    virtual void genDefinitionsPreamble(CodeStream& os) const;
    virtual void genDefinitionsInternalPreamble(CodeStream& os) const;
    virtual void genRunnerPreamble(CodeStream& os) const;
    virtual void genAllocateMemPreamble(CodeStream& os, const ModelSpecInternal& model) const;
    virtual void genStepTimeFinalisePreamble(CodeStream& os, const ModelSpecInternal& model) const;

    virtual void genVariableDefinition(
        CodeStream& definitions,
        CodeStream& definitionsInternal,
        const std::string& type,
        const std::string& name,
        VarLocation loc
        ) const;

    virtual void genVariableImplementation(
        CodeStream& os,
        const std::string& type,
        const std::string& name,
        VarLocation loc
        ) const;

    virtual MemAlloc genVariableAllocation(
        CodeStream& os,
        const std::string& type,
        const std::string& name,
        VarLocation loc,
        size_t count
        ) const;

    virtual void genVariableFree(
        CodeStream& os,
        const std::string& name,
        VarLocation loc
        ) const;

    virtual void genExtraGlobalParamDefinition(
        CodeStream& definitions,
        const std::string& type,
        const std::string& name,
        VarLocation loc
        ) const;

    virtual void genExtraGlobalParamImplementation(
        CodeStream& os,
        const std::string& type,
        const std::string& name,
        VarLocation loc
        ) const;

    virtual void genExtraGlobalParamAllocation(
        CodeStream& os,
        const std::string& type,
        const std::string& name,
        VarLocation loc
        ) const;

    virtual void genExtraGlobalParamPush(
        CodeStream& os,
        const std::string& type,
        const std::string& name,
        VarLocation loc
        ) const;

    virtual void genExtraGlobalParamPull(
        CodeStream& os,
        const std::string& type,
        const std::string& name,
        VarLocation loc
        ) const;

    virtual void genPopVariableInit(
        CodeStream& os,
        VarLocation loc,
        const Substitutions& kernelSubs,
        Handler handler
        ) const;

    virtual void genVariableInit(
        CodeStream& os,
        VarLocation loc,
        size_t count,
        const std::string& indexVarName,
        const Substitutions& kernelSubs,
        Handler handler
        ) const;

    virtual void genSynapseVariableRowInit(
        CodeStream& os,
        VarLocation loc,
        const SynapseGroupInternal& sg,
        const Substitutions& kernelSubs,
        Handler handler
        ) const;

    virtual void genVariablePush(
        CodeStream& os,
        const std::string& type,
        const std::string& name,
        VarLocation loc,
        bool autoInitialized,
        size_t count
        ) const;

    virtual void genVariablePull(
        CodeStream& os,
        const std::string& type,
        const std::string& name,
        VarLocation loc,
        size_t count
        ) const;

    virtual void genCurrentTrueSpikePush(
        CodeStream& os,
        const NeuronGroupInternal& ng
        ) const;

    virtual void genCurrentTrueSpikePull(
        CodeStream& os,
        const NeuronGroupInternal& ng
        ) const;

    virtual void genCurrentSpikeLikeEventPush(
        CodeStream& os,
        const NeuronGroupInternal& ng
        ) const;

    virtual void genCurrentSpikeLikeEventPull(
        CodeStream& os,
        const NeuronGroupInternal& ng
        ) const;

    virtual MemAlloc genGlobalRNG(
        CodeStream& definitions,
        CodeStream& definitionsInternal,
        CodeStream& runner,
        CodeStream& allocations,
        CodeStream& free,
        const ModelSpecInternal& model
        ) const;

    virtual MemAlloc genPopulationRNG(
        CodeStream& definitions,
        CodeStream& definitionsInternal,
        CodeStream& runner,
        CodeStream& allocations,
        CodeStream& free,
        const std::string& name,
        size_t count
        ) const;

    virtual void genTimer(
        CodeStream& definitions,
        CodeStream& definitionsInternal,
        CodeStream& runner,
        CodeStream& allocations,
        CodeStream& free,
        CodeStream& stepTimeFinalise,
        const std::string& name,
        bool updateInStepTime
        ) const;

    virtual void genMakefilePreamble(std::ostream& os) const;
    virtual void genMakefileLinkRule(std::ostream& os) const;
    virtual void genMakefileCompileRule(std::ostream& os) const;
    virtual void genMSBuildConfigProperties(std::ostream& os) const;
    virtual void genMSBuildImportProps(std::ostream& os) const;
    virtual void genMSBuildItemDefinitions(std::ostream& os) const;

    virtual void genMSBuildCompileModule(
        const std::string& moduleName,
        std::ostream& os
        ) const;

    virtual void genMSBuildImportTarget(std::ostream& os) const;
    virtual std::string getVarPrefix() const;
    virtual bool isGlobalRNGRequired(const ModelSpecInternal& model) const;
    virtual bool isSynRemapRequired() const;
    virtual bool isPostsynapticRemapRequired() const;
    virtual size_t getDeviceMemoryBytes() const;
    const cudaDeviceProp& getChosenCUDADevice() const;
    int getChosenDeviceID() const;
    int getRuntimeVersion() const;
    std::string getNVCCFlags() const;
    std::string getFloatAtomicAdd(const std::string& ftype) const;
    size_t getKernelBlockSize(Kernel kernel) const;
    static size_t getNumPresynapticUpdateThreads(const SynapseGroupInternal& sg);
    static size_t getNumPostsynapticUpdateThreads(const SynapseGroupInternal& sg);
    static size_t getNumSynapseDynamicsThreads(const SynapseGroupInternal& sg);
    static void addPresynapticUpdateStrategy(PresynapticUpdateStrategy::Base* strategy);
};

Inherited Members

public:
    // typedefs

    typedef std::function<void(CodeStream&, Substitutions&)> Handler;
    typedef std::function<void(CodeStream&, const T&, Substitutions&)> GroupHandler;
    typedef GroupHandler<NeuronGroupInternal> NeuronGroupHandler;
    typedef GroupHandler<SynapseGroupInternal> SynapseGroupHandler;
    typedef std::function<void(CodeStream&, const NeuronGroupInternal&, Substitutions&, NeuronGroupHandler, NeuronGroupHandler)> NeuronGroupSimHandler;

    // methods

    BackendBase(int localHostID, const std::string& scalarType);
    virtual ~BackendBase();
    virtual void genNeuronUpdate(CodeStream& os, const ModelSpecInternal& model, NeuronGroupSimHandler simHandler, NeuronGroupHandler wuVarUpdateHandler) const = 0;

    virtual void genSynapseUpdate(
        CodeStream& os,
        const ModelSpecInternal& model,
        SynapseGroupHandler wumThreshHandler,
        SynapseGroupHandler wumSimHandler,
        SynapseGroupHandler wumEventHandler,
        SynapseGroupHandler postLearnHandler,
        SynapseGroupHandler synapseDynamicsHandler
        ) const = 0;

    virtual void genInit(
        CodeStream& os,
        const ModelSpecInternal& model,
        NeuronGroupHandler localNGHandler,
        NeuronGroupHandler remoteNGHandler,
        SynapseGroupHandler sgDenseInitHandler,
        SynapseGroupHandler sgSparseConnectHandler,
        SynapseGroupHandler sgSparseInitHandler
        ) const = 0;

    virtual void genDefinitionsPreamble(CodeStream& os) const = 0;
    virtual void genDefinitionsInternalPreamble(CodeStream& os) const = 0;
    virtual void genRunnerPreamble(CodeStream& os) const = 0;
    virtual void genAllocateMemPreamble(CodeStream& os, const ModelSpecInternal& model) const = 0;
    virtual void genStepTimeFinalisePreamble(CodeStream& os, const ModelSpecInternal& model) const = 0;

    virtual void genVariableDefinition(
        CodeStream& definitions,
        CodeStream& definitionsInternal,
        const std::string& type,
        const std::string& name,
        VarLocation loc
        ) const = 0;

    virtual void genVariableImplementation(CodeStream& os, const std::string& type, const std::string& name, VarLocation loc) const = 0;

    virtual MemAlloc genVariableAllocation(
        CodeStream& os,
        const std::string& type,
        const std::string& name,
        VarLocation loc,
        size_t count
        ) const = 0;

    virtual void genVariableFree(CodeStream& os, const std::string& name, VarLocation loc) const = 0;

    virtual void genExtraGlobalParamDefinition(
        CodeStream& definitions,
        const std::string& type,
        const std::string& name,
        VarLocation loc
        ) const = 0;

    virtual void genExtraGlobalParamImplementation(CodeStream& os, const std::string& type, const std::string& name, VarLocation loc) const = 0;
    virtual void genExtraGlobalParamAllocation(CodeStream& os, const std::string& type, const std::string& name, VarLocation loc) const = 0;
    virtual void genExtraGlobalParamPush(CodeStream& os, const std::string& type, const std::string& name, VarLocation loc) const = 0;
    virtual void genExtraGlobalParamPull(CodeStream& os, const std::string& type, const std::string& name, VarLocation loc) const = 0;
    virtual void genPopVariableInit(CodeStream& os, VarLocation loc, const Substitutions& kernelSubs, Handler handler) const = 0;

    virtual void genVariableInit(
        CodeStream& os,
        VarLocation loc,
        size_t count,
        const std::string& indexVarName,
        const Substitutions& kernelSubs,
        Handler handler
        ) const = 0;

    virtual void genSynapseVariableRowInit(CodeStream& os, VarLocation loc, const SynapseGroupInternal& sg, const Substitutions& kernelSubs, Handler handler) const = 0;

    virtual void genVariablePush(
        CodeStream& os,
        const std::string& type,
        const std::string& name,
        VarLocation loc,
        bool autoInitialized,
        size_t count
        ) const = 0;

    virtual void genVariablePull(
        CodeStream& os,
        const std::string& type,
        const std::string& name,
        VarLocation loc,
        size_t count
        ) const = 0;

    virtual void genCurrentTrueSpikePush(CodeStream& os, const NeuronGroupInternal& ng) const = 0;
    virtual void genCurrentTrueSpikePull(CodeStream& os, const NeuronGroupInternal& ng) const = 0;
    virtual void genCurrentSpikeLikeEventPush(CodeStream& os, const NeuronGroupInternal& ng) const = 0;
    virtual void genCurrentSpikeLikeEventPull(CodeStream& os, const NeuronGroupInternal& ng) const = 0;

    virtual MemAlloc genGlobalRNG(
        CodeStream& definitions,
        CodeStream& definitionsInternal,
        CodeStream& runner,
        CodeStream& allocations,
        CodeStream& free,
        const ModelSpecInternal& model
        ) const = 0;

    virtual MemAlloc genPopulationRNG(
        CodeStream& definitions,
        CodeStream& definitionsInternal,
        CodeStream& runner,
        CodeStream& allocations,
        CodeStream& free,
        const std::string& name,
        size_t count
        ) const = 0;

    virtual void genTimer(
        CodeStream& definitions,
        CodeStream& definitionsInternal,
        CodeStream& runner,
        CodeStream& allocations,
        CodeStream& free,
        CodeStream& stepTimeFinalise,
        const std::string& name,
        bool updateInStepTime
        ) const = 0;

    virtual void genMakefilePreamble(std::ostream& os) const = 0;
    virtual void genMakefileLinkRule(std::ostream& os) const = 0;
    virtual void genMakefileCompileRule(std::ostream& os) const = 0;
    virtual void genMSBuildConfigProperties(std::ostream& os) const = 0;
    virtual void genMSBuildImportProps(std::ostream& os) const = 0;
    virtual void genMSBuildItemDefinitions(std::ostream& os) const = 0;
    virtual void genMSBuildCompileModule(const std::string& moduleName, std::ostream& os) const = 0;
    virtual void genMSBuildImportTarget(std::ostream& os) const = 0;
    virtual std::string getVarPrefix() const;
    virtual bool isGlobalRNGRequired(const ModelSpecInternal& model) const = 0;
    virtual bool isSynRemapRequired() const = 0;
    virtual bool isPostsynapticRemapRequired() const = 0;
    virtual size_t getDeviceMemoryBytes() const = 0;

    void genVariablePushPull(
        CodeStream& push,
        CodeStream& pull,
        const std::string& type,
        const std::string& name,
        VarLocation loc,
        bool autoInitialized,
        size_t count
        ) const;

    MemAlloc 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;

    void genScalar(
        CodeStream& definitions,
        CodeStream& definitionsInternal,
        CodeStream& runner,
        const std::string& type,
        const std::string& name,
        VarLocation loc
        ) const;

    int getLocalHostID() const;

Detailed Documentation

Methods

virtual void genNeuronUpdate(
    CodeStream& os,
    const ModelSpecInternal& model,
    NeuronGroupSimHandler simHandler,
    NeuronGroupHandler wuVarUpdateHandler
    ) const

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

Parameters:

os CodeStream to write function to
model model to generate code for
simHandler callback to write platform-independent code to update an individual NeuronGroup
wuVarUpdateHandler callback to write platform-independent code to update pre and postsynaptic weight update model variables when neuron spikes
virtual void genSynapseUpdate(
    CodeStream& os,
    const ModelSpecInternal& model,
    SynapseGroupHandler wumThreshHandler,
    SynapseGroupHandler wumSimHandler,
    SynapseGroupHandler wumEventHandler,
    SynapseGroupHandler postLearnHandler,
    SynapseGroupHandler synapseDynamicsHandler
    ) const

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

Parameters:

os CodeStream to write function to
model model to generate code for
wumThreshHandler callback to write platform-independent code to update an individual NeuronGroup
wumSimHandler callback 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.
wumEventHandler callback 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.
postLearnHandler callback to write platform-independent code to process postsynaptic spikes. “id_pre”, “id_post” and “id_syn” variables will be provided to callback via Substitutions.
synapseDynamicsHandler callback 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.
virtual void genDefinitionsPreamble(CodeStream& os) const

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

virtual void genDefinitionsInternalPreamble(CodeStream& os) const

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

virtual void genAllocateMemPreamble(CodeStream& os, const ModelSpecInternal& model) const

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.

virtual void genStepTimeFinalisePreamble(CodeStream& os, const ModelSpecInternal& model) const

After all timestep logic is complete.

virtual void genMakefilePreamble(std::ostream& os) const

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

virtual void genMakefileLinkRule(std::ostream& os) const

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.

virtual void genMakefileCompileRule(std::ostream& os) const

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 $@).

virtual void genMSBuildConfigProperties(std::ostream& os) const

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.

virtual void genMSBuildItemDefinitions(std::ostream& os) const

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.

virtual std::string getVarPrefix() const

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.

virtual bool isGlobalRNGRequired(const ModelSpecInternal& model) const

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

virtual size_t getDeviceMemoryBytes() const

How many bytes of memory does ‘device’ have.

static void addPresynapticUpdateStrategy(PresynapticUpdateStrategy::Base* strategy)

Register a new presynaptic update strategy.

This function should be called with strategies in ascending order of preference