static void Main() { using var context = Context.Create(builder => builder.DefaultCPU().Cuda()); // For each available device... foreach (var device in context) { // Create accelerator for the given device using var accelerator = device.CreateAccelerator(context); Console.WriteLine($"Performing operations on {accelerator}"); // Use LoadStreamKernel or LoadKernel to load explicitly grouped kernels var kernel = accelerator.LoadStreamKernel <ArrayView <int>, ArrayView <short> >(SharedMemKernel); var buffer = accelerator.Allocate1D <int>(accelerator.MaxNumThreadsPerGroup); var buffer2 = accelerator.Allocate1D <short>(accelerator.MaxNumThreadsPerGroup); // Use 'new KernelConfig(..., ..., ...)' to construct a new launch configuration // Hint: use the C# tuple features to convert a triple into a kernel config int groupSize = accelerator.MaxNumThreadsPerGroup; var config = SharedMemoryConfig.RequestDynamic <byte>(groupSize * sizeof(int)); // alternatively: // var config = SharedMemoryConfig.RequestDynamic<int>(groupSize); // var config = SharedMemoryConfig.RequestDynamic<short>(groupSize * 2); kernel( // GridSize, GroupSize, shared memory config (1, groupSize, config), buffer.View, buffer2.View); var data = buffer.GetAsArray1D(); var data2 = buffer2.GetAsArray1D(); // Use data objects... } }
/// <summary> /// Setups the shared memory system. /// </summary> /// <param name="Config">The configuration.</param> public void SetupSharedMemory(SharedMemoryConfig Config) { if (Config == null) { throw new ArgumentNullException(nameof(Config)); } this.Config = Config; }
public KernelConfig( Index1 gridDim, Index1 groupDim, SharedMemoryConfig sharedMemoryConfig) : this( new Index3(gridDim.X, 1, 1), new Index3(groupDim.X, 1, 1), sharedMemoryConfig) { }
public KernelConfig( Index2D gridDim, Index2D groupDim, SharedMemoryConfig sharedMemoryConfig) : this( new Index3D(gridDim.X, gridDim.Y, 1), new Index3D(groupDim.X, groupDim.Y, 1), sharedMemoryConfig) { }
public KernelConfig( Index3 gridDim, Index3 groupDim, SharedMemoryConfig sharedMemoryConfig) { Debug.Assert(gridDim.Size >= 0, "Invalid grid dimension"); Debug.Assert(groupDim.Size >= 0, "Invalid group dimension"); GridDim = gridDim; GroupDim = groupDim; SharedMemoryConfig = sharedMemoryConfig; }
public RuntimeSharedMemoryConfig( SharedMemorySpecification specification, SharedMemoryConfig dynamicConfig) { Specification = specification; DynamicConfig = dynamicConfig; if (!specification.HasDynamicMemory && dynamicConfig.NumElements > 0) { throw new InvalidOperationException( ErrorMessages.InvalidDynamicSharedMemoryConfiguration); } }
public KernelConfig( Index3 gridDim, Index3 groupDim, SharedMemoryConfig sharedMemoryConfig) { if (gridDim.Size < 0) { throw new ArgumentOutOfRangeException(nameof(gridDim)); } if (groupDim.Size < 0) { throw new ArgumentOutOfRangeException(nameof(groupDim)); } GridDim = gridDim; GroupDim = groupDim; SharedMemoryConfig = sharedMemoryConfig; }
static void Main() { using (var context = new Context()) { var accelerators = CudaAccelerator.CudaAccelerators.Cast <AcceleratorId>().Concat( CPUAccelerator.CPUAccelerators.Cast <AcceleratorId>()); // For each available accelerator... foreach (var acceleratorId in accelerators) { // Create default accelerator for the given accelerator id using (var accelerator = Accelerator.Create(context, acceleratorId)) { Console.WriteLine($"Performing operations on {accelerator}"); // Use LoadStreamKernel or LoadKernel to load explicitly grouped kernels var kernel = accelerator.LoadStreamKernel <ArrayView <int>, ArrayView <short> >(SharedMemKernel); var buffer = accelerator.Allocate <int>(accelerator.MaxNumThreadsPerGroup); var buffer2 = accelerator.Allocate <short>(accelerator.MaxNumThreadsPerGroup); // Use 'new KernelConfig(..., ..., ...)' to construct a new launch configuration // Hint: use the C# tuple features to convert a triple into a kernel config int groupSize = accelerator.MaxNumThreadsPerGroup; var config = SharedMemoryConfig.RequestDynamic <byte>(groupSize * sizeof(int)); // alternatively: // var config = SharedMemoryConfig.RequestDynamic<int>(groupSize); // var config = SharedMemoryConfig.RequestDynamic<short>(groupSize * 2); kernel( // GridSize, GroupSize, shared memory config (1, groupSize, config), buffer.View, buffer2.View); var data = buffer.GetAsArray(); var data2 = buffer2.GetAsArray(); // Use data objects... } } } }
/// <inheritdoc cref="CtxSetSharedMemConfig(SharedMemoryConfig)"/> public static void SetSharedMemConfig(SharedMemoryConfig config) { var result = CtxSetSharedMemConfig(config); CheckResult(result); }
public static extern CuResult CtxSetSharedMemConfig(SharedMemoryConfig config);
public static extern CuResult CtxGetSharedMemConfig(out SharedMemoryConfig pConfig);
public static extern CuResult FuncSetSharedMemConfig(CuFunction hfunc, SharedMemoryConfig config);