package com.github.stakafum.mapreduce.MatrixMul; import com.github.stakafum.mapreduce.MapReduce; import java.util.*; public class Main { /** * @param args 第一引数に行列の長さ、第二引数に並列数をそれぞれ格納する配列 */ public static void main(String[] args) { args = new String[]{"3","5"}; int matrixSize = 128; double[][] matrixA; double[][] matrixB; int parallelNum = 1; if(args.length > 0){ matrixSize = new Integer(args[0]).intValue(); } if(args.length > 1){ parallelNum = new Integer(args[1]).intValue(); } System.out.println("matrix size = " + String.valueOf(matrixSize)); matrixA = new double[matrixSize][matrixSize]; matrixB = new double[matrixSize][matrixSize]; init(matrixA); try{ Thread.sleep(1); }catch(InterruptedException e){ System.out.println("乱数調整のためのsleep"); } init(matrixB); show(matrixA); show(matrixB); MapReduce<Integer, double[], Integer, Double, Integer, Double> mmMR = new MapReduce<Integer, double[], Integer, Double, Integer, Double>(MapMM.class, ReduceMM.class, "MAP_REDUCE"); mmMR.setResultOutput(false); mmMR.setParallelThreadNum(parallelNum); for(int i = 0; i < matrixSize; i++){ for(int j = 0; j < matrixSize; j++){ for(int k = 0; k < matrixSize; k++){ double[] ijV = {matrixA[i][k], matrixB[k][j]}; mmMR.addKeyValue(i*matrixSize+j, ijV); } } } System.out.println("Making matrix is finished."); long start = System.nanoTime(); mmMR.run(); long stop = System.nanoTime(); System.out.println("MatrixMul time is " + String.valueOf((double)(stop - start) / 1000000000)); } /** * 行列にランダムな配列を格納し初期化するメソッド * @param matrix 行列 */ public static void init(double[][] matrix){ Date d = new Date(); Random rdm = new Random(d.getTime()); for(int i = 0; i < matrix.length; i ++){ for(int j = 0; j < matrix.length; j++){ matrix[i][j] = rdm.nextDouble(); } } } /** * 行列を回転するためのメソッド * @param matrix 行列 */ public static void rotate(double[][] matrix){ double tmp; for(int i = 0; i < matrix.length; i ++){ for(int j = i+1; j < matrix.length; j++){ tmp = matrix[i][j]; matrix[i][j] = matrix[j][i]; matrix[j][i] = tmp; } } } /** * 行列を表示するメソッド * @param matrix 行列 */ public static void show(double[][] matrix){ for(int i = 0; i < matrix.length; i ++){ for(int j = 0; j < matrix.length; j++){ System.out.print(matrix[i][j]); System.out.print(" "); } System.out.println(); } } }