Beispiel #1
0
        /// <summary>
        /// Registers all PTX intrinsics with the given manager.
        /// </summary>
        /// <param name="manager">The target implementation manager.</param>
        public static void Register(IntrinsicImplementationManager manager)
        {
            // Register atomics
            manager.RegisterGenericAtomic(
                AtomicKind.Add,
                BasicValueType.Float64,
                CreateIntrinsic(
                    nameof(AtomicAddF64),
                    IntrinsicImplementationMode.Redirect,
                    null,
                    PTXArchitecture.SM_53));

            // Register broadcasts
            manager.RegisterBroadcast(
                BroadcastKind.GroupLevel,
                CreateIntrinsic(
                    nameof(GroupBroadcast),
                    IntrinsicImplementationMode.Redirect));
            manager.RegisterBroadcast(
                BroadcastKind.WarpLevel,
                CreateIntrinsic(
                    nameof(WarpBroadcast),
                    IntrinsicImplementationMode.Redirect));

            // Register assert support
            manager.RegisterDebug(
                DebugKind.AssertFailed,
                CreateIntrinsic(
                    nameof(AssertFailed),
                    IntrinsicImplementationMode.Redirect));

            // Register shuffles
            RegisterWarpShuffles(manager);
        }
Beispiel #2
0
 /// <summary>
 /// Registers all PTX intrinsics with the given manager.
 /// </summary>
 /// <param name="manager">The target implementation manager.</param>
 public static void Register(IntrinsicImplementationManager manager)
 {
     RegisterAtomics(manager);
     RegisterBroadcasts(manager);
     RegisterWarpShuffles(manager);
     RegisterFP16(manager);
     RegisterBitFunctions(manager);
 }
Beispiel #3
0
 /// <summary>
 /// Registers all atomic intrinsics with the given manager.
 /// </summary>
 /// <param name="manager">The target implementation manager.</param>
 private static void RegisterAtomics(IntrinsicImplementationManager manager) =>
 manager.RegisterGenericAtomic(
     AtomicKind.Add,
     BasicValueType.Float64,
     CreateIntrinsic(
         nameof(AtomicAddF64),
         IntrinsicImplementationMode.Redirect,
         null,
         CudaArchitecture.SM_60));
Beispiel #4
0
        /// <summary>
        /// Registers an intrinsic mapping.
        /// </summary>
        /// <param name="manager">The current manager.</param>
        /// <param name="sourceType">The source type.</param>
        /// <param name="targetType">The target type.</param>
        /// <param name="name">The method name to register.</param>
        private static void RegisterIntrinsicMapping(
            IntrinsicImplementationManager manager,
            Type sourceType,
            Type targetType,
            string name)
        {
            var sourceMethod = sourceType.GetMethod(name, AlgorithmContext.IntrinsicBindingFlags);

            manager.RegisterMethod(
                sourceMethod,
                new ILIntrinsic(targetType, name, IntrinsicImplementationMode.Redirect));
        }
