public static double2[] Zaxpy(int n, double2 alpha, double2[] x, int incx, double2[] y, int incy) { using (var dalpha = Worker.Malloc(new[] { alpha })) using (var dx = Worker.Malloc(x)) using (var dy = Worker.Malloc(y)) { Cublas.Zaxpy(n, dalpha.Ptr, dx.Ptr, incx, dy.Ptr, incy); return(dy.Gather()); } }
public static double2[] Zgemm(int m, int n, int k, double2 alpha, double2[] A, int lda, double2[] B, int ldb, double2 beta, double2[] C, int ldc) { using (var dA = Worker.Malloc(A)) using (var dB = Worker.Malloc(B)) using (var dC = Worker.Malloc(C)) using (var dAlpha = Worker.Malloc(new[] { alpha })) using (var dBeta = Worker.Malloc(new[] { beta })) { Cublas.Zgemm(Transa, Transb, m, n, k, dAlpha.Ptr, dA.Ptr, lda, dB.Ptr, ldb, dBeta.Ptr, dC.Ptr, ldc); return(dC.Gather()); } }
//C = α op ( A ) op ( B ) + β C public static string Multiply( out GpuMatrix gmOut, IntPtr cublasHandle, GpuMatrix gmA, GpuMatrix gmB, GpuMatrix gmC) { if (gmA.DevHostState == DevHostState.DeviceNotAllocated) { gmOut = null; return("Device data pointer for matrix A not allocated"); } if (gmB.DevHostState == DevHostState.DeviceNotAllocated) { gmOut = null; return("Device data pointer for matrix B not allocated"); } if (gmC.DevHostState == DevHostState.DeviceNotAllocated) { gmOut = null; return("Device data pointer for matrix C not allocated"); } var cuby = new Cublas(); var strRet = cuby.cublasSgemm( cublas_handle: cublasHandle, transa: CublasOp.N, transb: CublasOp.N, m: (int)gmA.Matrix.Rows, n: (int)gmB.Matrix.Cols, k: (int)gmA.Matrix.Cols, alpha: 1, dev_A: gmA.DevPtr, lda: (int)gmA.Matrix.Rows, dev_B: gmB.DevPtr, ldb: (int)gmB.Matrix.Rows, beta: 0, dev_C: gmC.DevPtr, ldc: (int)gmC.Matrix.Rows ); if (!String.IsNullOrEmpty(strRet)) { gmOut = null; return(strRet); } gmOut = new GpuMatrix( matrix: gmC.Matrix, devPtr: gmC.DevPtr, devHostState: DevHostState.DeviceIsNewer); return(String.Empty); }
public static double[][] Dgemm(int m, int n, int k, double alpha, double[][] hAs, int lda, double[][] hBs, int ldb, double beta, double[][] hCs, int ldc) { var batchCount = hAs.Length; var dAs = (from hA in hAs select Worker.Malloc(hA)).ToArray(); var dBs = (from hB in hBs select Worker.Malloc(hB)).ToArray(); var dCs = (from hC in hCs select Worker.Malloc(hC)).ToArray(); try { using (var dAPtrs = Worker.Malloc((from dA in dAs select dA.Ptr).ToArray())) using (var dBPtrs = Worker.Malloc((from dB in dBs select dB.Ptr).ToArray())) using (var dCPtrs = Worker.Malloc((from dC in dCs select dC.Ptr).ToArray())) using (var dAlpha = Worker.Malloc(new[] { alpha })) using (var dBeta = Worker.Malloc(new[] { beta })) { Cublas.Dgemm(Transa, Transb, m, n, k, dAlpha.Ptr, dAPtrs.Ptr, lda, dBPtrs.Ptr, ldb, dBeta.Ptr, dCPtrs.Ptr, ldc, batchCount); } return((from dC in dCs select dC.Gather()).ToArray()); } finally { foreach (var dA in dAs) { dA.Dispose(); } foreach (var dB in dBs) { dB.Dispose(); } foreach (var dC in dCs) { dC.Dispose(); } } }