Browse Source

Use tensor multiplication for Bokeh kernels

pull/3161/head
James Jackson-South 3 weeks ago
parent
commit
43d99b46dc
  1. 11
      src/ImageSharp/Processing/Processors/Convolution/Parameters/BokehBlurKernelDataProvider.cs

11
src/ImageSharp/Processing/Processors/Convolution/Parameters/BokehBlurKernelDataProvider.cs

@ -5,6 +5,7 @@ using System.Collections.Concurrent;
using System.Numerics; using System.Numerics;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using SixLabors.ImageSharp.Common.Helpers;
namespace SixLabors.ImageSharp.Processing.Processors.Convolution.Parameters; namespace SixLabors.ImageSharp.Processing.Processors.Convolution.Parameters;
@ -209,13 +210,11 @@ internal static class BokehBlurKernelDataProvider
for (int i = 0; i < kernelsSpan.Length; i++) for (int i = 0; i < kernelsSpan.Length; i++)
{ {
ref Complex64[] kernelsRef = ref Unsafe.Add(ref baseKernelsRef, (uint)i); ref Complex64[] kernelsRef = ref Unsafe.Add(ref baseKernelsRef, (uint)i);
int length = kernelsRef.Length;
ref Complex64 valueRef = ref MemoryMarshal.GetArrayDataReference(kernelsRef);
for (int j = 0; j < length; j++) // Complex64 stores each value as adjacent real and imaginary floats. Multiplying that flattened
{ // float span scales both parts independently, which is exactly complex multiplication by a real scalar.
Unsafe.Add(ref valueRef, (uint)j) *= scalar; Span<float> values = MemoryMarshal.Cast<Complex64, float>(kernelsRef);
} TensorPrimitives_.Multiply(values, scalar, values);
} }
} }
} }

Loading…
Cancel
Save