Beispiel #5
0
        /// <summary>
        /// Constructs a new ILGPU main context
        /// </summary>
        /// <param name="optimizationLevel">The optimization level.</param>
        /// <param name="flags">The context flags.</param>
        public Context(ContextFlags flags, OptimizationLevel optimizationLevel)
        {
            // Enable debug information automatically when a debugger is attached
            if (Debugger.IsAttached)
            {
                flags |= DefaultDebug;
            }

            InstanceId        = InstanceId.CreateNew();
            OptimizationLevel = optimizationLevel;
            Flags             = flags.Prepare();
            TargetPlatform    = Backend.RuntimePlatform;
            RuntimeSystem     = new RuntimeSystem();

            // Initialize enhanced PTX backend feature flags
            if (optimizationLevel > OptimizationLevel.O1 &&
                !Flags.HasFlags(ContextFlags.DefaultPTXBackendFeatures))
            {
                Flags |= ContextFlags.EnhancedPTXBackendFeatures;
            }

            // Initialize verifier
            Verifier = flags.HasFlags(ContextFlags.EnableVerifier)
                ? Verifier.Instance
                : Verifier.Empty;

            // Initialize main contexts
            TypeContext = new IRTypeContext(this);
            IRContext   = new IRContext(this);

            // Create frontend
            DebugInformationManager frontendDebugInformationManager =
                HasFlags(ContextFlags.EnableDebugSymbols)
                ? DebugInformationManager
                : null;

            ILFrontend = HasFlags(ContextFlags.EnableParallelCodeGenerationInFrontend)
                ? new ILFrontend(this, frontendDebugInformationManager)
                : new ILFrontend(this, frontendDebugInformationManager, 1);

            // Create default IL backend
            DefautltILBackend = new DefaultILBackend(this);

            // Initialize default transformer
            ContextTransformer = Optimizer.CreateTransformer(
                OptimizationLevel,
                TransformerConfiguration.Transformed,
                Flags);

            // Intrinsics
            IntrinsicManager = new IntrinsicImplementationManager();
            InitIntrinsics();
        }
Beispiel #6
0
        /// <summary>
        /// Registers an intrinsic mapping using a code generator.
        /// </summary>
        /// <param name="manager">The current manager.</param>
        /// <param name="sourceType">The source type.</param>
        /// <param name="targetType">The target type.</param>
        /// <param name="name">The method name to register.</param>
        /// <param name="codeGeneratorName">The name of the code generator to register.</param>
        private static void RegisterIntrinsicCodeGenerator(
            IntrinsicImplementationManager manager,
            Type sourceType,
            Type targetType,
            string name,
            string codeGeneratorName)
        {
            var sourceMethod = sourceType.GetMethod(name, AlgorithmContext.IntrinsicBindingFlags);

            manager.RegisterMethod(
                sourceMethod,
                new CLIntrinsic(targetType, codeGeneratorName, IntrinsicImplementationMode.GenerateCode));
        }
Beispiel #7
0
 /// <summary>
 /// Registers all broadcast intrinsics with the given manager.
 /// </summary>
 /// <param name="manager">The target implementation manager.</param>
 private static void RegisterBroadcasts(
     IntrinsicImplementationManager manager)
 {
     manager.RegisterBroadcast(
         BroadcastKind.GroupLevel,
         CreateIntrinsic(
             nameof(GroupBroadcast),
             IntrinsicImplementationMode.Redirect));
     manager.RegisterBroadcast(
         BroadcastKind.WarpLevel,
         CreateIntrinsic(
             nameof(WarpBroadcast),
             IntrinsicImplementationMode.Redirect));
 }
Beispiel #8
0
        /// <summary>
        /// Registers all PTX intrinsics with the given manager.
        /// </summary>
        /// <param name="manager">The target implementation manager.</param>
        public static void Register(IntrinsicImplementationManager manager)
        {
            RegisterAtomics(manager);
            RegisterBroadcasts(manager);
            RegisterWarpShuffles(manager);
            RegisterFP16(manager);
            RegisterBitFunctions(manager);

            // Register assert support
            manager.RegisterDebug(
                DebugKind.AssertFailed,
                CreateIntrinsic(
                    nameof(AssertFailed),
                    IntrinsicImplementationMode.Redirect));
        }
Beispiel #9
0
 /// <summary>
 /// Registers all CL intrinsics with the given manager.
 /// </summary>
 /// <param name="manager">The target implementation manager.</param>
 public static void Register(IntrinsicImplementationManager manager)
 {
     // Atomics
     manager.RegisterGenericAtomic(
         AtomicKind.Add,
         BasicValueType.Float32,
         CreateIntrinsic(
             nameof(AtomicAddF32),
             IntrinsicImplementationMode.Redirect));
     manager.RegisterGenericAtomic(
         AtomicKind.Add,
         BasicValueType.Float64,
         CreateIntrinsic(
             nameof(AtomicAddF64),
             IntrinsicImplementationMode.Redirect));
 }
