Skip to main content

UxHw Distribution Arithmetic in Silicon

Every Signaloid compute module performs distribution arithmetic in hardware using UxHw. Instead of computing with single-point values, UxHw performs computations with distributions as values. With UxHw, distribution arithmetic propagates distributions through your program automatically. The result of each intermediate operation is a distribution.

On-module execution

You can use the Signaloid System-on-Chip (SoC) on the compute modules to deploy C or C++ applications. The Signaloid SoC is a RISC-V core extended with a subset of Signaloid UxHw which enables distribution-extended computation. When the application performs arithmetic on values with associated distributions, the hardware uses the input distribution representations through the computation. With UxHw, you do not manage samples manually or run repeated trials. A single UxHw execution produces the output distribution.

The detailed technical specifications of the compute modules, including the specific core, the clock frequency, and the memory available to your device application are in Specifications (C0-microSD) and Specifications (C0-microSD+).

Distribution representation

The Athens microarchitecture of UxHw represents each distribution using a number of floating-point values. The amount of these representation values is bounded by the representation precision. Larger representations track finer distributional detail at the cost of larger memory usage. The modules differ in the precision they support, and in how many distributions they keep in flight at once.

CapabilityC0-microSDC0-microSD+
Maximum representation precisionAthens-16Athens-64
In-flight distributions at Athens-86004312
In-flight distributions at maximum precision288 (Athens-16)476 (Athens-64)

The minimum representation precision that the C0-microSD and C0-microSD+ support is Athens-4. See UxHw capabilities (C0-microSD) and UxHw capabilities (C0-microSD+) in the specifications.

Distributions on the C0-microSD and the C0-microSD+ modules use a single-precision floating-point underlying data type. The Signaloid toolchain selects this when it builds for a module, irrespective of floating-point types your source code declares. See here for more details about the underlying data type.

The compute modules calculate the output distribution in a single execution and can achieve large speedups over Monte Carlo methods of equivalent accuracy. See the C0-microSD benchmarks, the C0-microSD+ benchmarks, and the Examples and Demos catalog.

The C standard library

We have compiled newlib 4.1.0 with the following fixed options.

Formatted input and output

FeatureShort DescriptionStatus
newlib-io-floatFormats and parses floating-point values in the printf and scanf families.Enabled
newlib-fvwrite-in-streamioProvides the vector buffer mechanism behind C stream buffering, which setbuf and setvbuf rely on.Enabled
newlib-fseek-optimizationOptimizes fseek, at some cost in the code size of an application that calls it.Enabled
newlib-wide-orientTracks whether each stream is byte-oriented or wide-oriented, as C99 requires.Enabled
newlib-unbuf-stream-optOptimizes fprintf to an unbuffered file, using a temporary buffer that adds about BUFSIZ bytes of stack.Enabled
newlib-io-c99-formatsSupports the C99 format specifiers in the printf and scanf families.Disabled
newlib-io-pos-argsSupports positional arguments in the printf family, such as %1$s.Disabled
newlib-io-long-longSupports the long long type in the printf and scanf families.Disabled
newlib-io-long-doubleSupports the long double type in the printf and scanf families.Disabled
newlib-nano-formatted-ioUses a size-reduced implementation of the non-wide formatted I/O functions, limited to C89.Disabled

Memory allocation

FeatureShort DescriptionStatus
newlib-nano-mallocUses the nano-malloc implementation, written for systems with very limited memory.Disabled
malloc-debuggingBuilds the allocator with malloc debugging.Disabled

Reentrancy and threads

FeatureShort DescriptionStatus
newlib-reent-smallUses a small struct _reent, which lowers the memory the library reserves for reentrancy state.Enabled
newlib-multithreadSupports multiple threads.Enabled
newlib-global-atexitHolds the atexit data in a global variable instead of in struct _reent, so it can be garbage collected when atexit is unused.Disabled
newlib-global-stdio-streamsHolds the stdio FILE objects globally instead of in struct _reent.Disabled

Character set conversion

FeatureShort DescriptionStatus
newlib-mbSupports multibyte characters.Disabled
newlib-iconvProvides the iconv character set conversion library.Disabled
newlib-iconv-encodingsBuilds in a chosen list of encodings that iconv converts in both directions.Disabled
newlib-iconv-from-encodingsBuilds in a chosen list of encodings that iconv converts from.Disabled
newlib-iconv-to-encodingsBuilds in a chosen list of encodings that iconv converts to.Disabled
newlib-iconv-external-ccsLoads character set conversion tables for iconv from external CCS files.Disabled

Program startup and exit

FeatureShort DescriptionStatus
newlib-atexit-dynamic-allocAllocates atexit entries as they are registered, rather than from a fixed table.Enabled
newlib-register-finiRegisters the finalization function through atexit.Disabled
lite-exitUses lite exit, a size-reduced exit that does not run _fini or global destructors.Disabled

Other build options

FeatureShort DescriptionStatus
newlib-supplied-syscallsSupplies the syscalls from newlib.Enabled
newlib-long-time_tDefines time_t as long instead of as a signed 64-bit integer. Where long is 32 bits wide, that brings the year 2038 problem.Disabled
newlib-elix-levelSelects the EL/IX library level, 1 to 4.Level 0

For the library itself, see the newlib documentation.

Relation to the Signaloid Cloud Compute Engine

The on-module Signaloid SoC and the Signaloid Cloud Compute Engine share the same UxHw programming model. You can write the same distribution-extended programs and the distributions propagate the same way. The two substrates differ in capacity, performance, and transport. The Cloud Compute Engine runs at data-center scale on the Signaloid Cloud Developer Platform, while a compute module brings UxHw to an embedded system over its own host interface. For the cloud and web API side of the same technology, see the Compute Engine documentation.

Next steps