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.
| Capability | C0-microSD | C0-microSD+ |
|---|---|---|
| Maximum representation precision | Athens-16 | Athens-64 |
| In-flight distributions at Athens-8 | 600 | 4312 |
| In-flight distributions at maximum precision | 288 (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
| Feature | Short Description | Status |
|---|---|---|
newlib-io-float | Formats and parses floating-point values in the printf and scanf families. | Enabled |
newlib-fvwrite-in-streamio | Provides the vector buffer mechanism behind C stream buffering, which setbuf and setvbuf rely on. | Enabled |
newlib-fseek-optimization | Optimizes fseek, at some cost in the code size of an application that calls it. | Enabled |
newlib-wide-orient | Tracks whether each stream is byte-oriented or wide-oriented, as C99 requires. | Enabled |
newlib-unbuf-stream-opt | Optimizes fprintf to an unbuffered file, using a temporary buffer that adds about BUFSIZ bytes of stack. | Enabled |
newlib-io-c99-formats | Supports the C99 format specifiers in the printf and scanf families. | Disabled |
newlib-io-pos-args | Supports positional arguments in the printf family, such as %1$s. | Disabled |
newlib-io-long-long | Supports the long long type in the printf and scanf families. | Disabled |
newlib-io-long-double | Supports the long double type in the printf and scanf families. | Disabled |
newlib-nano-formatted-io | Uses a size-reduced implementation of the non-wide formatted I/O functions, limited to C89. | Disabled |
Memory allocation
| Feature | Short Description | Status |
|---|---|---|
newlib-nano-malloc | Uses the nano-malloc implementation, written for systems with very limited memory. | Disabled |
malloc-debugging | Builds the allocator with malloc debugging. | Disabled |
Reentrancy and threads
| Feature | Short Description | Status |
|---|---|---|
newlib-reent-small | Uses a small struct _reent, which lowers the memory the library reserves for reentrancy state. | Enabled |
newlib-multithread | Supports multiple threads. | Enabled |
newlib-global-atexit | Holds 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-streams | Holds the stdio FILE objects globally instead of in struct _reent. | Disabled |
Character set conversion
| Feature | Short Description | Status |
|---|---|---|
newlib-mb | Supports multibyte characters. | Disabled |
newlib-iconv | Provides the iconv character set conversion library. | Disabled |
newlib-iconv-encodings | Builds in a chosen list of encodings that iconv converts in both directions. | Disabled |
newlib-iconv-from-encodings | Builds in a chosen list of encodings that iconv converts from. | Disabled |
newlib-iconv-to-encodings | Builds in a chosen list of encodings that iconv converts to. | Disabled |
newlib-iconv-external-ccs | Loads character set conversion tables for iconv from external CCS files. | Disabled |
Program startup and exit
| Feature | Short Description | Status |
|---|---|---|
newlib-atexit-dynamic-alloc | Allocates atexit entries as they are registered, rather than from a fixed table. | Enabled |
newlib-register-fini | Registers the finalization function through atexit. | Disabled |
lite-exit | Uses lite exit, a size-reduced exit that does not run _fini or global destructors. | Disabled |
Other build options
| Feature | Short Description | Status |
|---|---|---|
newlib-supplied-syscalls | Supplies the syscalls from newlib. | Enabled |
newlib-long-time_t | Defines 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-level | Selects 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
- To learn how to write distribution-extended programs to run on the compute modules, take a look at the C0-microSD and C0-microSD+ UxHw application development guides.
- To understand how the host and the module share the work across the coprocessor lifecycle, read Operational Model (C0-microSD) and Operational Model (C0-microSD+).
- To understand how the physical link carries every transaction between the host and the module, read SD Interface (C0-microSD) and SD Interface (C0-microSD+).