Beispiel #10
0
 /// <summary>
 /// Registers an XMath replacement mapping using a code generator.
 /// </summary>
 /// <param name="manager">The current manager.</param>
 /// <param name="targetType">The target type.</param>
 /// <param name="functionName">The method name to register.</param>
 /// <param name="codeGeneratorName">
 /// The name of the code generator to register.
 /// </param>
 /// <param name="types">The argument types for the target method.</param>
 private static void RegisterXMathCodeGenerator(
     IntrinsicImplementationManager manager,
     Type targetType,
     string functionName,
     string codeGeneratorName,
     params Type[] types)
 {
     manager.RegisterMethod(
         AlgorithmContext.XMathType.GetMethod(
             functionName,
             AlgorithmContext.IntrinsicBindingFlags,
             null,
             types,
             null),
         new CLIntrinsic(
             targetType,
             codeGeneratorName,
             IntrinsicImplementationMode.GenerateCode));
 }
Beispiel #11
0
 /// <summary>
 /// Registers an XMath replacement mapping using a redirect.
 /// </summary>
 /// <param name="manager">The current manager.</param>
 /// <param name="targetType">The target type.</param>
 /// <param name="functionName">The method name to register.</param>
 /// <param name="replacementName">
 /// The name of the replacement method to register.
 /// </param>
 /// <param name="types">The argument types for the target method.</param>
 private static void RegisterXMathRedirect(
     IntrinsicImplementationManager manager,
     Type targetType,
     string functionName,
     string replacementName,
     params Type[] types)
 {
     manager.RegisterMethod(
         AlgorithmContext.XMathType.GetMethod(
             functionName,
             AlgorithmContext.IntrinsicBindingFlags,
             null,
             types,
             null),
         new PTXIntrinsic(
             targetType.GetMethod(
                 replacementName,
                 AlgorithmContext.IntrinsicBindingFlags,
                 null,
                 types,
                 null),
             IntrinsicImplementationMode.Redirect));
 }
Beispiel #12
0
        /// <summary>
        /// Registers all CL intrinsics with the given manager.
        /// </summary>
        /// <param name="manager">The target implementation manager.</param>
        public static void Register(IntrinsicImplementationManager manager)
        {
            // Atomics
            manager.RegisterGenericAtomic(
                AtomicKind.Add,
                BasicValueType.Float32,
                CreateIntrinsic(
                    nameof(AtomicAddF32),
                    IntrinsicImplementationMode.Redirect));
            manager.RegisterGenericAtomic(
                AtomicKind.Add,
                BasicValueType.Float64,
                CreateIntrinsic(
                    nameof(AtomicAddF64),
                    IntrinsicImplementationMode.Redirect));

            // Group
            manager.RegisterPredicateBarrier(
                PredicateBarrierKind.PopCount,
                CreateIntrinsic(
                    nameof(BarrierPopCount),
                    IntrinsicImplementationMode.Redirect));
        }
Beispiel #13
0
        /// <summary>
        /// Registers all PTX intrinsics with the given manager.
        /// </summary>
        /// <param name="manager">The target implementation manager.</param>
        public static void Register(IntrinsicImplementationManager manager)
        {
            RegisterAtomics(manager);
            RegisterBroadcasts(manager);
            RegisterWarpShuffles(manager);
            RegisterFP16(manager);

            // Register assert support
            manager.RegisterDebug(
                DebugKind.AssertFailed,
                CreateIntrinsic(
                    nameof(AssertFailed),
                    IntrinsicImplementationMode.Redirect));

            // Register math
            manager.RegisterUnaryArithmetic(
                UnaryArithmeticKind.TanhF,
                BasicValueType.Float32,
                CreateIntrinsic(
                    nameof(Tanh),
                    IntrinsicImplementationMode.GenerateCode,
                    null,
                    PTXArchitecture.SM_80));
        }