예제 #1
0
        private static void RunComputeNetExample()
        {
            Skip.IfNot(TestSettings.TestMkl, TestSettings.MessageWhenSkippingMKL);

            //Variable typeA is not used and it triggers a warning
#pragma warning disable CS0219

            const int GENERAL_MATRIX = 0;
            const int UPPER_MATRIX   = 1;
            const int LOWER_MATRIX   = -1;

            int          m = 3, n = 2, i, j;
            int          lda = 3, ldb = 3, ldc = 3;
            int          rmaxa, cmaxa, rmaxb, cmaxb, rmaxc, cmaxc;
            float        alpha = 0.5f, beta = 2.0f;
            float[]      a, b, c;
            CBLAS_LAYOUT layout = CBLAS_LAYOUT.CblasRowMajor;
            CBLAS_SIDE   side   = CBLAS_SIDE.CblasLeft;
            CBLAS_UPLO   uplo   = CBLAS_UPLO.CblasUpper;

            int ma, na, typeA;
            if (side == CBLAS_SIDE.CblasLeft)
            {
                rmaxa = m + 1;
                cmaxa = m;
                ma    = m;
                na    = m;
            }
            else
            {
                rmaxa = n + 1;
                cmaxa = n;
                ma    = n;
                na    = n;
            }
            rmaxb = m + 1;
            cmaxb = n;
            rmaxc = m + 1;
            cmaxc = n;
            a     = new float[rmaxa * cmaxa];
            b     = new float[rmaxb * cmaxb];
            c     = new float[rmaxc * cmaxc];
            if (layout == CBLAS_LAYOUT.CblasRowMajor)
            {
                lda = cmaxa;
                ldb = cmaxb;
                ldc = cmaxc;
            }
            else
            {
                lda = rmaxa;
                ldb = rmaxb;
                ldc = rmaxc;
            }
            if (uplo == CBLAS_UPLO.CblasUpper)
            {
                typeA = UPPER_MATRIX;
            }
            else
            {
                typeA = LOWER_MATRIX;
            }
            for (i = 0; i < m; i++)
            {
                for (j = 0; j < m; j++)
                {
                    a[i + j * lda] = 1.0f;
                }
            }
            for (i = 0; i < m; i++)
            {
                for (j = 0; j < n; j++)
                {
                    c[i + j * ldc] = 1.0f;
                    b[i + j * ldb] = 2.0f;
                }
            }
            CBlas.Ssymm(layout, side, uplo, m, n, alpha, ref a[0], lda, ref b[0], ldb, beta, ref c[0], ldc);
        }
