Esempio n. 1
0
        public static double measureSparseMatmult(int N, int nz, double min_time, Random R)
        {
            double[] x    = kernel.RandomVector(N, R);
            double[] y    = new double[N];
            int      num1 = nz / N;
            int      N1   = checked (num1 * N);

            double[] val = kernel.RandomVector(N1, R);
            int[]    col = new int[N1];
            int[]    row = new int[checked (N + 1)];
            row[0] = 0;
            int index = 0;

            while (index < N)
            {
                int num2 = row[index];
                row[checked (index + 1)] = checked (num2 + num1);
                int num3 = index / num1;
                if (num3 < 1)
                {
                    num3 = 1;
                }
                int num4 = 0;
                while (num4 < num1)
                {
                    col[checked (num2 + num4)] = checked (num4 * num3);
                    checked { ++num4; }
                }
                checked { ++index; }
            }
            Stopwatch stopwatch = new Stopwatch();
            int       num5      = 150000;

            stopwatch.start();
            SparseCompRow.matmult(y, val, row, col, x, num5);
            stopwatch.stop();
            return(SparseCompRow.num_flops(N, nz, num5) / stopwatch.read() * 1E-06);
        }
Esempio n. 2
0
        public static double measureSparseMatmult(int N, int nz, double min_time, Random R)
        {
            // initialize vector multipliers and storage for result
            // y = A*y;

            double[] x = RandomVector(N, R);
            double[] y = new double[N];

            // initialize square sparse matrix
            //
            // for this test, we create a sparse matrix wit M/nz nonzeros
            // per row, with spaced-out evenly between the begining of the
            // row to the main diagonal.  Thus, the resulting pattern looks
            // like
            //             +-----------------+
            //             +*                +
            //             +***              +
            //             +* * *            +
            //             +** *  *          +
            //             +**  *   *        +
            //             +* *   *   *      +
            //             +*  *   *    *    +
            //             +*   *    *    *  +
            //             +-----------------+
            //
            // (as best reproducible with integer artihmetic)
            // Note that the first nr rows will have elements past
            // the diagonal.

            int nr  = nz / N; // average number of nonzeros per row
            int anz = nr * N; // _actual_ number of nonzeros


            double[] val = RandomVector(anz, R);
            int[]    col = new int[anz];
            int[]    row = new int[N + 1];

            row[0] = 0;
            for (int r = 0; r < N; r++)
            {
                // initialize elements for row r

                int rowr = row[r];
                row[r + 1] = rowr + nr;
                int step = r / nr;
                if (step < 1)
                {
                    step = 1;
                }
                // take at least unit steps

                for (int i = 0; i < nr; i++)
                {
                    col[rowr + i] = i * step;
                }
            }

            Stopwatch Q = new Stopwatch();

            int cycles = 1;

            while (true)
            {
                Q.start();
                SparseCompRow.matmult(y, val, row, col, x, cycles);
                Q.stop();
                if (Q.read() >= min_time)
                {
                    break;
                }

                cycles *= 2;
            }

            // approx Mflops
            return(SparseCompRow.num_flops(N, nz, cycles) / Q.read() * 1.0e-6);
        }