예제 #1
0
        public int CountEquals(ContiguousMemoryBuffer rhs, MemoryBuffer cache)
        {
            Debug.Assert(Buffer.pointer != 0);
            Debug.Assert(rhs.Buffer.pointer != 0);
            Debug.Assert(Size == rhs.Size);

            bool needToFreeCache = cache.pointer == 0;

            if (needToFreeCache)
            {
                cache.memorySpace = memorySpace;
                cache.mathDomain  = mathDomain;
                cache.size        = (uint)Size;
                Alloc(cache);
            }

            // calculate the difference
            CuBlasApi.Subtract(cache, Buffer, rhs.Buffer);

            // calculate how many non-zeros, overriding cache
            CuBlasApi.IsNonZero(cache, cache);

            double ret = CubApi.Sum(cache);

            // we are counting the zero entries
            ret = Size - ret;

            if (needToFreeCache)
            {
                Free(cache);
            }

            return((int)ret);
        }
예제 #2
0
        /// <summary>
        /// Same version as above, but gives the possibility of reusing the output buffer
        /// </summary>
        /// <param name="output"></param>
        /// <param name="rhs"></param>
        /// <param name="lhsOperation"></param>
        /// <param name="rhsOperation"></param>
        /// <param name="alpha"></param>
        public void Multiply(ColumnWiseMatrix output, ColumnWiseMatrix rhs, MatrixOperation lhsOperation = MatrixOperation.None, MatrixOperation rhsOperation = MatrixOperation.None, double alpha = 1.0, double beta = 0.0)
        {
            if (lhsOperation == MatrixOperation.None)
            {
                Debug.Assert(rhs.nRows == nCols);
                Debug.Assert(output.nRows == nRows);
                Debug.Assert(output.nCols == rhs.nCols);
            }
            else
            {
                Debug.Assert(rhs.nCols == nCols);
                Debug.Assert(output.nCols == nRows);
                Debug.Assert(output.nRows == rhs.nCols);
            }

            Debug.Assert(memorySpace == rhs.memorySpace);
            Debug.Assert(memorySpace == output.memorySpace);
            Debug.Assert(mathDomain == rhs.mathDomain);
            Debug.Assert(mathDomain == output.mathDomain);
            Debug.Assert(Buffer.pointer != 0);
            Debug.Assert(rhs.Buffer.pointer != 0);
            Debug.Assert(output.Buffer.pointer != 0);

            CuBlasApi.Multiply(output._buffer, _buffer, rhs._buffer, nRows, rhs.nRows, lhsOperation, rhsOperation, alpha, beta);
        }
예제 #3
0
        /// <summary>
        /// Invert inplace - WARNING, use Solve for higher performance
        /// </summary>
        /// <param name="operation"></param>
        public void Invert(MatrixOperation operation = MatrixOperation.None)
        {
            Debug.Assert(nRows == nCols);
            Debug.Assert(Buffer.pointer != 0);

            CuBlasApi.Invert(_buffer, operation);
        }
예제 #4
0
        /// <summary>
        /// Solve A * X = B, B is overwritten
        /// </summary>
        /// <param name="rhs"></param>
        /// <param name="lhsOperation"></param>
        public void Solve(ColumnWiseMatrix rhs, MatrixOperation lhsOperation = MatrixOperation.None)
        {
            Debug.Assert(nRows == nCols);
            Debug.Assert(Buffer.pointer != 0);

            CuBlasApi.Solve(_buffer, rhs._buffer, lhsOperation);
        }
예제 #5
0
        /// <summary>
        ///  A = alpha * B + beta * A
        /// </summary>
        /// <param name="lhs"></param>
        /// <param name="rhs"></param>
        /// <param name="lhsOperation"></param>
        /// <param name="rhsOperation"></param>
        /// <param name="alpha"></param>
        /// <param name="beta"></param>
        /// <returns></returns>
        public static ColumnWiseMatrix Add(ColumnWiseMatrix lhs, ColumnWiseMatrix rhs, MatrixOperation lhsOperation = MatrixOperation.None, MatrixOperation rhsOperation = MatrixOperation.None, double alpha = 1.0, double beta = 1.0)
        {
            ColumnWiseMatrix ret = new ColumnWiseMatrix(lhs);

            CuBlasApi.AddEqualMatrix(ret._buffer, rhs._buffer, lhsOperation, rhsOperation, alpha, beta);

            return(ret);
        }