예제 #2
0
        public static int Dtrsv(CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, PZMath_matrix A, PZMath_vector x)
        {
            int M = A.RowCount;
            int N = A.ColumnCount;

            if (M != N)
            {
                PZMath_errno.ERROR("PZMath_blas::Dtrsv(), matrix must be square", PZMath_errno.PZMath_ENOTSQR);
            }
            else if (N != x.Size)
            {
                PZMath_errno.ERROR("PZMath_blas::Dtrsv(), invalid length", PZMath_errno.PZMath_EBADLEN);
            }

            bool nonunit = (Diag == CBLAS_DIAG.CblasNonUnit);
            int ix, jx;
            int i, j;
            CBLAS_TRANSPOSE Trans = (TransA != CBLAS_TRANSPOSE.CblasConjTrans) ? TransA : CBLAS_TRANSPOSE.CblasTrans;
            CBLAS_ORDER order = CBLAS_ORDER.CblasRowMajor;

            if (N == 0)
                return PZMath_errno.PZMath_SUCCESS;

            /* form  x := inv( A )*x */

            if ((order == CBLAS_ORDER.CblasRowMajor && Trans == CBLAS_TRANSPOSE.CblasNoTrans
                && Uplo == CBLAS_UPLO.CblasUpper)
                || (order == CBLAS_ORDER.CblasColMajor && Trans == CBLAS_TRANSPOSE.CblasTrans
                && Uplo == CBLAS_UPLO.CblasLower))
            {
                /* backsubstitution */
                ix = N - 1;
                if (nonunit)
                    x[ix] = x[ix] / A[N - 1, N - 1];
                ix--;

                for (i = N - 1; i > 0 && (i-- > 0); )
                {
                    double tmp = x[ix];
                    jx = ix + 1;
                    for (j = i + 1; j < N; j++)
                    {
                        double Aij = A[i, j];
                        tmp -= Aij * x[jx];
                        jx++;
                    }

                    if (nonunit)
                    {
                        x[ix] = tmp / A[i, i];
                    }
                    else
                    {
                        x[ix] = tmp;
                    }
                    ix--;
                }
            }
            else if ((order == CBLAS_ORDER.CblasRowMajor && Trans == CBLAS_TRANSPOSE.CblasNoTrans
                && Uplo == CBLAS_UPLO.CblasLower)
                       || (order == CBLAS_ORDER.CblasColMajor && Trans == CBLAS_TRANSPOSE.CblasTrans
                && Uplo == CBLAS_UPLO.CblasUpper))
            {
                /* forward substitution */
                ix = 0;
                if (nonunit)
                {
                    x[ix] = x[ix] / A[0, 0];
                }
                ix++;
                for (i = 1; i < N; i++)
                {
                    double tmp = x[ix];
                    jx = 0;
                    for (j = 0; j < i; j++)
                    {
                        double Aij = A[i, j];
                        tmp -= Aij * x[jx];
                        jx++;
                    }
                    if (nonunit)
                    {
                        x[ix] = tmp / A[i, i];
                    }
                    else
                    {
                        x[ix] = tmp;
                    }
                    ix++;
                }
            }
            else if ((order == CBLAS_ORDER.CblasRowMajor && Trans == CBLAS_TRANSPOSE.CblasTrans
                && Uplo == CBLAS_UPLO.CblasUpper)
                       || (order == CBLAS_ORDER.CblasColMajor && Trans == CBLAS_TRANSPOSE.CblasNoTrans
                && Uplo == CBLAS_UPLO.CblasLower))
            {

                /* form  x := inv( A' )*x */

                /* forward substitution */
                ix = 0;
                if (nonunit)
                {
                    x[ix] = x[ix] / A[0, 0];
                }
                ix++;
                for (i = 1; i < N; i++)
                {
                    double tmp = x[ix];
                    jx = 0;
                    for (j = 0; j < i; j++)
                    {
                        double Aji = A[j, i];
                        tmp -= Aji * x[jx];
                        jx++;
                    }
                    if (nonunit)
                    {
                        x[ix] = tmp / A[i, i];
                    }
                    else
                    {
                        x[ix] = tmp;
                    }
                    ix++;
                }
            }
            else if ((order == CBLAS_ORDER.CblasRowMajor && Trans == CBLAS_TRANSPOSE.CblasTrans
                && Uplo == CBLAS_UPLO.CblasLower)
                       || (order == CBLAS_ORDER.CblasColMajor && Trans == CBLAS_TRANSPOSE.CblasNoTrans
                && Uplo == CBLAS_UPLO.CblasUpper))
            {

                /* backsubstitution */
                ix = N - 1;
                if (nonunit)
                {
                    x[ix] = x[ix] / A[(N - 1), (N - 1)];
                }
                ix--;
                for (i = N - 1; i > 0 && (i-- > 0); )
                {
                    double tmp = x[ix];
                    jx = ix + 1;
                    for (j = i + 1; j < N; j++)
                    {
                        double Aji = A[j, i];
                        tmp -= Aji * x[jx];
                        jx++;
                    }
                    if (nonunit)
                    {
                        x[ix] = tmp / A[i, i];
                    }
                    else
                    {
                        x[ix] = tmp;
                    }
                    ix--;
                }
            }
            else
            {
                PZMath_errno.ERROR("PZMath_blas::Dtrsv(), unrecognized operation");
            }
            return PZMath_errno.PZMath_SUCCESS;
        }
예제 #3
0
        public void CanRunBlasExample1()
        {
            int   m = 3, n = 2, i, j;
            int   lda = 3, ldb = 3, ldc = 3;
            int   rmaxa, cmaxa, rmaxb, cmaxb, rmaxc, cmaxc;
            float alpha = 0.5f, beta = 2.0f;

            float[]      a, b, c;
            CBLAS_LAYOUT layout = CBLAS_LAYOUT.CblasRowMajor;
            CBLAS_SIDE   side = CBLAS_SIDE.CblasLeft;
            CBLAS_UPLO   uplo = CBLAS_UPLO.CblasUpper;
            int          ma, na, typeA;

            if (side == CBLAS_SIDE.CblasLeft)
            {
                rmaxa = m + 1;
                cmaxa = m;
                ma    = m;
                na    = m;
            }
            else
            {
                rmaxa = n + 1;
                cmaxa = n;
                ma    = n;
                na    = n;
            }
            rmaxb = m + 1;
            cmaxb = n;
            rmaxc = m + 1;
            cmaxc = n;
            a     = new float[rmaxa * cmaxa];
            b     = new float[rmaxb * cmaxb];
            c     = new float[rmaxc * cmaxc];
            if (layout == CBLAS_LAYOUT.CblasRowMajor)
            {
                lda = cmaxa;
                ldb = cmaxb;
                ldc = cmaxc;
            }
            else
            {
                lda = rmaxa;
                ldb = rmaxb;
                ldc = rmaxc;
            }
            if (uplo == CBLAS_UPLO.CblasUpper)
            {
                typeA = UPPER_MATRIX;
            }
            else
            {
                typeA = LOWER_MATRIX;
            }
            for (i = 0; i < m; i++)
            {
                for (j = 0; j < m; j++)
                {
                    a[i + j * lda] = 1.0f;
                }
            }
            for (i = 0; i < m; i++)
            {
                for (j = 0; j < n; j++)
                {
                    c[i + j * ldc] = 1.0f;
                    b[i + j * ldb] = 2.0f;
                }
            }
            CBlas.Ssymm(layout, side, uplo, m, n, alpha, ref a[0], lda, ref b[0], ldb, beta, ref c[0], ldc);
        }