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 /** @file Matrix.hpp
* @brief Enthält die Klasse Matrix und alle ihre Funktionen * @brief Enthält die Klasse Matrix und alle ihre Funktionen.
*
* Es kann eine Matrix mit einer quadratischen Dimension erstellt werden.
* *
* @author Mario Bajer * @author Mario Bajer
* @version 2.1 * @version 2.1
...@@ -17,7 +15,7 @@ ...@@ -17,7 +15,7 @@
using namespace std; using namespace std;
using namespace cgicc; using namespace cgicc;
using json = nlohmann::json; //json external link using json = nlohmann::json;
/** @class Matrix /** @class Matrix
* @brief Klasse Matrix * @brief Klasse Matrix
...@@ -29,11 +27,11 @@ public: ...@@ -29,11 +27,11 @@ public:
* Initialisiert eine Matrix und speichert diese im Filesystem. * Initialisiert eine Matrix und speichert diese im Filesystem.
* @param x - Spaltenanzahl * @param x - Spaltenanzahl
* @param y - Zeilenanzahl * @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); Matrix(int x, int y);
/** @brief Printen der Matrix /** @brief Ausgeben der Matrix
* *
* @param std::ostream& - Ausgabestream für die Matrix * @param std::ostream& - Ausgabestream für die Matrix
* */ * */
...@@ -43,15 +41,15 @@ public: ...@@ -43,15 +41,15 @@ public:
* */ * */
void fillRND(); 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(); int generateID();
/** @brief Speichert die Matrix im lokalen Filesystem /** @brief Speichert die Matrix im lokalen Filesystem unter Json/
* */ * */
int saveMatrix(); 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); void getmatrixfromfile( const string& path);
...@@ -63,18 +61,18 @@ public: ...@@ -63,18 +61,18 @@ public:
* */ * */
void reset(std::size_t y, std::size_t x); 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; 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. * @return bool checkMult - true wenn erlaubt, false falls nicht.
* */ * */
bool checkMult(const Matrix& b); bool checkMult(const Matrix& b);
/** @brief Overload des * Operators /** @brief Overload des () Operators
* *
* @param unsigned y - Zeile der Matrix * @param unsigned y - Zeile der Matrix
* @param unsigned x - Spalte der Matrix * @param unsigned x - Spalte der Matrix
...@@ -109,10 +107,10 @@ public: ...@@ -109,10 +107,10 @@ public:
* */ * */
Matrix operator*(const Matrix& b); Matrix operator*(const Matrix& b);
/** @brief Multiplikation zweier Matrizen durch Overload des * Operators /** @brief Multithreaded Multiplikation zweier Matrizen
* *
* @param const Matrix& b * @param Matrix a, Matrix b, std::size_t from, std::size_t to
* @return Gibt eine Matrix c, das Ergebnis der Multiplikation zweier Matrizen zurück. * @return void
* */ * */
void threadedmult(Matrix a, Matrix b, std::size_t from, std::size_t to); void threadedmult(Matrix a, Matrix b, std::size_t from, std::size_t to);
......
...@@ -12,7 +12,7 @@ int main(){ ...@@ -12,7 +12,7 @@ int main(){
string folderpath = ""; string folderpath = "";
form_iterator fi = formData.getElement("deleteBtn"); auto fi = formData.getElement("deleteBtn");
if( !fi->isEmpty() && fi != (*formData).end()) { if( !fi->isEmpty() && fi != (*formData).end()) {
folderpath = **fi; folderpath = **fi;
} }
......
/** @file generate.cpp /** @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 /** @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(){ ...@@ -50,15 +50,20 @@ int main(){
c.saveMatrix(); c.saveMatrix();
}else if((operation.at(0) == '*') && a.checkMult(b)) { }else if((operation.at(0) == '*') && a.checkMult(b)) {
Matrix c(stoi(matrixA[1]),stoi(matrixB[2])); 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(); auto start = std::chrono::high_resolution_clock::now();
for (auto & i : matrixthread){ if(stoi(matrixA[1]) >= MAX_THREADS) {
i.join(); for (size_t i = 0; i < MAX_THREADS; i++) {
} matrixthread[i] = thread(callMult, a, b, c, (i * tsize), (i * tsize) + tsize - 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])); 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]));
}
}else{
callMult(a, b, c, 0, stoi(matrixA[1]));
} }
auto end = std::chrono::high_resolution_clock::now(); auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed = end - start; 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