예제 #6
0
        public static ColumnWiseMatrix Subtract(ColumnWiseMatrix lhs, ColumnWiseMatrix rhs, MatrixOperation lhsOperation = MatrixOperation.None, MatrixOperation rhsOperation = MatrixOperation.None)
        {
            ColumnWiseMatrix ret = new ColumnWiseMatrix(lhs);

            CuBlasApi.AddEqualMatrix(ret._buffer, rhs._buffer, lhsOperation, rhsOperation, -1.0, 1.0);

            return(ret);
        }
예제 #7
0
        public void AddEqual(ContiguousMemoryBuffer rhs, double alpha = 1.0)
        {
            Debug.Assert(Size == rhs.Size);
            Debug.Assert(memorySpace == rhs.memorySpace);
            Debug.Assert(mathDomain == rhs.mathDomain);
            Debug.Assert(Buffer.pointer != 0);
            Debug.Assert(rhs.Buffer.pointer != 0);

            CuBlasApi.AddEqual(Buffer, rhs.Buffer, alpha);
        }
예제 #8
0
        public void SubtractEqual(ContiguousMemoryBuffer rhs)
        {
            Debug.Assert(Size == rhs.Size);
            Debug.Assert(memorySpace == rhs.memorySpace);
            Debug.Assert(mathDomain == rhs.mathDomain);
            Debug.Assert(Buffer.pointer != 0);
            Debug.Assert(rhs.Buffer.pointer != 0);

            CuBlasApi.SubtractEqual(Buffer, rhs.Buffer);
        }
예제 #9
0
        public static SparseVector operator -(SparseVector lhs, SparseVector rhs)
        {
            Debug.Assert(lhs.Size == rhs.Size);
            Debug.Assert(lhs.memorySpace == rhs.memorySpace);
            Debug.Assert(lhs.mathDomain == rhs.mathDomain);
            Debug.Assert(lhs.Buffer.pointer != 0);
            Debug.Assert(rhs.Buffer.pointer != 0);

            SparseVector ret = new SparseVector(lhs);

            CuBlasApi.AddEqual(ret.Buffer, rhs.Buffer, -1.0);

            return(ret);
        }
예제 #10
0
        public static Vector operator *(ColumnWiseMatrix lhs, Vector rhs)
        {
            Debug.Assert(rhs.Size == lhs.nCols);
            Debug.Assert(lhs.memorySpace == rhs.memorySpace);
            Debug.Assert(lhs.mathDomain == rhs.mathDomain);
            Debug.Assert(lhs.Buffer.pointer != 0);
            Debug.Assert(rhs.Buffer.pointer != 0);

            Vector ret = new Vector(rhs.Size, lhs.memorySpace, rhs.mathDomain);

            CuBlasApi.Dot(ret.Buffer, lhs._buffer, rhs.Buffer, MatrixOperation.None, 1.0, 0.0);

            return(ret);
        }
예제 #11
0
        public static ColumnWiseMatrix operator *(ColumnWiseMatrix lhs, ColumnWiseMatrix rhs)
        {
            Debug.Assert(rhs.nRows == lhs.nCols);
            Debug.Assert(lhs.memorySpace == rhs.memorySpace);
            Debug.Assert(lhs.mathDomain == rhs.mathDomain);
            Debug.Assert(lhs.Buffer.pointer != 0);
            Debug.Assert(rhs.Buffer.pointer != 0);

            ColumnWiseMatrix ret = new ColumnWiseMatrix(lhs.nRows, rhs.nCols, lhs.memorySpace, rhs.mathDomain);

            CuBlasApi.Multiply(ret._buffer, lhs._buffer, rhs._buffer, lhs.nRows, rhs.nRows, MatrixOperation.None, MatrixOperation.None, 1.0, 0.0);

            return(ret);
        }
