/// <summary> /// Creates a new API wrapper. /// </summary> /// <param name="version">The cuBlas version to use.</param> /// <returns>The created API wrapper.</returns> public static CuBlasAPI Create(CuBlasAPIVersion version) { CuBlasAPI result; try { if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { result = new WindowsAPI_V10(); } else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) { result = new MacOSAPI_V10(); } else { result = new LinuxAPI_V10(); } } catch (Exception ex) when( ex is DllNotFoundException || ex is EntryPointNotFoundException) { return(null); } return(result); }
static void Main() { const int DataSize = 1024; const CuBlasAPIVersion CuBlasVersion = CuBlasAPIVersion.V10; using (var context = new Context()) { // Enable algorithms library context.EnableAlgorithms(); // Check for Cuda support foreach (var acceleratorId in CudaAccelerator.CudaAccelerators) { using (var accelerator = new CudaAccelerator(context, acceleratorId)) { Console.WriteLine($"Performing operations on {accelerator}"); var buf = accelerator.Allocate <float>(DataSize); var buf2 = accelerator.Allocate <float>(DataSize); accelerator.Initialize(accelerator.DefaultStream, buf, 1.0f); accelerator.Initialize(accelerator.DefaultStream, buf2.View, 1.0f); // Initialize the CuBlas library using manual pointer mode handling // (default behavior) using (var blas = new CuBlas(accelerator, CuBlasVersion)) { // Set pointer mode to Host to enable data transfer to CPU memory blas.PointerMode = CuBlasPointerMode.Host; float output = blas.Nrm2(buf); // Set pointer mode to Device to enable data transfer to GPU memory blas.PointerMode = CuBlasPointerMode.Device; blas.Nrm2(buf, buf2); // Use pointer mode scopes to recover the previous pointer mode using (var scope = blas.BeginPointerScope(CuBlasPointerMode.Host)) { float output2 = blas.Nrm2(buf); } } // Initialize the CuBlas<T> library using custom pointer mode handlers using (var blas = new CuBlas <CuBlasPointerModeHandlers.AutomaticMode>(accelerator, CuBlasVersion)) { // Automatic transfer to host float output = blas.Nrm2(buf); // Automatic transfer to device blas.Nrm2(buf, buf2); } } } } }
/// <summary> /// Creates a new API wrapper. /// </summary> /// <param name="version">The cuBlas version to use.</param> /// <returns>The created API wrapper.</returns> public static CuBlasAPI Create(CuBlasAPIVersion version) { try { return(CreateInternal(version)); } catch (Exception ex) when( ex is DllNotFoundException || ex is EntryPointNotFoundException) { return(null); } }
/// <summary> /// Constructs a new CuBlas instance to access the Nvidia cublas library. /// </summary> /// <param name="accelerator">The associated cuda accelerator.</param> /// <param name="apiVersion">The cuBlas API version.</param> public CuBlas(CudaAccelerator accelerator, CuBlasAPIVersion apiVersion) { if (accelerator == null) { throw new ArgumentNullException(nameof(accelerator)); } API = CuBlasAPI.Create(apiVersion); accelerator.Bind(); CuBlasException.ThrowIfFailed( API.Create(out IntPtr handle)); Handle = handle; CuBlasException.ThrowIfFailed( API.GetVersion(handle, out int currentVersion)); Version = currentVersion; Stream = accelerator.DefaultStream as CudaStream; }
/// <summary> /// Constructs a new CuBlas instance to access the Nvidia cublas library. /// </summary> /// <param name="accelerator">The associated cuda accelerator.</param> /// <param name="apiVersion">The cuBlas API version.</param> public CuBlas(CudaAccelerator accelerator, CuBlasAPIVersion apiVersion) : base(accelerator, apiVersion) { }
/// <summary> /// Constructs a new CuBlas instance to access the Nvidia cublas library. /// </summary> /// <param name="accelerator">The associated cuda accelerator.</param> /// <param name="apiVersion">The cuBlas API version.</param> public CuBlas(CudaAccelerator accelerator, CuBlasAPIVersion apiVersion) : this(accelerator, new CuBlasAPIVersion?(apiVersion)) { }