コード例 #1
0
        /// <summary>
        /// Adds general backend optimizations.
        /// </summary>
        /// <param name="builder">The transformation manager to populate.</param>
        /// <param name="acceleratorSpecializer">
        /// An instance of an <see cref="AcceleratorSpecializer"/> class.
        /// </param>
        /// <param name="level">The desired optimization level.</param>
        public static void AddBackendOptimizations(
            this Transformer.Builder builder,
            AcceleratorSpecializer acceleratorSpecializer,
            OptimizationLevel level)
        {
            // Specialize accelerator properties and views
            builder.Add(new LowerArrays());
            builder.Add(new LowerPointerViews());
            builder.Add(acceleratorSpecializer);

            // Lower structures
            if (level > OptimizationLevel.O1)
            {
                builder.Add(new LowerStructures());
            }

            // Apply final DCE phase in release mode
            if (level > OptimizationLevel.O0)
            {
                builder.Add(new DeadCodeElimination());
            }

            // Append further backend specific transformations in release mode
            builder.Add(new Inliner());
            if (level > OptimizationLevel.O0)
            {
                builder.Add(new SimplifyControlFlow());
            }
        }
コード例 #2
0
 /// <summary>
 /// Constructs a new data instance.
 /// </summary>
 public SpecializerData(
     AcceleratorSpecializer specializer,
     IRContext context)
 {
     Specializer = specializer;
     Context     = context;
 }
コード例 #3
0
        /// <summary>
        /// Adds general backend optimizations.
        /// </summary>
        /// <param name="builder">The transformation manager to populate.</param>
        /// <param name="acceleratorSpecializer">
        /// An instance of an <see cref="AcceleratorSpecializer"/> class.
        /// </param>
        /// <param name="inliningMode">The inlining mode to use.</param>
        /// <param name="level">The desired optimization level.</param>
        public static void AddBackendOptimizations(
            this Transformer.Builder builder,
            AcceleratorSpecializer acceleratorSpecializer,
            InliningMode inliningMode,
            OptimizationLevel level)
        {
            // Specialize accelerator properties, arrays and views
            builder.Add(new LowerArrays(MemoryAddressSpace.Local));
            builder.Add(new LowerPointerViews());
            builder.Add(acceleratorSpecializer);

            // Perform an additional inlining pass to specialize small device-specific
            // functions that could have been introduced
            if (inliningMode != InliningMode.Disabled)
            {
                builder.Add(new Inliner());
            }

            // Skip further optimizations in debug mode
            if (level < OptimizationLevel.O1)
            {
                return;
            }

            // Use experimental address-space specializer in O2 only
            if (level > OptimizationLevel.O1)
            {
                // Specialize all parameter address spaces
                builder.Add(new InferKernelAddressSpaces(MemoryAddressSpace.Global));
            }

            // Lower all value structures that could have been created during the
            // following passes:
            // LowerArrays, LowerPointerViews, AcceleratorSpecializer and
            // AddressSpaceSpecializer
            builder.Add(new LowerStructures());

            // Apply DCE phase in release mode to remove all dead values that
            // could be created in prior passes
            builder.Add(new DeadCodeElimination());

            // Converts local memory arrays into compile-time known structures
            builder.Add(new SSAStructureConstruction());

            // Infer all specialized address spaces
            if (level > OptimizationLevel.O1)
            {
                builder.Add(new InferLocalAddressSpaces());
            }
            else
            {
                builder.Add(new InferAddressSpaces());
            }

            // Final cleanup phases to improve performance
            builder.Add(new CleanupBlocks());
            builder.Add(new SimplifyControlFlow());
        }
コード例 #4
0
 /// <summary>
 /// Constructs a new data instance.
 /// </summary>
 public SpecializerData(
     AcceleratorSpecializer specializer,
     IRContext context,
     List <Value> toImplement)
 {
     ToImplement = toImplement;
     Specializer = specializer;
     Context     = context;
 }
コード例 #5
0
 /// <summary>
 /// Specializes warp size values.
 /// </summary>
 private static void Specialize(
     RewriterContext context,
     AcceleratorSpecializer specializer,
     WarpSizeValue value)
 {
     if (!specializer.WarpSize.HasValue)
     {
         return;
     }
     Specialize(context, value, specializer.WarpSize.Value);
 }
コード例 #6
0
        /// <summary>
        /// Specializes native pointer casts.
        /// </summary>
        private static void Specialize(
            RewriterContext context,
            AcceleratorSpecializer specializer,
            IntAsPointerCast value)
        {
            var convert = context.Builder.CreateConvert(
                value.Location,
                value.Value,
                specializer.IntPointerType);

            context.ReplaceAndRemove(value, convert);
        }