예제 #12
0
        public static ColumnWiseMatrix operator -(ColumnWiseMatrix lhs, ColumnWiseMatrix rhs)
        {
            Debug.Assert(lhs.nRows == rhs.nRows);
            Debug.Assert(lhs.nCols == rhs.nCols);
            Debug.Assert(lhs.memorySpace == rhs.memorySpace);
            Debug.Assert(lhs.mathDomain == rhs.mathDomain);
            Debug.Assert(lhs.Buffer.pointer != 0);
            Debug.Assert(rhs.Buffer.pointer != 0);

            ColumnWiseMatrix tmp = new ColumnWiseMatrix(lhs);

            CuBlasApi.AddEqualMatrix(tmp._buffer, rhs._buffer, MatrixOperation.None, MatrixOperation.None, -1.0, 1.0);

            return(tmp);
        }
예제 #13
0
        /// <summary>
        /// Same version as above, but gives the possibility of reusing the output buffer
        /// </summary>
        /// <param name="output"></param>
        /// <param name="rhs"></param>
        /// <param name="lhsOperation"></param>
        /// <param name="alpha"></param>
        public void Dot(Vector output, Vector rhs, MatrixOperation lhsOperation = MatrixOperation.None, double alpha = 1.0, double beta = 0.0)
        {
            if (lhsOperation == MatrixOperation.None)
            {
                Debug.Assert(rhs.Size == nCols);
                Debug.Assert(output.Size == nRows);
            }
            else
            {
                Debug.Assert(rhs.Size == nRows);
                Debug.Assert(output.Size == nCols);
            }
            Debug.Assert(memorySpace == rhs.memorySpace);
            Debug.Assert(memorySpace == output.memorySpace);
            Debug.Assert(mathDomain == rhs.mathDomain);
            Debug.Assert(mathDomain == output.mathDomain);
            Debug.Assert(Buffer.pointer != 0);
            Debug.Assert(rhs.Buffer.pointer != 0);
            Debug.Assert(output.Buffer.pointer != 0);

            CuBlasApi.Dot(output.Buffer, _buffer, rhs.Buffer, lhsOperation, alpha, beta);
        }
예제 #14
0
 internal static MemoryBuffer Add(MemoryBuffer lhs, MemoryBuffer rhs)
 {
     CuBlasApi.AddEqual(lhs, rhs, 1.0);
     return(lhs);
 }
예제 #15
0
 public void MakeIdentity()
 {
     CuBlasApi.Eye(_buffer);
 }
예제 #16
0
 internal static MemoryBuffer Subtract(MemoryBuffer lhs, MemoryBuffer rhs)
 {
     CuBlasApi.SubtractEqual(lhs, rhs);
     return(lhs);
 }
예제 #17
0
        internal static MemoryBuffer ElementWiseProduct(MemoryBuffer output, MemoryBuffer lhs, MemoryBuffer rhs)
        {
            CuBlasApi.ElementwiseProduct(output, lhs, rhs, 1.0);

            return(output);
        }
예제 #18
0
 public void Scale(double alpha)
 {
     Debug.Assert(Buffer.pointer != 0);
     CuBlasApi.Scale(Buffer, alpha);
 }
예제 #19
0
 public static void KroneckerProduct(ColumnWiseMatrix output, Vector lhs, Vector rhs, double alpha = 1.0)
 {
     CuBlasApi.KroneckerProduct(output._buffer, lhs.Buffer, rhs.Buffer, alpha);
 }
예제 #20
0
 public void ColumnWiseAbsoluteMaximumIndex(Vector output)
 {
     Debug.Assert(output.Buffer.pointer != 0);
     Debug.Assert(output.Size == nCols);
     CuBlasApi.ColumnWiseAbsoluteMaximumIndex(output.Buffer, _buffer);
 }
예제 #21
0
 public int AbsoluteMaximumIndex()
 {
     Debug.Assert(Buffer.pointer != 0);
     return(CuBlasApi.AbsoluteMaximumIndex(Buffer));
 }