Esempio n. 1
0
 /// <summary>
 /// Creates a new CPU accelerator.
 /// </summary>
 /// <param name="context">The ILGPU context.</param>
 /// <param name="cpuDeviceIndex">
 /// The relative device index for the CPU device. 0 here refers to the first
 /// CPU device, 1 to the second, etc.
 /// </param>
 /// <param name="mode">The CPU accelerator mode.</param>
 /// <param name="threadPriority">
 /// The thread priority of the execution threads.
 /// </param>
 /// <returns>The created CPU accelerator.</returns>
 public static CPUAccelerator CreateCPUAccelerator(
     this Context context,
     int cpuDeviceIndex,
     CPUAcceleratorMode mode,
     ThreadPriority threadPriority) =>
 context.GetCPUDevice(cpuDeviceIndex)
 .CreateCPUAccelerator(context, mode, threadPriority);
Esempio n. 2
0
        /// <summary>
        /// Constructs a new CPU runtime.
        /// </summary>
        /// <param name="context">The ILGPU context.</param>
        /// <param name="numThreadsPerWarp">
        /// The number of threads per group for parallel processing.
        /// </param>
        /// <param name="numWarpsPerMultiprocessor">
        /// The number of warps per multiprocessor.
        /// </param>
        /// <param name="numMultiprocessors">
        /// The number of multiprocessors (number of parallel groups) to simulate.
        /// </param>
        /// <param name="mode">The current accelerator mode.</param>
        /// <param name="threadPriority">
        /// The thread priority of the execution threads.
        /// </param>
        public CPUAccelerator(
            Context context,
            int numThreadsPerWarp,
            int numWarpsPerMultiprocessor,
            int numMultiprocessors,
            CPUAcceleratorMode mode,
            ThreadPriority threadPriority)
            : base(context, AcceleratorType.CPU)
        {
            if (numThreadsPerWarp < 2 || !Utilities.IsPowerOf2(numWarpsPerMultiprocessor))
            {
                throw new ArgumentOutOfRangeException(nameof(numThreadsPerWarp));
            }
            if (numWarpsPerMultiprocessor < 1)
            {
                throw new ArgumentOutOfRangeException(nameof(numWarpsPerMultiprocessor));
            }
            if (numMultiprocessors < 1)
            {
                throw new ArgumentOutOfRangeException(nameof(numMultiprocessors));
            }

            // Check for existing limitations with respect to barrier participants
            if (numThreadsPerWarp * numWarpsPerMultiprocessor > short.MaxValue)
            {
                throw new ArgumentOutOfRangeException(nameof(numWarpsPerMultiprocessor));
            }
            if (NumMultiprocessors > short.MaxValue)
            {
                throw new ArgumentOutOfRangeException(nameof(numMultiprocessors));
            }

            NativePtr                      = new IntPtr(1);
            WarpSize                       = numThreadsPerWarp;
            MaxNumThreadsPerGroup          = numThreadsPerWarp * numWarpsPerMultiprocessor;
            MaxNumThreadsPerMultiprocessor = MaxNumThreadsPerGroup;
            NumMultiprocessors             = numMultiprocessors;
            MaxGroupSize                   = new Index3(
                MaxNumThreadsPerGroup,
                MaxNumThreadsPerGroup,
                MaxNumThreadsPerGroup);

            MemorySize              = long.MaxValue;
            MaxGridSize             = new Index3(int.MaxValue, int.MaxValue, int.MaxValue);
            MaxSharedMemoryPerGroup = int.MaxValue;
            MaxConstantMemory       = int.MaxValue;

            DefaultStream = CreateStream();
            Name          = nameof(CPUAccelerator);

            NumThreads = MaxNumThreads * numMultiprocessors;
            Mode       = mode;
            UsesSequentialExecution =
                Mode == CPUAcceleratorMode.Sequential ||
                Mode == CPUAcceleratorMode.Auto && Debugger.IsAttached;

            Bind();
            InitExecutionEngine(numWarpsPerMultiprocessor, threadPriority);
            Init(context.DefautltILBackend);
        }