コード例 #7
0
        /// <summary>
        /// Adds general backend optimizations.
        /// </summary>
        /// <param name="builder">The transformation manager to populate.</param>
        /// <param name="acceleratorSpecializer">
        /// An instance of an <see cref="AcceleratorSpecializer"/> class.
        /// </param>
        /// <param name="level">The desired optimization level.</param>
        public static void AddBackendOptimizations(
            this Transformer.Builder builder,
            AcceleratorSpecializer acceleratorSpecializer,
            OptimizationLevel level)
        {
            // Specialize accelerator properties and views
            builder.Add(new LowerArrays());
            builder.Add(new LowerPointerViews());
            builder.Add(acceleratorSpecializer);

            // Specialize all parameter address spaces
            if (level > OptimizationLevel.O1)
            {
                builder.Add(new AddressSpaceSpecializer(MemoryAddressSpace.Global));
            }

            // Lower structures
            if (level > OptimizationLevel.O1)
            {
                builder.Add(new LowerStructures());
            }

            // Apply DCE phase in release mode
            if (level > OptimizationLevel.O0)
            {
                builder.Add(new DeadCodeElimination());
            }

            // Infer all specialized address spaces
            if (level > OptimizationLevel.O1)
            {
                builder.Add(new InferAddressSpaces());
            }

            // Append further backend specific transformations in O2 and O1 mode
            builder.Add(new Inliner());
            if (level > OptimizationLevel.O1)
            {
                builder.Add(new CleanupBlocks());
                builder.Add(new SimplifyControlFlow());
                builder.Add(new DeadCodeElimination());
            }
            else if (level > OptimizationLevel.O0)
            {
                builder.Add(new SimplifyControlFlow());
            }
        }
コード例 #8
0
        /// <summary>
        /// Adds general backend optimizations.
        /// </summary>
        /// <param name="builder">The transformation manager to populate.</param>
        /// <param name="acceleratorSpecializer">
        /// An instance of an <see cref="AcceleratorSpecializer"/> class.
        /// </param>
        /// <param name="contextFlags">The context flags.</param>
        /// <param name="level">The desired optimization level.</param>
        public static void AddBackendOptimizations(
            this Transformer.Builder builder,
            AcceleratorSpecializer acceleratorSpecializer,
            ContextFlags contextFlags,
            OptimizationLevel level)
        {
            // Specialize accelerator properties and views
            builder.Add(new LowerPointerViews());
            builder.Add(acceleratorSpecializer);

            // Perform an additional inlining pass to specialize small device-specific
            // functions that could have been introduced
            if (!contextFlags.HasFlags(ContextFlags.NoInlining))
            {
                builder.Add(new Inliner());
            }

            // Skip further optimizations in debug mode
            if (level < OptimizationLevel.O1)
            {
                return;
            }

            // Use experimental address-space specializer in O2 only
            if (level > OptimizationLevel.O1)
            {
                // Specialize all parameter address spaces
                builder.Add(new AddressSpaceSpecializer(MemoryAddressSpace.Global));
            }

            // Lower all value structures that could have been created during the
            // following passes:
            // LowerPointerViews, AcceleratorSpecializer and AddressSpaceSpecializer
            builder.Add(new LowerStructures());

            // Apply DCE phase in release mode to remove all dead values that
            // could be created in prior passes
            builder.Add(new DeadCodeElimination());

            // Infer all specialized address spaces
            builder.Add(new InferAddressSpaces());

            // Final cleanup phases to improve performance
            builder.Add(new CleanupBlocks());
            builder.Add(new SimplifyControlFlow());
        }
コード例 #9
0
ファイル: Optimizer.cs プロジェクト: Costigan/ILGPU
        /// <summary>
        /// Adds general backend optimizations.
        /// </summary>
        /// <param name="builder">The transformation manager to populate.</param>
        /// <param name="acceleratorSpecializer">
        /// An instance of an <see cref="AcceleratorSpecializer"/> class.
        /// </param>
        /// <param name="level">The desired optimization level.</param>
        public static void AddBackendOptimizations(
            this Transformer.Builder builder,
            AcceleratorSpecializer acceleratorSpecializer,
            OptimizationLevel level)
        {
            // Specialize accelerator properties and views
            builder.Add(new LowerArrays());
            builder.Add(new LowerPointerViews());
            builder.Add(acceleratorSpecializer);

            // Lower structures
            if (level > OptimizationLevel.O1)
            {
                builder.Add(new LowerStructures());
                builder.Add(new DeadCodeElimination());
            }
        }
コード例 #10
0
        /// <summary>
        /// Specializes int to native pointer casts.
        /// </summary>
        private static void Specialize(
            RewriterContext context,
            AcceleratorSpecializer specializer,
            IntAsPointerCast value)
        {
            // Convert from int -> native int type -> pointer
            var builder = context.Builder;

            // int -> native int type
            var convertToNativeInt = builder.CreateConvert(
                value.Location,
                value.Value,
                specializer.IntPointerType);

            // native int type -> pointer
            var convert = builder.CreateIntAsPointerCast(
                value.Location,
                convertToNativeInt);

            context.ReplaceAndRemove(value, convert);
        }
