Program to Perform Parallel Matrix Multiplication in Java

Java




// Java Program to perform Parallel Matrix Multiplication
import java.util.Arrays;
  
// Driver Class
public class GfGParallelMatrixMultiplication 
{
    // Main Function
    public static int[][] multiply(int[][] matrix1, int[][] matrix2) 
    {
        // Get the number of rows in matrix1
        int numRow1 = matrix1.length;
        // Get the number of columns in matrix1
        int numCol1 = matrix1[0].length;
        // Get the number of columns in matrix2
        int numCol2 = matrix2[0].length;
  
        // Create a 2D array to store the result of multiplication
        int[][] result = new int[numRow1][numCol2];
  
        // Use parallel streams to perform parallel multiplication
        Arrays.parallelSetAll(result, i -> multiplyRow(matrix1, matrix2, i));
  
        // Return the result
        return result;
    }
  
    // Helper function to multiply a row of matrix1 with matrix2
    private static int[] multiplyRow(int[][] matrix1, int[][] matrix2, int row) 
    {
        // Get the number of columns in matrix1
        int numCol1 = matrix1[0].length;
        // Get the number of columns in matrix2
        int numCol2 = matrix2[0].length;
        // Create an array to store the result row
        int[] resultRow = new int[numCol2];
  
        // Iterate over each column in matrix2
        for (int j = 0; j < numCol2; j++) 
        {
            // Iterate over each element in the row of matrix1
            for (int k = 0; k < numCol1; k++) 
            {
                // Multiply the corresponding elements and add the result to the result row
                resultRow[j] += matrix1[row][k] * matrix2[k][j];
            }
        }
  
        // Return the result row
        return resultRow;
    }
  
    // Main function to test the matrix multiplication
    public static void main(String[] args) {
        // Define matrix1
        int[][] matrix1 = {
            {11, 45, 5},
            {38, 23, 13}
        };
          
        // Define matrix2
        int[][] matrix2 = {
            {18, 5},
            {14, 10},
            {25, 19}
        };
  
        // Perform matrix multiplication
        int[][] result = multiply(matrix1, matrix2);
  
        // Print the result
        for (int[] row : result) {
            System.out.println(Arrays.toString(row));
        }
    }
}


Output

[953, 600]
[1331, 667]

Explanation of the above Program:

  • In the above program, we have implemented the parallel matrix multiplication using arrays. parallelSetAll method.
    • Arrays.parallelSetAll(returns): This method can be used to set the elements of the array in parallel using the generator function, and it is part of the java.util.Arrays package.
  • This lambda function can be a result array whose elements are to be set.
  • This is a lambda expression passed as the generator function.
  • It takes an index i as input and returns the value to be set at that index in the result array.
  • In this case, it calls the multiplyRow() method to compute the values for a specific row of the resulting matrix.


How to Perform Java Parallel Matrix Multiplication?

In Java, Parallelism can be used to perform Matrix Multiplication using multiple threads concurrently. The major advantage of this technique is that it uses distributed computing environments to speed up the computation. In this article, we will learn how to perform Parallel Matrix Multiplication in Java.

Key terminologies:

  • Matrix Multiplication: It is an operation in which, two matrices are taken as an input, and it produces the product of two matrices as a third matric as an output.
  • Parallelism: This can be achieved by dividing the matrices into smaller submatrices. And then, by generating the products of these submatrices we can achieve parallelism.

Step-by-Step Implementation to Perform Parallel Matrix Multiplication

  • Create the class named GfGParallelMatrixMultiplication and write the main method into the class.
  • In the main method, create the two matrices, named matrix1 and matrix2, to assign the elements to them.
  • After that, call the multiply method, pass matrix 1 and matrix 2 as parameters, and the result of that will print the elements through the iteration.
  • In the multiply method, we can create numRow1, numCol1, and numCol2, and it can assign the lengths of the matrix rows, respectively.
  • Create the result array with the numRow1 and numCol2 indexes of the result array.
  • We can implement the parallel matrix function and return the result.
  • Print the result array.

Similar Reads

Program to Perform Parallel Matrix Multiplication in Java

Java // Java Program to perform Parallel Matrix Multiplication import java.util.Arrays;    // Driver Class public class GfGParallelMatrixMultiplication  {     // Main Function     public static int[][] multiply(int[][] matrix1, int[][] matrix2)      {         // Get the number of rows in matrix1         int numRow1 = matrix1.length;         // Get the number of columns in matrix1         int numCol1 = matrix1[0].length;         // Get the number of columns in matrix2         int numCol2 = matrix2[0].length;            // Create a 2D array to store the result of multiplication         int[][] result = new int[numRow1][numCol2];            // Use parallel streams to perform parallel multiplication         Arrays.parallelSetAll(result, i -> multiplyRow(matrix1, matrix2, i));            // Return the result         return result;     }        // Helper function to multiply a row of matrix1 with matrix2     private static int[] multiplyRow(int[][] matrix1, int[][] matrix2, int row)      {         // Get the number of columns in matrix1         int numCol1 = matrix1[0].length;         // Get the number of columns in matrix2         int numCol2 = matrix2[0].length;         // Create an array to store the result row         int[] resultRow = new int[numCol2];            // Iterate over each column in matrix2         for (int j = 0; j < numCol2; j++)          {             // Iterate over each element in the row of matrix1             for (int k = 0; k < numCol1; k++)              {                 // Multiply the corresponding elements and add the result to the result row                 resultRow[j] += matrix1[row][k] * matrix2[k][j];             }         }            // Return the result row         return resultRow;     }        // Main function to test the matrix multiplication     public static void main(String[] args) {         // Define matrix1         int[][] matrix1 = {             {11, 45, 5},             {38, 23, 13}         };                    // Define matrix2         int[][] matrix2 = {             {18, 5},             {14, 10},             {25, 19}         };            // Perform matrix multiplication         int[][] result = multiply(matrix1, matrix2);            // Print the result         for (int[] row : result) {             System.out.println(Arrays.toString(row));         }     } }...