Esempio n. 3
0
        /// <summary>
        /// Constructs a new CPU runtime.
        /// </summary>
        /// <param name="context">The ILGPU context.</param>
        /// <param name="description">The accelerator description.</param>
        /// <param name="mode">The current accelerator mode.</param>
        /// <param name="threadPriority">
        /// The thread priority of the execution threads.
        /// </param>
        internal CPUAccelerator(
            Context context,
            CPUDevice description,
            CPUAcceleratorMode mode,
            ThreadPriority threadPriority)
            : base(context, description)
        {
            NativePtr = new IntPtr(1);

            DefaultStream = CreateStream();

            NumThreads              = description.NumThreads;
            Mode                    = mode;
            ThreadPriority          = threadPriority;
            UsesSequentialExecution =
                Mode == CPUAcceleratorMode.Sequential ||
                Mode == CPUAcceleratorMode.Auto && Debugger.IsAttached;
            finishedEventPerMultiprocessor = new Barrier(NumMultiprocessors + 1);
            multiprocessors = new CPUMultiprocessor[NumMultiprocessors];
            for (int i = 0, e = NumMultiprocessors; i < e; ++i)
            {
                multiprocessors[i] = CPUMultiprocessor.Create(
                    this,
                    i,
                    UsesSequentialExecution);
            }

            Bind();
            Init(context.DefautltILBackend);
        }
Esempio n. 4
0
 /// <summary>
 /// Creates a CPU accelerator that simulates a common configuration specified
 /// by the given <paramref name="kind"/>.
 /// </summary>
 /// <param name="context">The current context.</param>
 /// <param name="kind">The desired CPU accelerator kind.</param>
 /// <param name="mode">The accelerator mode.</param>
 /// <returns>The created CPU accelerator instance.</returns>
 public static CPUAccelerator Create(
     Context context,
     CPUAcceleratorKind kind,
     CPUAcceleratorMode mode) =>
 kind <CPUAcceleratorKind.Default || kind> CPUAcceleratorKind.Intel
     ? throw new ArgumentOutOfRangeException(nameof(kind))
     : CreateAccelerators[(int)kind](context, mode);
Esempio n. 5
0
 /// <summary>
 /// Constructs a new CPU runtime with the default number of 4 threads per warp,
 /// 4 warps per multiprocessor and 1 multiprocessor.
 /// </summary>
 /// <param name="context">The ILGPU context.</param>
 /// <param name="mode">The accelerator mode.</param>
 public CPUAccelerator(Context context, CPUAcceleratorMode mode)
     : this(
         context,
         DefaultWarpSize,
         DefaultNumWarpsPerMultiprocessor,
         DefaultNumMultiprocessors,
         mode)
 {
 }
Esempio n. 6
0
 /// <summary>
 /// Constructs a new CPU runtime.
 /// </summary>
 /// <param name="context">The ILGPU context.</param>
 /// <param name="numThreadsPerWarp">
 /// The number of threads per warp within a group.
 /// </param>
 /// <param name="numWarpsPerMultiprocessor">
 /// The number of warps per multiprocessor.
 /// </param>
 /// <param name="numMultiprocessors">
 /// The number of multiprocessors (number of parallel groups) to simulate.
 /// </param>
 /// <param name="mode">The accelerator mode.</param>
 public CPUAccelerator(
     Context context,
     int numThreadsPerWarp,
     int numWarpsPerMultiprocessor,
     int numMultiprocessors,
     CPUAcceleratorMode mode)
     : this(
         context,
         numThreadsPerWarp,
         numWarpsPerMultiprocessor,
         numMultiprocessors,
         mode,
         ThreadPriority.Normal)
 {
 }
Esempio n. 7
0
        /// <summary>
        /// Constructs a new CPU runtime.
        /// </summary>
        /// <param name="context">The ILGPU context.</param>
        /// <param name="description">The accelerator description.</param>
        /// <param name="mode">The current accelerator mode.</param>
        /// <param name="threadPriority">
        /// The thread priority of the execution threads.
        /// </param>
        internal CPUAccelerator(
            Context context,
            CPUDevice description,
            CPUAcceleratorMode mode,
            ThreadPriority threadPriority)
            : base(context, description)
        {
            NativePtr = new IntPtr(1);

            DefaultStream = CreateStream();

            NumThreads = description.NumThreads;
            Mode       = mode;
            UsesSequentialExecution =
                Mode == CPUAcceleratorMode.Sequential ||
                Mode == CPUAcceleratorMode.Auto && Debugger.IsAttached;

            Bind();
            InitExecutionEngine(threadPriority);
            Init(context.DefautltILBackend);
        }