コード例 #11
0
        /// <summary>
        /// Specializes native pointer to int casts.
        /// </summary>
        private static void Specialize(
            RewriterContext context,
            AcceleratorSpecializer specializer,
            PointerAsIntCast value)
        {
            // Convert from ptr -> native int type -> desired int type
            var builder = context.Builder;

            // ptr -> native int type
            var convertToNativeType = builder.CreatePointerAsIntCast(
                value.Location,
                value.Value,
                specializer.IntPointerType.BasicValueType);

            // native int type -> desired int type
            var convert = builder.CreateConvert(
                value.Location,
                convertToNativeType,
                value.TargetType);

            context.ReplaceAndRemove(value, convert);
        }
コード例 #12
0
 /// <summary>
 /// Specializes accelerator-type values.
 /// </summary>
 private static void Specialize(
     RewriterContext context,
     AcceleratorSpecializer specializer,
     AcceleratorTypeValue value) =>
 Specialize(context, value, (int)specializer.AcceleratorType);
コード例 #13
0
 /// <summary>
 /// Returns true if we have to adjust the source cast operation.
 /// </summary>
 private static bool CanSpecialize(
     AcceleratorSpecializer specializer,
     IntAsPointerCast value) =>
 value.SourceType != specializer.IntPointerType;
コード例 #14
0
 /// <summary>
 /// Specializes IO output operations via the instance method
 /// <see cref="Specialize(in RewriterContext, WriteToOutput)"/> of the parent
 /// <paramref name="specializer"/> instance.
 /// </summary>
 private static void Specialize(
     RewriterContext context,
     AcceleratorSpecializer specializer,
     WriteToOutput value) =>
 specializer.Specialize(context, value);
コード例 #15
0
 /// <summary>
 /// Returns true if we have to adjust the source cast operation.
 /// </summary>
 private static bool CanSpecialize(
     AcceleratorSpecializer specializer,
     PointerAsIntCast value) =>
 value.TargetType != specializer.IntPointerType;
コード例 #16
0
ファイル: Optimizer.cs プロジェクト: jgiannuzzi/ILGPU
        /// <summary>
        /// Adds general backend optimizations.
        /// </summary>
        /// <param name="builder">The transformation manager to populate.</param>
        /// <param name="acceleratorSpecializer">
        /// An instance of an <see cref="AcceleratorSpecializer"/> class.
        /// </param>
        /// <param name="inliningMode">The inlining mode to use.</param>
        /// <param name="level">The desired optimization level.</param>
        public static void AddBackendOptimizations <TPlacementStrategy>(
            this Transformer.Builder builder,
            AcceleratorSpecializer acceleratorSpecializer,
            InliningMode inliningMode,
            OptimizationLevel level)
            where TPlacementStrategy : struct, CodePlacement.IPlacementStrategy
        {
            // Specialize accelerator properties, arrays and views
            builder.Add(new LowerArrays(MemoryAddressSpace.Local));
            builder.Add(new LowerPointerViews());
            builder.Add(acceleratorSpecializer);

            // Perform an additional inlining pass to specialize small device-specific
            // functions that could have been introduced
            if (inliningMode != InliningMode.Disabled)
            {
                builder.Add(new Inliner());
            }

            // Apply UCE and DCE passes to avoid dead branches and fold conditionals that
            // do not affect the actual code being executed
            builder.Add(new UnreachableCodeElimination());
            builder.Add(new DeadCodeElimination());

            // Skip further optimizations in debug mode
            if (level < OptimizationLevel.O1)
            {
                return;
            }

            // Use experimental address-space specializer in O2 only
            if (level > OptimizationLevel.O1)
            {
                // Specialize all parameter address spaces
                builder.Add(new InferKernelAddressSpaces(MemoryAddressSpace.Global));
            }

            // Lower all value structures that could have been created during the
            // following passes:
            // LowerArrays, LowerPointerViews, AcceleratorSpecializer and
            // AddressSpaceSpecializer
            builder.Add(new LowerStructures());

            // Apply UCE and DCE phases in release mode to remove all dead values and
            // branches that could be have been created in prior passes
            builder.Add(new UnreachableCodeElimination());
            builder.Add(new DeadCodeElimination());

            // Converts local memory arrays into compile-time known structures
            builder.Add(new SSAStructureConstruction());

            // Infer all specialized address spaces
            if (level > OptimizationLevel.O1)
            {
                builder.Add(new InferLocalAddressSpaces());
            }
            else
            {
                builder.Add(new InferAddressSpaces());
            }

            // Final cleanup phases to improve performance
            builder.Add(new CleanupBlocks());
            builder.Add(new SimplifyControlFlow());

            if (level > OptimizationLevel.O1)
            {
                // Add additional code placement optimizations to reduce register
                // pressure and improve performance
                builder.Add(new DeadCodeElimination());
                builder.Add(new CodePlacement <TPlacementStrategy>(
                                CodePlacementMode.Aggressive));
                builder.Add(new LoopInvariantCodeMotion());
            }
        }