/// <summary>
        /// Creates a new instance of an atomic reduction handler using the provided
        /// shuffle-down and reduction logics.
        /// </summary>
        /// <typeparam name="T">The underlying type of the reduction.</typeparam>
        /// <typeparam name="TShuffleDown">The type of the shuffle logic.</typeparam>
        /// <typeparam name="TReduction">The type of the reduction logic.</typeparam>
        /// <param name="accelerator">The accelerator.</param>
        /// <param name="shuffleDown">The shuffle logic.</param>
        /// <param name="reduction">The reduction logic.</param>
        /// <returns>The created reduction handler.</returns>
        public static AtomicReduction <T> CreateAtomicReduction <T, TShuffleDown, TReduction>(
            this Accelerator accelerator,
            TShuffleDown shuffleDown,
            TReduction reduction)
            where T : struct
            where TShuffleDown : struct, IShuffleDown <T>
            where TReduction : struct, IAtomicReduction <T>
        {
            var reductionDel = accelerator.CreateAtomicReduction <T, TShuffleDown, TReduction>();

            return((stream, input, output) =>
            {
                reductionDel(stream, input, output, shuffleDown, reduction);
            });
        }
 /// <summary>
 /// Performs a reduction using an atomic reduction logic.
 /// </summary>
 /// <typeparam name="T">The underlying type of the reduction.</typeparam>
 /// <typeparam name="TShuffleDown">The type of the shuffle logic.</typeparam>
 /// <typeparam name="TReduction">The type of the reduction logic.</typeparam>
 /// <param name="accelerator">The accelerator.</param>
 /// <param name="stream">The accelerator stream.</param>
 /// <param name="input">The input elements to reduce.</param>
 /// <param name="output">The output view to store the reduced value.</param>
 /// <param name="shuffleDown">The shuffle logic.</param>
 /// <param name="reduction">The reduction logic.</param>
 public static void AtomicReduce <T, TShuffleDown, TReduction>(
     this Accelerator accelerator,
     AcceleratorStream stream,
     ArrayView <T> input,
     ArrayView <T> output,
     TShuffleDown shuffleDown,
     TReduction reduction)
     where T : struct
     where TShuffleDown : struct, IShuffleDown <T>
     where TReduction : struct, IAtomicReduction <T>
 {
     accelerator.CreateAtomicReduction <T, TShuffleDown, TReduction>()(
         stream,
         input,
         output,
         shuffleDown,
         reduction);
 }