/// <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); }
/// <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); }
/// <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));
/// <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)); }
/// <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(); }
/// <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)); }
/// <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)); }
/// <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)); }
/// <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)); }
/// <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)); }
/// <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)); }
/// <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)); }
/// <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)); }