Esempio n. 8
0
 /// <summary>
 /// Creates a new CPU accelerator with default thread priority.
 /// </summary>
 /// <param name="context">The ILGPU context.</param>
 /// <param name="cpuDeviceIndex">
 /// The relative device index for the CPU device. 0 here refers to the first
 /// CPU device, 1 to the second, etc.
 /// </param>
 /// <param name="mode">The CPU accelerator mode.</param>
 /// <returns>The created CPU accelerator.</returns>
 public static CPUAccelerator CreateCPUAccelerator(
     this Context context,
     int cpuDeviceIndex,
     CPUAcceleratorMode mode) =>
 context.GetCPUDevice(cpuDeviceIndex)
 .CreateCPUAccelerator(context, mode);
Esempio n. 9
0
 /// <summary>
 /// Creates a new CPU accelerator.
 /// </summary>
 /// <param name="context">The ILGPU context.</param>
 /// <param name="mode">The CPU accelerator mode.</param>
 /// <param name="threadPriority">
 /// The thread priority of the execution threads.
 /// </param>
 /// <returns>The created CPU accelerator.</returns>
 public CPUAccelerator CreateCPUAccelerator(
     Context context,
     CPUAcceleratorMode mode,
     ThreadPriority threadPriority) =>
 new CPUAccelerator(context, this, mode, threadPriority);
Esempio n. 10
0
 /// <summary>
 /// Creates a new CPU accelerator with default thread priority.
 /// </summary>
 /// <param name="context">The ILGPU context.</param>
 /// <param name="mode">The CPU accelerator mode.</param>
 /// <returns>The created CPU accelerator.</returns>
 public CPUAccelerator CreateCPUAccelerator(
     Context context,
     CPUAcceleratorMode mode) =>
 CreateCPUAccelerator(context, mode, ThreadPriority.Normal);
Esempio n. 11
0
 /// <summary>
 /// Creates a CPU accelerator that simulates a common configuration of an Intel
 /// GPU with 1 multiprocessor.
 /// </summary>
 /// <param name="context">The current context.</param>
 /// <param name="mode">The accelerator mode.</param>
 /// <returns>The created CPU accelerator instance.</returns>
 public static CPUAccelerator CreateIntelSimulator(
     Context context,
     CPUAcceleratorMode mode) =>
 new CPUAccelerator(context, 16, 8, 1, mode);
Esempio n. 12
0
 /// <summary>
 /// Creates a CPU accelerator that simulates a common configuration of a legacy
 /// GCN AMD GPU with 1 multiprocessor.
 /// </summary>
 /// <param name="context">The current context.</param>
 /// <param name="mode">The accelerator mode.</param>
 /// <returns>The created CPU accelerator instance.</returns>
 public static CPUAccelerator CreateLegacyAMDSimulator(
     Context context,
     CPUAcceleratorMode mode) =>
 new CPUAccelerator(context, 64, 4, 1, mode);
Esempio n. 13
0
 /// <summary>
 /// Creates a CPU accelerator that simulates a common configuration of an AMD
 /// GPU with 1 multiprocessor.
 /// </summary>
 /// <param name="context">The current context.</param>
 /// <param name="mode">The accelerator mode.</param>
 /// <returns>The created CPU accelerator instance.</returns>
 public static CPUAccelerator CreateAMDSimulator(
     Context context,
     CPUAcceleratorMode mode) =>
 new CPUAccelerator(context, 32, 8, 1, mode);
Esempio n. 14
0
 /// <summary>
 /// Creates a CPU accelerator that simulates a common configuration of a default
 /// GPU simulator with 1 multiprocessor, a warp size of 4 and 4 warps per
 /// multiprocessor.
 /// </summary>
 /// <param name="context">The current context.</param>
 /// <param name="mode">The accelerator mode.</param>
 /// <returns>The created CPU accelerator instance.</returns>
 public static CPUAccelerator CreateDefaultSimulator(
     Context context,
     CPUAcceleratorMode mode) =>
 new CPUAccelerator(context, mode);