Skip to content

Latest commit

 

History

History
56 lines (42 loc) · 6.46 KB

README.md

File metadata and controls

56 lines (42 loc) · 6.46 KB

Parallel-Programming-Project

Увод – цел на проекта, изисквания и функционалност

Проектът реализира умножение на две матрици A и В - матрицата A е с размерност (m, n), а B с размерност (n, k). Матрицата C = A.B, равна на произведението на A и B има размерност (m, k). Програмата пресмята матрицата C като работата по умножението на матриците е разделено по подходящ начин на две или повече нишки (задачи).

Изискванията към програмата са следните:

  • Размерността на матриците се задава от подходящо избрани командни параметри – например „-m 1024 -n 512 -k 2048“;

  • Елементите на матриците генерираме произволно с помощта на Math.random() (класа java.util.Random)

  • Команден параметър указващ входен текстов файл, съдържащ матриците, които ще умножаваме – например „-i m3x-data.in“. Който и да е от параметрите „-m“ „-n“ „-k“ и параметърът „-i“ са взаимно-изключващи се; Ако все пак бъдат зададени всичките параметри,програмата се изпълнява с аргументи -m –n -k. Форматът на файла m3x-data.in е следният:
    === цитат === m n k a11 a12 a13 … a1n a21 a22 a23 … a2n … am1 am2 am3 … amn b11 b12 b13 … b1k b21 b22 b23 … b2k … bn1 bn2 bn3 … bnk === цитат ===

  • Команден параметър указващ изходен файл, съдържащ резултата от пресмятането – например „-о m3x-data.out“. Форматът на изходният файл е следният: === цитат === m k c11 c12 c13 … c1k c21 c22 c23 … c2k … cm1 cm2 cm3 … cmk === цитат ===

  • Друг команден параметър задава максималния брой нишки (задачи) на които разделяме работата по пресмятането елементите на C - “–t 1”.

  • Програмата извежда подходящи съобщения на различните етапи от работата си, както и времето, отделено за завършване на всички изчисления;

  • Осигурена е възможност за „quiet режим на работа на програмата, при който се извежда само времето отделено за изчисление на резултантната матрица, отново чрез команден параметър “-q”;

Проектиране и реализация

Алгоритъмът е имплементиран на Java. Програмата се стартира с извикване на класа Main с подадени параметри от командния ред.
Създават се 2 обекта от класа Matrix.java – first и second, които ще представляват матриците А и В. Всяка матрица има атрибути row,col,matrix[][] - брой редове, брой стълбове и самите елементи на матрицата.

Kогато са указани размерностите (-m –n –k), програмата генерира случайни стойности на елементите на first и second. Използваме метода на Matrix за генериране на случайни стойности при подадени брой редове и брой стълбове - generateRandomMatrix(int row, int col).

Ако е указано име на файл за четене (-i ), програмата взима размерностите на матриците first и second и стойностите на техните елементи от файла с име . Това става чрез метода Pair<Matrix, Matrix> createMatricesFromFile(String filename) на класа Matrix, който след прочитане връща двете матрици.

В зависимост от това в какъв режим е програмата(тих или не), се извиква метода runMultiplication(double[] totalTime, boolean isQuiet, int numThreads, Matrix first, Matrix second, Matrix result) със съответните стойности, указващи режима на работа. В runМultiplication се създават нишките, всяка от които има следния метод на действие:

При указани p на брой нишки от командния ред(опция –t), работата се разделя на p части. Взимат се всички редове от матрицата first, които при деление на p дават един и същ остатък(row1, row2,..rown). Всяка нишка изчислява само елементите на result, които са от вида row[i]*col[j], където row[i] е от горното множество редове на first, а col[j] са всички колони на матрицата second. Изчислението става в метода multiply() на класа MultiplyRunnable.java

SilentMultiply.java/NonSilentmultiply.java са разширения на класа MultiplyRunnable.java. И в двата класа се изпълнява изчислението на стойности на result чрез извикване на метода multiply() от MultiplyRunnable.java. Разликата е, че при NonSilentmultiply.java програмата извежда информация на екрана за времето на изчисление на всяка нишка.

При получаването на резултат от някоя от нишките се попълват сметнатите от тази нишка стойности в изходната матрица result.