HuberLossCpuFallback
public static void FallbackGuide()
Language: C#
Documentation: CPU fallback and compatibility
CPU-Only Usage:
var loss_fn = new HuberLoss(delta: 1.0f, gpuOps: null);
float loss = await loss_fn.ComputeLossAsync(cpu_tensor1, cpu_tensor2);
This uses the built-in CPU implementation (see ComputeLossAsync method).
Mixed Device Usage:
// TorchSharp backend detects device automatically
var backend = new TorchSharpBackend();
var loss_fn = new HuberLoss(delta: 1.0f, gpuOps: backend as IGpuMathOps);
// Works on both CPU and GPU tensors:
float loss = await loss_fn.ComputeLossAsync(any_tensor1, any_tensor2);
Fallback Logic (in ComputeLossAsync):
if (_gpuOps != null && tensor.DataType == Float32)
use GPU path (AbsAsync, WhereAsync, etc.)
else
use CPU path (native C# loops)
Performance:
GPU path: O(n) single operation (no loop overhead)
CPU path: O(n) with C# loop and Math.Abs, Math.Min conditionals
For large batches (n > 1000): GPU is significantly faster
For small batches (n < 100): CPU might be faster due to overhead