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); }
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; }
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); }