ArrayViews and VariableViews
The ArrayView and VariableView structures have been adapted to the C# ‘ref’ features.
This renders explicit Load and Store methods obsolete.
In addition, all methods that accept VariableView<X> parameter types have been adapted to the parameter types ref X.
This applies, for example, to all methods of the class Atomic.
class ...
{
static void ...(...)
{
// Old way (obsolete and no longer supported)
ArrayView<int> someView = ...
var variableView = someView.GetVariableView(X);
Atomic.Add(variableView);
...
variableView.Store(42);
// New way
ArrayView<int> someView = ...
Atomic.Add(ref someView[X]);
...
someView[X] = 42;
// or
ref var variable = ref someView[X];
variable = 42;
// or
var variableView = someView.GetVariableView(X);
variableView.Value = 42;
}
}
Shared Memory
The general concept of shared memory has been redesigned.
The previous model required SharedMemoryAttribute attributes on specific parameters that should be allocated in shared
memory.
The new model uses the static class SharedMemory to allocate this kind of memory procedurally in the scope of kernels.
This simplifies programming, kernel-delegate creation and enables non-kernel methods to allocate their own pool of
shared memory.
Note that array lengths must be constants in this ILGPU version. Hence, a dynamic allocation of shared memory is currently not supported.
The kernel loader methods LoadSharedMemoryKernelX and LoadSharedMemoryStreamKernelX have been removed.
They are no longer required, since a kernel does not have to declare its shared memory allocations in the form of
additional parameters.
class ...
{
static void SharedMemoryKernel(GroupedIndex index, ...)
{
// Allocate an array of 32 integers
ArrayView<int> sharedMemoryArray = SharedMemory.Allocate<int>(32);
// Allocate a single variable of type long in shared memory
ref long sharedMemoryVariable = ref SharedMemory.Allocate<long>();
...
}
}
CPU Debugging
Starting a kernel in debug mode is a common task that developers go through many times a day.
Although ILGPU has been optimized for performance, you may not wait a few milliseconds every time you start your program
to debug a kernel on the CPU.
For this reason, the context flag ContextFlags.SkipCPUCodeGeneration has been added.
It suppresses IR code generation for CPU kernels and uses the .Net runtime directly.
Warning: This avoids general kernel analysis/verification checks. It should only be used by experienced users.
Internals
The old LLVM-based concept of CompileUnit objects is obsolete and has been replaced by a completely new IR.
The new IR leverages IRContext objects to manage IR objects that are derived from the class ILGPU.IR.Node.
Unlike previous versions, an IRContext is not tied to a specific Backend instance and can be reused accross
different hardware architectures.
The global optimization process can be controlled with the enumeration OptimizationLevel.
This level can be specified by passing the desired level to the ILGPU.Context constructor.
If the optimization level is not explicitly specified, the level is determined by the current build mode (either Debug
or Release).
Help us make these docs great!
All ILGPU docs are open source. See something that's wrong or unclear? Submit a pull request.
Make a contribution