Esempio n. 1
0
 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());
             }
 }
Esempio n. 2
0
 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());
                     }
 }
Esempio n. 3
0
        //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();
                    }
                }
            }