Hi,

I ran another test using a single parallel loop for array based matrix vector 
multiplication.  Throughput almost tripled (Test pasted at bottom):

# Run complete. Total time: 00:13:24

Benchmark                                      Mode  Cnt Score Error  Units
MultiplyBenchmark.parallelMultiplication      thrpt  200  2221.682 ± 48.689  
ops/s
MultiplyBenchmark.singleThreadMultiplication  thrpt  200   818.755 ±  9.782  
ops/s

public class MultiplyBenchmark {

    public static double[] multiplySingleThreaded(double[][] matrix, double[] 
vector) {
        return Arrays.stream(matrix)
                .mapToDouble(row -> IntStream.range(0, row.length).mapToDouble(col 
-> row[col]
                        * vector[col]).sum())
                .toArray();
    }

    public static double[] multiplyConcurrent(double[][] matrix, double[] 
vector) {
        return Arrays.stream(matrix).parallel()
                .mapToDouble(row -> IntStream.range(0, row.length).mapToDouble(col 
-> row[col]
                        * vector[col]).sum())
                .toArray();
    }

    @State(Scope.Thread)
    public static class Matrix {
        static int size = 10000;
        static double[] vector = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

        public static double[][] matrix = new double[size][10];

        static {
            for (int i = 0; i < size; i++) {
                matrix[i] = vector.clone();
            }
        }
    }

    @Benchmark
    public void singleThreadMultiplication(Matrix m) {
        multiplySingleThreaded(m.matrix, m.vector);
    }

    @Benchmark
    public void parallelMultiplication(Matrix m) {
        multiplyConcurrent(m.matrix, m.vector);
    }
}

Cheers,
Ole

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to