This documentation is for a development version. Click here for the latest stable release (v2.1.0).
Frequently asked questions¶
How do I add a new kernel?¶
When you make a new Nengo neuron type or learning rule, it’s unlikely that NengoOCL will know how to simulate it. To teach NengoOCL how to simulate it, you have to write an OpenCL kernel.
A good starting point for this
is to look at the existing kernels
and study one that is similar
to the kernel you wish to add.
For each kernel, you’ll see
that there are a lot of arguments that go in.
Essentially, they’re all lists
of different aspects of the input ragged arrays.
When we’re doing computations with ragged arrays,
essentially we want to write kernels
that can take in a list of arrays of different sizes,
and perform the operation on each one of those arrays.
Let’s take the BCM kernel as an example.
It gets arguments
these are lists of the
.shape for each output.
Then we have
these give the strides along axis 0
and a pointer to where the data starts
for each array in the
pre ragged array.
pre_data is the buffer itself.
Then we have similar things for the
post ragged array,
Finally, there’s a list of the alphas (learning rates)
for all the different operators.
So each of these lists will be of length N,
where N is the number of
that we’ve combined into this single kernel.
Then there’s the kernel itself.
It starts by getting ids, as is typical with OpenCL kernels.
k is the index of which array
we’re treating right now (0 <= k < N),
so we use it to index into all of the input lists.
ij tells the kernel which individual element to treat.
We split it into
j (row and column indices),
and then this kernel computes element (i, j) of the output (