The Challenge of Distributed Computing
Imagine you need to render an animated film, process millions of documents, or train a machine learning model. Your single computer would take weeks. The obvious solution — use multiple machines working together — introduces extraordinary complexity:
- Network communication — How do machines talk to each other?
- Task partitioning — How do you divide the work fairly?
- Load balancing — How do you prevent fast machines from sitting idle?
- Failure handling — What happens when a machine crashes mid-task?
- Hardware diversity — How do you handle different CPUs, GPUs, and operating systems?
Traditional approaches require months of infrastructure work before any actual computation begins.
WitEngine eliminates this complexity.
The Intelligent Orchestrator
WitEngine acts as an intelligent orchestrator — you describe what you want to compute, and it figures out how to distribute it efficiently. Just as a taxi dispatcher assigns cars based on location and traffic, WitEngine assigns tasks based on machine capabilities, current load, and performance characteristics.
From Complex Infrastructure to Simple Scripts
Without WitEngine, distributing work across machines requires:
❌ Setting up message queues (RabbitMQ, Kafka)
❌ Implementing worker processes with health monitoring
❌ Building a custom task scheduler
❌ Handling serialization for complex data
❌ Managing partial failures and retries
❌ Months of development and testingWith WitEngine:
Job:ProcessDataset(ItemCollection:items)
{
~ Distribute the work across all available machines ~
ResultCollection:results = Grid.ForEach(item in items)
=> Processor.Process(item);
Report:summary = Report.Aggregate(results);
}The Grid.ForEach call handles everything: finding available machines, dividing the work based on performance, sending data, collecting results, and handling failures.
Smart Distribution with Benchmarks
One of WitEngine's core innovations is benchmark-based load distribution. When a machine joins the cluster, it runs a standardized benchmark that measures its computational capabilities. This score becomes the basis for intelligent task allocation.
How It Works
Consider an office with diverse hardware:
| Machine | Type | Benchmark Score | Tasks Assigned |
|---|---|---|---|
| Developer Workstation | 32-core, 128GB RAM | 850 | 42% |
| Designer Mac | M2 Pro | 620 | 31% |
| Office Laptop | i5, 16GB RAM | 340 | 17% |
| Old Desktop | i3, 8GB RAM | 200 | 10% |
When you submit a job with 1000 tasks, WitEngine doesn't split them equally (250 per machine). Instead, it distributes proportionally:
- Developer Workstation: 420 tasks
- Designer Mac: 310 tasks
- Office Laptop: 170 tasks
- Old Desktop: 100 tasks
The result? All machines finish at approximately the same time. No powerful machine sits idle waiting for slower ones to complete.
Dynamic Rebalancing
Benchmarks aren't static. WitEngine continuously monitors actual performance:
- If a machine performs better than expected, it receives more work
- If a machine slows down (thermal throttling, competing processes), work is redistributed
- If a machine goes offline, its pending tasks are automatically reassigned
This ensures optimal utilization even as conditions change throughout a long-running job.
Two Distribution Strategies
WitEngine offers two strategies optimized for different workload patterns:
Balanced Strategy (Push Model) — Work is divided upfront based on benchmark scores. Each node receives its full batch immediately. Best for predictable tasks with consistent execution times.
Queued Strategy (Pull Model) — Nodes pull tasks from a shared queue as they complete previous work. Faster nodes automatically do more. Best for variable execution times or unpredictable workloads.
ProcessingOptions:opts = ProcessingOptions.Create("Queued");
Results:r = Grid.ForEach(item in items, opts) => Process(item);Core Design Principles
Pattern-Based Distribution
WitEngine is built on a fundamental insight: most distributed workloads follow predictable patterns. Whether you're rendering frames, processing files, or running simulations:
- Take a collection of inputs
- Apply the same operation to each input
- Collect the outputs
WitEngine provides primitives that capture these patterns, handling all complexity behind the scenes.
Fault Tolerance
When a machine fails during processing:
- Its incomplete tasks are automatically reassigned
- No manual intervention required
- Results are never lost
- The job continues without interruption
Heterogeneous Support
WitEngine is a low-level .NET library and runs wherever .NET runs — it carries no platform lock-in of its own. A single cluster can mix machines freely: different operating systems and architectures, with or without a GPU, across LAN, WAN or cloud. Each machine contributes what it can — servers, workstations and laptops alike, each receiving work proportional to its capabilities — and WitEngine orchestrates them into a unified computational resource.
Key Features
| Feature | Description |
|---|---|
| Simple Scripting | Intuitive DSL for defining distributed jobs |
| Benchmark-Based Distribution | Automatic workload allocation based on machine performance |
| Auto-Discovery | Machines automatically find and join the cluster |
| Heterogeneous Support | Works across different hardware and operating systems |
| Plugin Architecture | Extend with custom activities and data types |
| Real-time Monitoring | Progress tracking, pause/resume/cancel, event handlers |
| Fault Tolerance | Automatic task reassignment on failures |
| Type-Safe Serialization | MemoryPack binary format for fast, safe data transfer |
Controllers, activities, and scripts
WitEngine is built on a modular plugin system where everything is a plugin — even built-in functionality comes from controllers. Custom types and operations are first-class citizens.
Each controller contributes two things:
- Variables — data types usable in scripts (e.g.,
Int,Matrix,Image). - Activities — operations on that data (e.g.,
Int.Add,Matrix.Multiply,Image.Resize).
Built-in controllers include primitives (Int, String, Bool), control flow (If, Loop, ForEach), distributed computing (Grid.ForEach), and linear algebra (Matrix, Vector).
Scripts compose activities into processes
Activities are the building blocks; scripts wire them together into a process — a single job that runs across the cluster. The activities in one script can come from different controllers written by different authors: one author's activity, another's, a third's, composed into a single pipeline.
That's what makes the platform compositional rather than fixed. You extend it in two ways — write a new controller to add activities (a genuinely new capability), or write a new script to compose existing activities into a new operation, with no low-level code. A script can turn activities that already exist into something none of them did alone, and every controller added to the ecosystem increases what every script can express.
An activity doesn't have to be pure computation: a controller can wrap a piece of equipment — a camera, a motor, a display — so the same scripts that coordinate computation can drive and sequence physical hardware into one automated process.
Capability-Based Node Selection
Not every node can run every task. Activities can declare hardware requirements:
[RequiresCpu(MinLogicalCores = 8)]
[RequiresMemory(MinRamMb = 16384)]
[RequiresGpu(MinVRamMb = 8192, Features = GpuFeatures.Cuda)]
public class WitActivityTrainModel : WitActivityTransform { }The orchestrator automatically filters nodes based on:
- OS — Platform, version
- CPU — Architecture, core count
- Memory — Available RAM
- GPU — Type, VRAM, features (CUDA, OpenCL, Metal)
- Custom properties — User-defined capabilities
Only compatible nodes receive the work.
Where WitEngine sits
WitEngine is the execution core of OmnibusCloud — one platform built in three layers. WitEngine provides the distributed-computing foundation; WitCloud is the deployable server an organization installs on its own hardware; OmnibusCloud is that server opened to the internet as a public network.
WitEngine is the foundation, and this page is about that layer: the scripting language, distributed execution, the benchmark system and fault tolerance. WitCloud builds on it with device enrollment, scheduling and monitoring for a private cluster. OmnibusCloud is the same server opened to the internet — the portal where projects are published and people join with their machines, launching as crowdcomputing. WitEngine can be licensed independently.
Use Cases
- Rendering & Animation — Distribute frame rendering across hundreds of machines
- Scientific Computing — Run simulations at scale without supercomputer access
- Data Processing — Process massive datasets in parallel
- Machine Learning — Distribute training across available resources
- Build Systems — Parallelize compilation across developer machines
- Batch Processing — Process thousands of files simultaneously
Getting Started
WitEngine is the core of the OmnibusCloud platform. The engine itself is proprietary and can be licensed independently; the controllers and SDK are open, so you can extend the platform with new kinds of work.
For developers:
- Explore the open controllers and SDK: github.com/OmnibusCloud — sample controllers and a public SDK for building and debugging your own extensions.
- Documentation and guides: omnibuscloud.io.
The SDK lets you build a controller, test its distributed behavior locally, and deploy it to a private WitCloud cluster or the public OmnibusCloud network.
Let's build the ultracomputer together!