Commit 2a827c21 authored by Mario Bajer's avatar Mario Bajer
Browse files

fixed multithreading for small matrices

fixed multithreading rowcount
parent 0eb222ab
/** @file Matrix.hpp
* @brief Enthält die Klasse Matrix und alle ihre Funktionen
*
* Es kann eine Matrix mit einer quadratischen Dimension erstellt werden.
* @brief Enthält die Klasse Matrix und alle ihre Funktionen.
*
* @author Mario Bajer
* @version 2.1
......@@ -17,7 +15,7 @@
using namespace std;
using namespace cgicc;
using json = nlohmann::json; //json external link
using json = nlohmann::json;
/** @class Matrix
* @brief Klasse Matrix
......@@ -29,11 +27,11 @@ public:
* Initialisiert eine Matrix und speichert diese im Filesystem.
* @param x - Spaltenanzahl
* @param y - Zeilenanzahl
* @return liefert einen über x und y definierte Matrix zurück.
* @return liefert eine über x und y definierte Matrix zurück.
* */
Matrix(int x, int y);
/** @brief Printen der Matrix
/** @brief Ausgeben der Matrix
*
* @param std::ostream& - Ausgabestream für die Matrix
* */
......@@ -43,15 +41,15 @@ public:
* */
void fillRND();
/** @brief Generiert für eine Matrix eine ID auf Basis eines Files welches einen Counter speichert
/** @brief Generiert für eine Matrix eine ID auf Basis eines Files (config.json) welches einen Counter gespeichert hat
* */
int generateID();
/** @brief Speichert die Matrix im lokalen Filesystem
/** @brief Speichert die Matrix im lokalen Filesystem unter Json/
* */
int saveMatrix();
/** @brief Liest Daten und Metadaten einer Matrix aus einem File und füllt das Matrix-Objekt
/** @brief Liest Daten und Metadaten einer Matrix aus einem File und füllt das Matrix-Objekt (Dimension, ID, Matrixelemente)
* */
void getmatrixfromfile( const string& path);
......@@ -63,18 +61,18 @@ public:
* */
void reset(std::size_t y, std::size_t x);
/** @brief Prüft ob eine Addition möglich ist.
/** @brief Prüft ob eine Addition möglich ist. (Dimensionen exakt gleich)
*
* */
bool checkAddSub(const Matrix& b) const;
/** @brief Prüft ob eine Multiplikation möglich ist.
/** @brief Prüft ob eine Multiplikation möglich ist. dimx von Matrix a muss gleich dimy von Matrix b sein.
*
* @return bool checkMult - true wenn erlaubt, false falls nicht.
* */
bool checkMult(const Matrix& b);
/** @brief Overload des * Operators
/** @brief Overload des () Operators
*
* @param unsigned y - Zeile der Matrix
* @param unsigned x - Spalte der Matrix
......@@ -109,10 +107,10 @@ public:
* */
Matrix operator*(const Matrix& b);
/** @brief Multiplikation zweier Matrizen durch Overload des * Operators
/** @brief Multithreaded Multiplikation zweier Matrizen
*
* @param const Matrix& b
* @return Gibt eine Matrix c, das Ergebnis der Multiplikation zweier Matrizen zurück.
* @param Matrix a, Matrix b, std::size_t from, std::size_t to
* @return void
* */
void threadedmult(Matrix a, Matrix b, std::size_t from, std::size_t to);
......
......@@ -12,7 +12,7 @@ int main(){
string folderpath = "";
form_iterator fi = formData.getElement("deleteBtn");
auto fi = formData.getElement("deleteBtn");
if( !fi->isEmpty() && fi != (*formData).end()) {
folderpath = **fi;
}
......
/** @file generate.cpp
* @brief Generiert eine Matrix nach Eingabe der Dimension und legt diese im Filesystem ab.
* @brief Generiert eine Matrix nach Eingabe der Dimensionen und legt diese im Filesystem unter Json/ ab.
* */
......
/** @file list.cpp
* @brief Zeigt alle im Filesystem gespeicherten Matrizen an
* @brief Zeigt die Metadaten aller im lokalen Filesystem gespeicherten Matrizen an
*
* */
......
......@@ -50,15 +50,20 @@ int main(){
c.saveMatrix();
}else if((operation.at(0) == '*') && a.checkMult(b)) {
Matrix c(stoi(matrixA[1]),stoi(matrixB[2]));
for (size_t i = 0; i < MAX_THREADS; i++){
matrixthread[i] = thread(callMult, a, b, c, (i * tsize), (i*tsize) + tsize);
}
auto start = std::chrono::high_resolution_clock::now();
for (auto & i : matrixthread){
if(stoi(matrixA[1]) >= MAX_THREADS) {
for (size_t i = 0; i < MAX_THREADS; i++) {
matrixthread[i] = thread(callMult, a, b, c, (i * tsize), (i * tsize) + tsize - 1);
}
for (auto &i : matrixthread) {
i.join();
}
if (((stoi(matrixA[1]) / MAX_THREADS) % MAX_THREADS) != 0){
callMult(a, b, c, stoi(matrixA[1]) - ((stoi(matrixA[1]) / MAX_THREADS) % MAX_THREADS),stoi(matrixA[1]));
if (((stoi(matrixA[1]) / MAX_THREADS) % MAX_THREADS) != 0) {
callMult(a, b, c, stoi(matrixA[1]) - ((stoi(matrixA[1]) / MAX_THREADS) % MAX_THREADS),
stoi(matrixA[1]));
}
}else{
callMult(a, b, c, 0, stoi(matrixA[1]));
}
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed = end - start;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment