/// <summary> /// Constructs a new Cuda accelerator. /// </summary> /// <param name="context">The ILGPU context.</param> /// <param name="deviceId">The target device id.</param> /// <param name="acceleratorFlags">The accelerator flags.</param> public CudaAccelerator( Context context, int deviceId, CudaAcceleratorFlags acceleratorFlags) : base(context, AcceleratorType.Cuda) { CudaException.ThrowIfFailed( CurrentAPI.CreateContext(out contextPtr, acceleratorFlags, deviceId)); DeviceId = deviceId; SetupAccelerator(); }
/// <summary> /// Constructs a new OpenCL accelerator. /// </summary> /// <param name="context">The ILGPU context.</param> /// <param name="description">The accelerator description.</param> internal CLAccelerator(Context context, CLDevice description) : base(context, description) { Backends.Backend.EnsureRunningOnNativePlatform(); // Create new context CLException.ThrowIfFailed( CurrentAPI.CreateContext(DeviceId, out var contextPtr)); NativePtr = contextPtr; Bind(); DefaultStream = CreateStreamInternal(); InitVendorFeatures(); InitSubGroupSupport(description); Init(new CLBackend(Context, Capabilities, Vendor)); }
/// <summary> /// Constructs a new OpenCL accelerator. /// </summary> /// <param name="context">The ILGPU context.</param> /// <param name="description">The accelerator description.</param> internal CLAccelerator(Context context, CLDevice description) : base(context, description) { Backends.Backend.EnsureRunningOnNativePlatform(); if (!description.Capabilities.GenericAddressSpace) { throw CLCapabilityContext.GetNotSupportedGenericAddressSpaceException(); } // Create new context CLException.ThrowIfFailed( CurrentAPI.CreateContext(DeviceId, out var contextPtr)); NativePtr = contextPtr; Bind(); DefaultStream = CreateStreamInternal(); InitVendorFeatures(); InitSubGroupSupport(description); Init(new CLBackend(Context, Capabilities, Vendor, CLStdVersion)); }
/// <summary> /// Constructs a new OpenCL accelerator. /// </summary> /// <param name="context">The ILGPU context.</param> /// <param name="acceleratorId">The accelerator id.</param> public CLAccelerator(Context context, CLAcceleratorId acceleratorId) : base(context, AcceleratorType.OpenCL) { if (acceleratorId == null) { throw new ArgumentNullException(nameof(acceleratorId)); } PlatformId = acceleratorId.PlatformId; DeviceId = acceleratorId.DeviceId; CVersion = acceleratorId.CVersion; PlatformName = CurrentAPI.GetPlatformInfo( PlatformId, CLPlatformInfoType.CL_PLATFORM_NAME); VendorName = CurrentAPI.GetPlatformInfo( PlatformId, CLPlatformInfoType.CL_PLATFORM_VENDOR); // Create new context CLException.ThrowIfFailed( CurrentAPI.CreateContext(DeviceId, out contextPtr)); // Resolve device info Name = CurrentAPI.GetDeviceInfo( DeviceId, CLDeviceInfoType.CL_DEVICE_NAME); MemorySize = CurrentAPI.GetDeviceInfo <long>( DeviceId, CLDeviceInfoType.CL_DEVICE_GLOBAL_MEM_SIZE); DeviceType = (CLDeviceType)CurrentAPI.GetDeviceInfo <long>( DeviceId, CLDeviceInfoType.CL_DEVICE_TYPE); // Max grid size int workItemDimensions = IntrinsicMath.Max(CurrentAPI.GetDeviceInfo <int>( DeviceId, CLDeviceInfoType.CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS), 3); var workItemSizes = new IntPtr[workItemDimensions]; CurrentAPI.GetDeviceInfo( DeviceId, CLDeviceInfoType.CL_DEVICE_MAX_WORK_ITEM_SIZES, workItemSizes); MaxGridSize = new Index3( workItemSizes[0].ToInt32(), workItemSizes[1].ToInt32(), workItemSizes[2].ToInt32()); // Resolve max threads per group MaxNumThreadsPerGroup = CurrentAPI.GetDeviceInfo <IntPtr>( DeviceId, CLDeviceInfoType.CL_DEVICE_MAX_WORK_GROUP_SIZE).ToInt32(); // Resolve max shared memory per block MaxSharedMemoryPerGroup = (int)IntrinsicMath.Min( CurrentAPI.GetDeviceInfo <long>( DeviceId, CLDeviceInfoType.CL_DEVICE_LOCAL_MEM_SIZE), int.MaxValue); // Resolve total constant memory MaxConstantMemory = (int)CurrentAPI.GetDeviceInfo <long>( DeviceId, CLDeviceInfoType.CL_DEVICE_MAX_PARAMETER_SIZE); // Resolve clock rate ClockRate = CurrentAPI.GetDeviceInfo <int>( DeviceId, CLDeviceInfoType.CL_DEVICE_MAX_CLOCK_FREQUENCY); // Resolve number of multiprocessors NumMultiprocessors = CurrentAPI.GetDeviceInfo <int>( DeviceId, CLDeviceInfoType.CL_DEVICE_MAX_COMPUTE_UNITS); // Result max number of threads per multiprocessor MaxNumThreadsPerMultiprocessor = MaxNumThreadsPerGroup; InitVendorFeatures(); InitSubGroupSupport(acceleratorId); Bind(); DefaultStream = CreateStreamInternal(); Init(new CLBackend(Context, Vendor)); }