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