12 #include <cuda_runtime.h> 84 std::fill(manualBlockSizes.begin(), manualBlockSizes.end(), 32);
88 bool showPtxInfo =
false;
94 unsigned int manualDeviceID = 0;
103 std::string userNvccFlags =
"";
128 virtual void genDefinitionsPreamble(
CodeStream &os)
const override;
129 virtual void genDefinitionsInternalPreamble(
CodeStream &os)
const override;
130 virtual void genRunnerPreamble(
CodeStream &os)
const override;
134 virtual void genVariableDefinition(
CodeStream &definitions,
CodeStream &definitionsInternal,
const std::string &type,
const std::string &name,
VarLocation loc)
const override;
135 virtual void genVariableImplementation(
CodeStream &os,
const std::string &type,
const std::string &name,
VarLocation loc)
const override;
136 virtual void genVariableAllocation(
CodeStream &os,
const std::string &type,
const std::string &name,
VarLocation loc,
size_t count)
const override;
137 virtual void genVariableFree(
CodeStream &os,
const std::string &name,
VarLocation loc)
const override;
139 virtual void genExtraGlobalParamDefinition(
CodeStream &definitions,
const std::string &type,
const std::string &name,
VarLocation loc)
const override;
140 virtual void genExtraGlobalParamImplementation(
CodeStream &os,
const std::string &type,
const std::string &name,
VarLocation loc)
const override;
141 virtual void genExtraGlobalParamAllocation(
CodeStream &os,
const std::string &type,
const std::string &name,
VarLocation loc)
const override;
142 virtual void genExtraGlobalParamPush(
CodeStream &os,
const std::string &type,
const std::string &name)
const override;
143 virtual void genExtraGlobalParamPull(
CodeStream &os,
const std::string &type,
const std::string &name)
const override;
146 virtual void genVariableInit(
CodeStream &os,
VarLocation loc,
size_t count,
const std::string &indexVarName,
151 virtual void genVariablePush(
CodeStream &os,
const std::string &type,
const std::string &name,
bool autoInitialized,
size_t count)
const override;
152 virtual void genVariablePull(
CodeStream &os,
const std::string &type,
const std::string &name,
size_t count)
const override;
155 genCurrentSpikePush(os, ng,
false);
159 genCurrentSpikePull(os, ng,
false);
163 genCurrentSpikePush(os, ng,
true);
167 genCurrentSpikePull(os, ng,
true);
172 const std::string &name,
size_t count)
const override;
174 CodeStream &stepTimeFinalise,
const std::string &name,
bool updateInStepTime)
const override;
176 virtual void genMakefilePreamble(std::ostream &os)
const override;
177 virtual void genMakefileLinkRule(std::ostream &os)
const override;
178 virtual void genMakefileCompileRule(std::ostream &os)
const override;
180 virtual void genMSBuildConfigProperties(std::ostream &os)
const override;
181 virtual void genMSBuildImportProps(std::ostream &os)
const override;
182 virtual void genMSBuildItemDefinitions(std::ostream &os)
const override;
183 virtual void genMSBuildCompileModule(
const std::string &moduleName, std::ostream &os)
const override;
184 virtual void genMSBuildImportTarget(std::ostream &os)
const override;
197 std::string getNVCCFlags()
const;
216 using GetPaddedGroupSizeFunc = std::function<size_t(const T&)>;
219 using FilterGroupFunc = std::function<bool(const T&)>;
225 void genParallelGroup(
CodeStream &os,
const Substitutions &kernelSubs,
const std::map<std::string, T> &groups,
size_t &idStart,
226 GetPaddedGroupSizeFunc<T> getPaddedSizeFunc,
227 FilterGroupFunc<T> filter,
231 for (
const auto &g : groups) {
234 if(filter(g.second)) {
235 const size_t paddedSize = getPaddedSizeFunc(g.second);
237 os <<
"// " << g.first << std::endl;
245 os <<
"if(id >= " << idStart <<
" && id < " << idStart + paddedSize <<
")" <<
CodeStream::OB(1);
246 os <<
"const unsigned int lid = id - " << idStart <<
";" << std::endl;
250 handler(os, g.second, popSubs);
252 idStart += paddedSize;
259 void genParallelGroup(
CodeStream &os,
const Substitutions &kernelSubs,
const std::map<std::string, T> &groups,
size_t &idStart,
260 GetPaddedGroupSizeFunc<T> getPaddedSizeFunc,
263 genParallelGroup<T>(os, kernelSubs, groups, idStart, getPaddedSizeFunc,
264 [](
const T&){
return true; }, handler);
277 void genKernelDimensions(
CodeStream &os,
Kernel kernel,
size_t numThreads)
const;
283 std::string getFloatAtomicAdd(
const std::string &ftype)
const;
291 const int m_ChosenDeviceID;
292 cudaDeviceProp m_ChosenDevice;
294 int m_RuntimeVersion;
virtual void genCurrentSpikeLikeEventPush(CodeStream &os, const NeuronGroupInternal &ng) const override
Definition: genn_cuda_backend/backend.h:161
Definition: neuronGroupInternal.h:9
A close bracket marker.
Definition: codeStream.h:82
virtual void genCurrentTrueSpikePush(CodeStream &os, const NeuronGroupInternal &ng) const override
Definition: genn_cuda_backend/backend.h:153
VarLocation
< Flags defining which memory space variables should be allocated in
Definition: variableMode.h:10
Definition: genn_cuda_backend/backend.h:63
int getChosenDeviceID() const
Definition: genn_cuda_backend/backend.h:196
virtual std::string getVarPrefix() const override
Definition: genn_cuda_backend/backend.h:186
Pick device with most global memory.
Pick optimal device based on how well kernels can be simultaneously simulated and occupancy...
BlockSizeSelect
Methods for selecting CUDA kernel block size.
Definition: genn_cuda_backend/backend.h:47
An open bracket marker.
Definition: codeStream.h:69
Base class for backend preferences - can be accessed via a global in 'classic' C++ code generator...
Definition: backendBase.h:33
Definition: genn_cuda_backend/backend.h:65
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
std::array< size_t, KernelMax > KernelBlockSize
Array of block sizes for each kernel.
Definition: genn_cuda_backend/backend.h:74
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
Use device specified by user.
Definition: synapseGroupInternal.h:9
virtual void genCurrentSpikeLikeEventPull(CodeStream &os, const NeuronGroupInternal &ng) const override
Definition: genn_cuda_backend/backend.h:165
Definition: codeStream.h:19
#define BACKEND_EXPORT
Definition: backendExport.h:13
Definition: substitutions.h:19
void addVarSubstitution(const std::string &source, const std::string &destionation, bool allowOverride=false)
Definition: substitutions.h:39
Definition: genn_cuda_backend/backend.h:59
Definition: genn_cuda_backend/backend.h:60
Definition: backendBase.h:54
Definition: genn_cuda_backend/backend.h:66
Definition: genn_cuda_backend/backend.h:109
Definition: genn_cuda_backend/backend.h:61
Definition: genn_cuda_backend/backend.h:67
virtual bool isSynRemapRequired() const override
Definition: genn_cuda_backend/backend.h:189
Preferences for CUDA backend.
Definition: genn_cuda_backend/backend.h:80
Definition: genn_cuda_backend/backend.h:62
Definition: modelSpecInternal.h:10
Preferences()
Definition: genn_cuda_backend/backend.h:82
Definition: genn_cuda_backend/backend.h:64
Definition: generateAll.h:18
std::function< void(CodeStream &, const T &, Substitutions &)> GroupHandler
Definition: backendBase.h:63
DeviceSelect
Methods for selecting CUDA device.
Definition: genn_cuda_backend/backend.h:36
Kernel
Kernels generated by CUDA backend.
Definition: genn_cuda_backend/backend.h:57
Pick optimal blocksize for each kernel based on occupancy.
virtual bool isPostsynapticRemapRequired() const override
Definition: genn_cuda_backend/backend.h:190
KernelBlockSize manualBlockSizes
If block size select method is set to BlockSizeSelect::MANUAL, block size to use for each kernel...
Definition: genn_cuda_backend/backend.h:100
virtual void genCurrentTrueSpikePull(CodeStream &os, const NeuronGroupInternal &ng) const override
Definition: genn_cuda_backend/backend.h:157
const cudaDeviceProp & getChosenCUDADevice() const
Definition: genn_cuda_backend/backend.h:195
std::function< void(CodeStream &, Substitutions &)> Handler
Definition: backendBase.h:60