From e667f285658c0a2a1af03d766e75bc76b5cdb693 Mon Sep 17 00:00:00 2001 From: Vitaly Dobrohotov <19dobrohotov99@mail.ru> Date: Sun, 13 Oct 2019 21:22:10 +0300 Subject: [PATCH 1/6] add linear alghoritm --- .../dobrohotov_vn/Lab 1/Lab 1/Lab 1.vcxproj | 9 ++ .../Lab 1/Lab 1/Lab 1.vcxproj.filters | 5 + 1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp | 105 ++++++++++++++++++ 3 files changed, 119 insertions(+) diff --git a/1706-4/dobrohotov_vn/Lab 1/Lab 1/Lab 1.vcxproj b/1706-4/dobrohotov_vn/Lab 1/Lab 1/Lab 1.vcxproj index 1a564ac..da7814b 100644 --- a/1706-4/dobrohotov_vn/Lab 1/Lab 1/Lab 1.vcxproj +++ b/1706-4/dobrohotov_vn/Lab 1/Lab 1/Lab 1.vcxproj @@ -84,7 +84,12 @@ Disabled true true + C:\Program Files %28x86%29\Microsoft SDKs\MPI\Include;%(AdditionalIncludeDirectories) + + C:\Program Files %28x86%29\Microsoft SDKs\MPI\Lib\x64;%(AdditionalLibraryDirectories) + msmpi.lib;%(AdditionalDependencies) + @@ -108,13 +113,17 @@ true true true + C:\Program Files %28x86%29\Microsoft SDKs\MPI\Include;%(AdditionalIncludeDirectories) true true + C:\Program Files %28x86%29\Microsoft SDKs\MPI\Lib\x64;%(AdditionalLibraryDirectories) + msmpi.lib;%(AdditionalDependencies) + diff --git a/1706-4/dobrohotov_vn/Lab 1/Lab 1/Lab 1.vcxproj.filters b/1706-4/dobrohotov_vn/Lab 1/Lab 1/Lab 1.vcxproj.filters index 4863ddb..41d453a 100644 --- a/1706-4/dobrohotov_vn/Lab 1/Lab 1/Lab 1.vcxproj.filters +++ b/1706-4/dobrohotov_vn/Lab 1/Lab 1/Lab 1.vcxproj.filters @@ -14,4 +14,9 @@ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + Source Files + + \ No newline at end of file diff --git a/1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp b/1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp index e69de29..76400b6 100644 --- a/1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp +++ b/1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp @@ -0,0 +1,105 @@ +#include +#include +#include +using namespace std; + +int* InitMatrix(int rows, int cols) +{ + int* vec = new int[rows*cols]; + if (rows <2 && cols < 2) + for (int i = 0; i < rows*cols; i++) + cin >> vec[i]; + else + for (int i = 0; i < rows*cols; i++) + vec[i] = rand() % 100 ; + return vec; +} +void PrintMatrix(int *vec, int rows,int cols) +{ + if (rows < 100 && cols < 100) { + cout << vec[0] << setw(2) << " "; + for (int i = 1; i < rows*cols; i++) + { + cout << setw(2) << vec[i]; + (i % (cols)) == cols - 1 ? cout << endl : cout << " "; + } + cout << endl; + } + else + cout << "Matrix too big" << endl; +} +void Tranpose(int* vec, int &rows, int &cols) +{ + int* copy= new int[rows*cols]; + for (int i = 0; i < rows*cols; i++) + copy[i] = vec[i]; + int ind = 0; + for (int i = 0; i < cols; i++) { + int n = 0; + for (int j = 0; j < rows; j++) { + vec[ind] = copy[i + n]; + ind++; + n += cols; + } + } + delete[] copy; +} + +int main(int argc,char** argv) +{ + MPI_Init(&argc, &argv); + int rows, cols; + double start_linear=0, end_linear=0; + //Input Matrix + while (1) { + cout << "Input rows and cols" << endl; + cin >> rows; + cin >> cols; + if (cols < 1 || rows < 1) + { + system("cls"); + cout << "rows and cols must be >0" << endl; + } + else + break; + } + int *vec = InitMatrix(rows, cols); + int *res = new int[cols]; + PrintMatrix(vec, rows, cols); + /*cout << endl; + for (int i = 0; i < rows*cols; i++) + cout << vec[i] << " "; + cout << endl;*/ + Tranpose(vec, rows, cols); + start_linear = MPI_Wtime(); + int max = vec[0]; + int k = 0; + for (int i = 1; i < rows*cols;i++) + { + if (max < vec[i]) + max = vec[i]; + if (i % rows == rows-1) { + res[k] = max; + k++; + max = vec[++i]; + } + } + end_linear = MPI_Wtime(); + PrintMatrix(vec, cols, rows); + /*cout << endl; + for (int i = 0; i < rows*cols; i++) + cout << vec[i] << " "; + cout << endl; + cout << endl; + cout << endl;*/ + /*for (int i = 0; i < cols; i++) + cout << res[i] << " ";*/ + cout << "time linear " << (end_linear - start_linear) << endl; + delete[]vec; + delete[]res; + MPI_Finalize(); + system("pause"); + return 0; + +} + From 51737155768f7effa06b9596918668d1bfa1bf8a Mon Sep 17 00:00:00 2001 From: Vitaly Dobrohotov <19dobrohotov99@mail.ru> Date: Mon, 14 Oct 2019 00:27:51 +0300 Subject: [PATCH 2/6] some writing but :c --- 1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp | 140 ++++++++++++------ 1706-4/dobrohotov_vn/Project1/Project1.sln | 31 ++++ .../Project1/Project1/Project1.vcxproj | 123 +++++++++++++++ .../Project1/Project1.vcxproj.filters | 22 +++ .../Project1/Project1/Source.cpp | 15 ++ 5 files changed, 286 insertions(+), 45 deletions(-) create mode 100644 1706-4/dobrohotov_vn/Project1/Project1.sln create mode 100644 1706-4/dobrohotov_vn/Project1/Project1/Project1.vcxproj create mode 100644 1706-4/dobrohotov_vn/Project1/Project1/Project1.vcxproj.filters create mode 100644 1706-4/dobrohotov_vn/Project1/Project1/Source.cpp diff --git a/1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp b/1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp index 76400b6..b5d4533 100644 --- a/1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp +++ b/1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp @@ -1,6 +1,7 @@ #include #include #include + using namespace std; int* InitMatrix(int rows, int cols) @@ -45,58 +46,107 @@ void Tranpose(int* vec, int &rows, int &cols) delete[] copy; } -int main(int argc,char** argv) +int main(int argc, char** argv) { - MPI_Init(&argc, &argv); + + int size; + int rank; int rows, cols; - double start_linear=0, end_linear=0; - //Input Matrix - while (1) { - cout << "Input rows and cols" << endl; - cin >> rows; - cin >> cols; - if (cols < 1 || rows < 1) + double start_linear = 0, end_linear = 0, + start_pp = 0, end_pp = 0; + int*vec = NULL; + int* res = NULL; + MPI_Init(&argc, &argv); + MPI_Comm_size(MPI_COMM_WORLD, &size); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Status Status; + if (size < 1){ + cout << "Error count process" << endl; + return -2; + } + if (rank == 0) { + //Input Matrix + while (1) { + cout << "Input rows and cols" << endl; + cin >> rows; + cin >> cols; + if (cols < 1 || rows < 1) + { + system("cls"); + cout << "rows and cols must be >0" << endl; + } + else + break; + } + vec = InitMatrix(rows, cols); //инциализируется матрица в виде вектора ранодомно + res = new int[cols]; // массив в котором будут хранится максимальные значения + Tranpose(vec, rows, cols); //Транспонирование матрицы (переделывание вектора) + + //Последовательный алгоритм + start_linear = MPI_Wtime(); + int max = vec[0]; + int k = 0; + for (int i = 1; i < rows*cols; i++) { - system("cls"); - cout << "rows and cols must be >0" << endl; + if (max < vec[i]) + max = vec[i]; + if (i % rows == rows - 1) { + res[k] = max; + k++; + max = vec[++i]; + } } - else - break; + end_linear = MPI_Wtime(); + + //Паралельный алгоритм + start_pp = MPI_Wtime(); + + //0 процесс рассылает размеры матрицы и вектора и матрицу + for (int i = 1; i < size; i++) { + MPI_Send(&rows, 1, MPI_INT, i, 0, MPI_COMM_WORLD); + MPI_Send(&cols, 1, MPI_INT, i, 0, MPI_COMM_WORLD); + MPI_Send(vec, rows*cols, MPI_INT, i, 0, MPI_COMM_WORLD); + } + //0 процесс собирает максимумы + for (int i = 1; i < size; i++) { + MPI_Recv(res, cols, MPI_INT, i, MPI_ANY_TAG, MPI_COMM_WORLD, &Status); + end_pp= MPI_Wtime(); + } + delete[]vec; + delete[]res; + } - int *vec = InitMatrix(rows, cols); - int *res = new int[cols]; - PrintMatrix(vec, rows, cols); - /*cout << endl; - for (int i = 0; i < rows*cols; i++) - cout << vec[i] << " "; - cout << endl;*/ - Tranpose(vec, rows, cols); - start_linear = MPI_Wtime(); - int max = vec[0]; - int k = 0; - for (int i = 1; i < rows*cols;i++) + else { - if (max < vec[i]) - max = vec[i]; - if (i % rows == rows-1) { - res[k] = max; - k++; - max = vec[++i]; - } + //процесс ожидает размеры матрицы и вектора от 0 процесса + MPI_Recv(&rows, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &Status); + MPI_Recv(&cols, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &Status); + + + vec = InitMatrix(rows, cols); //инциализируется матрица в виде вектора ранодомно + res = new int[cols]; // массив в котором будут хранится максимальные значения + + //процесс ожидает от 0 процесса матрицу + MPI_Recv(res, rows*cols, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &Status); + + //поиск максимума по столбцам + Tranpose(vec, rows, cols); + + + //процесс отсылает результат 0 процессу + MPI_Send(res, cols, MPI_INT, 0, 0, MPI_COMM_WORLD); + } - end_linear = MPI_Wtime(); - PrintMatrix(vec, cols, rows); - /*cout << endl; - for (int i = 0; i < rows*cols; i++) - cout << vec[i] << " "; - cout << endl; - cout << endl; - cout << endl;*/ - /*for (int i = 0; i < cols; i++) - cout << res[i] << " ";*/ - cout << "time linear " << (end_linear - start_linear) << endl; - delete[]vec; - delete[]res; + + + + + + + + + + // delete MPI_Finalize(); system("pause"); return 0; diff --git a/1706-4/dobrohotov_vn/Project1/Project1.sln b/1706-4/dobrohotov_vn/Project1/Project1.sln new file mode 100644 index 0000000..96dc50e --- /dev/null +++ b/1706-4/dobrohotov_vn/Project1/Project1.sln @@ -0,0 +1,31 @@ +п»ї +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.852 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Project1", "Project1\Project1.vcxproj", "{0A418464-463C-4D66-ABBA-9D804D3E5DF7}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0A418464-463C-4D66-ABBA-9D804D3E5DF7}.Debug|x64.ActiveCfg = Debug|x64 + {0A418464-463C-4D66-ABBA-9D804D3E5DF7}.Debug|x64.Build.0 = Debug|x64 + {0A418464-463C-4D66-ABBA-9D804D3E5DF7}.Debug|x86.ActiveCfg = Debug|Win32 + {0A418464-463C-4D66-ABBA-9D804D3E5DF7}.Debug|x86.Build.0 = Debug|Win32 + {0A418464-463C-4D66-ABBA-9D804D3E5DF7}.Release|x64.ActiveCfg = Release|x64 + {0A418464-463C-4D66-ABBA-9D804D3E5DF7}.Release|x64.Build.0 = Release|x64 + {0A418464-463C-4D66-ABBA-9D804D3E5DF7}.Release|x86.ActiveCfg = Release|Win32 + {0A418464-463C-4D66-ABBA-9D804D3E5DF7}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {16CCF062-B8A8-48EA-BB05-1F4F8E90D254} + EndGlobalSection +EndGlobal diff --git a/1706-4/dobrohotov_vn/Project1/Project1/Project1.vcxproj b/1706-4/dobrohotov_vn/Project1/Project1/Project1.vcxproj new file mode 100644 index 0000000..d02883e --- /dev/null +++ b/1706-4/dobrohotov_vn/Project1/Project1/Project1.vcxproj @@ -0,0 +1,123 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {0A418464-463C-4D66-ABBA-9D804D3E5DF7} + Project1 + 10.0.17763.0 + + + + Application + true + v141 + MultiByte + + + Application + false + v141 + true + MultiByte + + + Application + true + v141 + MultiByte + + + Application + false + v141 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + Level3 + Disabled + true + true + + + + + Level3 + Disabled + true + true + + + + + Level3 + MaxSpeed + true + true + true + true + + + true + true + + + + + Level3 + MaxSpeed + true + true + true + true + + + true + true + + + + + + + + + \ No newline at end of file diff --git a/1706-4/dobrohotov_vn/Project1/Project1/Project1.vcxproj.filters b/1706-4/dobrohotov_vn/Project1/Project1/Project1.vcxproj.filters new file mode 100644 index 0000000..41d453a --- /dev/null +++ b/1706-4/dobrohotov_vn/Project1/Project1/Project1.vcxproj.filters @@ -0,0 +1,22 @@ +п»ї + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + \ No newline at end of file diff --git a/1706-4/dobrohotov_vn/Project1/Project1/Source.cpp b/1706-4/dobrohotov_vn/Project1/Project1/Source.cpp new file mode 100644 index 0000000..63d256b --- /dev/null +++ b/1706-4/dobrohotov_vn/Project1/Project1/Source.cpp @@ -0,0 +1,15 @@ +#include +#include +using namespace std; + +void main() +{ + int c; + while (1) + { + c = _getch(); + if (c >= 48 && c <= 57) + break; + cout << c << endl; + } +} \ No newline at end of file From 50514d7500aa2dd67d0171522264d577391eb326 Mon Sep 17 00:00:00 2001 From: Vitaly Dobrohotov <19dobrohotov99@mail.ru> Date: Fri, 18 Oct 2019 23:32:19 +0300 Subject: [PATCH 3/6] some writing, but not work :c --- 1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp | 133 +++++++++++--------- 1 file changed, 74 insertions(+), 59 deletions(-) diff --git a/1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp b/1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp index b5d4533..bf0c33a 100644 --- a/1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp +++ b/1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp @@ -4,18 +4,23 @@ using namespace std; -int* InitMatrix(int rows, int cols) +int* InitMatrix(int rows, int cols) { int* vec = new int[rows*cols]; - if (rows <2 && cols < 2) + if (rows < 2 && cols < 2) for (int i = 0; i < rows*cols; i++) cin >> vec[i]; else for (int i = 0; i < rows*cols; i++) - vec[i] = rand() % 100 ; + vec[i] = rand() % 10000; return vec; } -void PrintMatrix(int *vec, int rows,int cols) +void PrintVector(int *x, int size) +{ + for (int i = 0; i < size; i++) + cout << x[i] << " "; +} +void PrintMatrix(int *vec, int rows, int cols) { if (rows < 100 && cols < 100) { cout << vec[0] << setw(2) << " "; @@ -29,9 +34,9 @@ void PrintMatrix(int *vec, int rows,int cols) else cout << "Matrix too big" << endl; } -void Tranpose(int* vec, int &rows, int &cols) +void Tranpose(int* vec, int &rows, int &cols) { - int* copy= new int[rows*cols]; + int* copy = new int[rows*cols]; for (int i = 0; i < rows*cols; i++) copy[i] = vec[i]; int ind = 0; @@ -46,21 +51,37 @@ void Tranpose(int* vec, int &rows, int &cols) delete[] copy; } +void Max(int *mas, int *res, int cols, int pos) +{ + int max = mas[0]; + for (int i = 1; i < cols; i++) + { + if (max < mas[i]) + max = mas[i]; + } + res[pos] = max; +} + + int main(int argc, char** argv) { - int size; - int rank; - int rows, cols; + int size; //количесво процессов + int rank; //индентификатор процесса + int rows, cols; //строкиб колонки double start_linear = 0, end_linear = 0, start_pp = 0, end_pp = 0; - int*vec = NULL; - int* res = NULL; + int* vec = NULL; //Матрица в виде вектора + int* resl = NULL; //Результирующий вектор максимумов для последовательного + int* resp = NULL; //Результирующий вектор максимумов для параллейного + int *tmp = NULL; //Локальный массив для блока + int *local_max = NULL; //здесь будут храниться локальные максимумы + int block; //Количество столбцов в блоке + int left; //Остаточные блоки MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Status Status; - if (size < 1){ + if (size < 1) { cout << "Error count process" << endl; return -2; } @@ -78,10 +99,14 @@ int main(int argc, char** argv) else break; } - vec = InitMatrix(rows, cols); //инциализируется матрица в виде вектора ранодомно - res = new int[cols]; // массив в котором будут хранится максимальные значения + vec = InitMatrix(rows, cols); //инциализируется матрица в виде вектора рандомно + block = cols / size; //в блоке n-ое кол во столбцов + tmp = new int[cols*block]; // промежуточный массив для частей вектора + local_max = new int[block]; + resl = new int[cols]; // массив в котором будут хранится максимальные значения + resp = new int[cols]; // массив в котором будут хранится максимальные значения + left = cols % size; //остаточные столбцы которые не попадут на процессы Tranpose(vec, rows, cols); //Транспонирование матрицы (переделывание вектора) - //Последовательный алгоритм start_linear = MPI_Wtime(); int max = vec[0]; @@ -91,64 +116,54 @@ int main(int argc, char** argv) if (max < vec[i]) max = vec[i]; if (i % rows == rows - 1) { - res[k] = max; + resl[k] = max; k++; max = vec[++i]; } } end_linear = MPI_Wtime(); - + PrintVector(resl, cols); //Паралельный алгоритм start_pp = MPI_Wtime(); - - //0 процесс рассылает размеры матрицы и вектора и матрицу - for (int i = 1; i < size; i++) { - MPI_Send(&rows, 1, MPI_INT, i, 0, MPI_COMM_WORLD); - MPI_Send(&cols, 1, MPI_INT, i, 0, MPI_COMM_WORLD); - MPI_Send(vec, rows*cols, MPI_INT, i, 0, MPI_COMM_WORLD); + //MPI_Bcast(&block, 1, MPI_INT, 0, MPI_COMM_WORLD); + MPI_Bcast(&cols, 1, MPI_INT, 0, MPI_COMM_WORLD); + MPI_Scatter(vec, cols*block, MPI_INT, tmp, cols*block, MPI_INT, 0, MPI_COMM_WORLD); + int c = 0; + for (int i = 0; i < block; i++) { + Max(tmp + c, local_max, cols, i); + c += cols; } - //0 процесс собирает максимумы - for (int i = 1; i < size; i++) { - MPI_Recv(res, cols, MPI_INT, i, MPI_ANY_TAG, MPI_COMM_WORLD, &Status); - end_pp= MPI_Wtime(); + } + else + { + cols = 0; + block = 0; + tmp = new int[cols*block]; // промежуточный массив для частей вектора + resp = new int[cols]; // массив в котором будут хранится максимальные значения + local_max = new int[block]; + int c = 0; + for (int i = 0; i < block; i++) { + Max(tmp + c, local_max, cols, i); + c += cols; } - delete[]vec; - delete[]res; - } - else + if (rank == 0) { - //процесс ожидает размеры матрицы и вектора от 0 процесса - MPI_Recv(&rows, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &Status); - MPI_Recv(&cols, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &Status); - - - vec = InitMatrix(rows, cols); //инциализируется матрица в виде вектора ранодомно - res = new int[cols]; // массив в котором будут хранится максимальные значения - - //процесс ожидает от 0 процесса матрицу - MPI_Recv(res, rows*cols, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &Status); - - //поиск максимума по столбцам - Tranpose(vec, rows, cols); - - - //процесс отсылает результат 0 процессу - MPI_Send(res, cols, MPI_INT, 0, 0, MPI_COMM_WORLD); + MPI_Gather(local_max, 3, MPI_INT, resp, 3, MPI_INT, 0, MPI_COMM_WORLD); + if (left != 0) + for (int i = 0; i < left; i++) + { + } + cout << "PP" << endl; + PrintVector(resp, cols); } - - - - - - - - + end_pp = MPI_Wtime(); - // delete + delete[]vec; + delete[]resl; + delete[]resp; MPI_Finalize(); - system("pause"); return 0; } From 4d5d6b3394e548b785fd6f38138d5ce3bb6fe903 Mon Sep 17 00:00:00 2001 From: Vitaly Dobrohotov <19dobrohotov99@mail.ru> Date: Sat, 19 Oct 2019 22:54:26 +0300 Subject: [PATCH 4/6] lab done but need to clean code for terminal class --- 1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp | 127 ++++++++++-------- 1706-4/dobrohotov_vn/Project1/Project1.sln | 31 ----- .../Project1/Project1/Project1.vcxproj | 123 ----------------- .../Project1/Project1.vcxproj.filters | 22 --- .../Project1/Project1/Source.cpp | 15 --- 5 files changed, 73 insertions(+), 245 deletions(-) delete mode 100644 1706-4/dobrohotov_vn/Project1/Project1.sln delete mode 100644 1706-4/dobrohotov_vn/Project1/Project1/Project1.vcxproj delete mode 100644 1706-4/dobrohotov_vn/Project1/Project1/Project1.vcxproj.filters delete mode 100644 1706-4/dobrohotov_vn/Project1/Project1/Source.cpp diff --git a/1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp b/1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp index bf0c33a..da4ae73 100644 --- a/1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp +++ b/1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp @@ -20,6 +20,15 @@ void PrintVector(int *x, int size) for (int i = 0; i < size; i++) cout << x[i] << " "; } +void PrintInfo(int rank, int size, int block, int rows, int cols, int *tmp, int *local_max) +{ + cout << "\nInformation\nProcess " << rank << "\n" << "Size " << size << "\n" << "block " << block << "\n" << "rows " << rows << "\n" << "cols " << cols << endl; + + for (int i = 0; i < rows*block; i++) + cout << " tmp " << rank << " " << tmp[i] << " "; + for (int i = 0; i < block; i++) + cout << "local max " << rank << " " << local_max[i] << " "; +} void PrintMatrix(int *vec, int rows, int cols) { if (rows < 100 && cols < 100) { @@ -34,7 +43,7 @@ void PrintMatrix(int *vec, int rows, int cols) else cout << "Matrix too big" << endl; } -void Tranpose(int* vec, int &rows, int &cols) +void Tranpose(int* vec, int rows, int cols) { int* copy = new int[rows*cols]; for (int i = 0; i < rows*cols; i++) @@ -62,10 +71,8 @@ void Max(int *mas, int *res, int cols, int pos) res[pos] = max; } - -int main(int argc, char** argv) +int main(int argc, char ** argv) { - int size; //количесво процессов int rank; //индентификатор процесса int rows, cols; //строкиб колонки @@ -73,7 +80,7 @@ int main(int argc, char** argv) start_pp = 0, end_pp = 0; int* vec = NULL; //Матрица в виде вектора int* resl = NULL; //Результирующий вектор максимумов для последовательного - int* resp = NULL; //Результирующий вектор максимумов для параллейного + int *resp;//=NULL; //= NULL; //Результирующий вектор максимумов для параллейного int *tmp = NULL; //Локальный массив для блока int *local_max = NULL; //здесь будут храниться локальные максимумы int block; //Количество столбцов в блоке @@ -99,72 +106,84 @@ int main(int argc, char** argv) else break; } + if (cols < size) //Если колонок меньше чем процессов, не задействовать все процессы, а столько сколько нужно + size = cols; vec = InitMatrix(rows, cols); //инциализируется матрица в виде вектора рандомно block = cols / size; //в блоке n-ое кол во столбцов - tmp = new int[cols*block]; // промежуточный массив для частей вектора + left = cols % size; //остаточные столбцы которые не попадут на процессы + tmp = new int[rows*block]; // промежуточный массив для частей вектора local_max = new int[block]; resl = new int[cols]; // массив в котором будут хранится максимальные значения - resp = new int[cols]; // массив в котором будут хранится максимальные значения - left = cols % size; //остаточные столбцы которые не попадут на процессы + //resp = new int[cols]; // массив в котором будут хранится максимальные значения + /*resp = new vector (); + resp->resize(cols);*/ + PrintMatrix(vec, rows, cols); Tranpose(vec, rows, cols); //Транспонирование матрицы (переделывание вектора) - //Последовательный алгоритм - start_linear = MPI_Wtime(); - int max = vec[0]; - int k = 0; - for (int i = 1; i < rows*cols; i++) - { - if (max < vec[i]) - max = vec[i]; - if (i % rows == rows - 1) { - resl[k] = max; - k++; - max = vec[++i]; - } - } - end_linear = MPI_Wtime(); - PrintVector(resl, cols); - //Паралельный алгоритм - start_pp = MPI_Wtime(); - //MPI_Bcast(&block, 1, MPI_INT, 0, MPI_COMM_WORLD); - MPI_Bcast(&cols, 1, MPI_INT, 0, MPI_COMM_WORLD); - MPI_Scatter(vec, cols*block, MPI_INT, tmp, cols*block, MPI_INT, 0, MPI_COMM_WORLD); - int c = 0; - for (int i = 0; i < block; i++) { - Max(tmp + c, local_max, cols, i); - c += cols; - } } - else + MPI_Bcast(&size, 1, MPI_INT, 0, MPI_COMM_WORLD); + MPI_Bcast(&block, 1, MPI_INT, 0, MPI_COMM_WORLD); + MPI_Bcast(&rows, 1, MPI_INT, 0, MPI_COMM_WORLD); + MPI_Bcast(&cols, 1, MPI_INT, 0, MPI_COMM_WORLD); + resp = new int[cols]; // массив в котором будут хранится максимальные значения + if (rank > 0) { - cols = 0; - block = 0; - tmp = new int[cols*block]; // промежуточный массив для частей вектора - resp = new int[cols]; // массив в котором будут хранится максимальные значения + tmp = new int[rows*block]; // промежуточный массив для частей вектора + //resp = new int[cols]; // массив в котором будут хранится максимальные значения + /*resp = new vector (); + resp->resize(cols);*/ local_max = new int[block]; - int c = 0; - for (int i = 0; i < block; i++) { - Max(tmp + c, local_max, cols, i); - c += cols; + } + MPI_Scatter(vec, rows*block, MPI_INT, tmp, rows*block, MPI_INT, 0, MPI_COMM_WORLD); + //Поиск максимума по столбцам и занесение его в массив локальных сумм + int c = 0; //Смещение + for (int i = 0; i < block; i++) + { + int max = tmp[0 + c]; + for (int j = 1; j < rows; j++) + { + if (tmp[j + c] > max) + max = tmp[j + c]; } + c += rows; + local_max[i] = max; } + PrintInfo(rank, size, block, rows, cols, tmp, local_max); + + MPI_Gather(local_max, block, MPI_INT, resp, block, MPI_INT, 0, MPI_COMM_WORLD); + if (rank == 0) + for (int i = 0; i < cols; i++) + cout << " max vector" << resp[i] << " "; + //Считаются столбцы которые не попали на процессы if (rank == 0) - { - MPI_Gather(local_max, 3, MPI_INT, resp, 3, MPI_INT, 0, MPI_COMM_WORLD); if (left != 0) + { + int c = 0; //Смещение for (int i = 0; i < left; i++) { - + int max = vec[rows*size + c]; + for (int j = 1; j < rows; j++) + { + if (vec[j + rows * size + c] > max) + max = vec[j + rows * size + c]; + } + c += rows; + resp[i + size] = max; } - cout << "PP" << endl; - PrintVector(resp, cols); + } + if (rank == 0) + { + cout << "\nafter" << endl; + for (int i = 0; i < cols; i++) + cout << " max vector" << resp[i] << " "; } - end_pp = MPI_Wtime(); + //MPI_Barrier(MPI_COMM_WORLD); + /*cout << "Process " << rank << endl; + cout << " Size " << size << endl; + cout << "Block " << block;*/ delete[]vec; delete[]resl; - delete[]resp; - MPI_Finalize(); - return 0; - -} + //delete[]resp; + MPI_Finalize(); +} \ No newline at end of file diff --git a/1706-4/dobrohotov_vn/Project1/Project1.sln b/1706-4/dobrohotov_vn/Project1/Project1.sln deleted file mode 100644 index 96dc50e..0000000 --- a/1706-4/dobrohotov_vn/Project1/Project1.sln +++ /dev/null @@ -1,31 +0,0 @@ -п»ї -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.852 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Project1", "Project1\Project1.vcxproj", "{0A418464-463C-4D66-ABBA-9D804D3E5DF7}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {0A418464-463C-4D66-ABBA-9D804D3E5DF7}.Debug|x64.ActiveCfg = Debug|x64 - {0A418464-463C-4D66-ABBA-9D804D3E5DF7}.Debug|x64.Build.0 = Debug|x64 - {0A418464-463C-4D66-ABBA-9D804D3E5DF7}.Debug|x86.ActiveCfg = Debug|Win32 - {0A418464-463C-4D66-ABBA-9D804D3E5DF7}.Debug|x86.Build.0 = Debug|Win32 - {0A418464-463C-4D66-ABBA-9D804D3E5DF7}.Release|x64.ActiveCfg = Release|x64 - {0A418464-463C-4D66-ABBA-9D804D3E5DF7}.Release|x64.Build.0 = Release|x64 - {0A418464-463C-4D66-ABBA-9D804D3E5DF7}.Release|x86.ActiveCfg = Release|Win32 - {0A418464-463C-4D66-ABBA-9D804D3E5DF7}.Release|x86.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {16CCF062-B8A8-48EA-BB05-1F4F8E90D254} - EndGlobalSection -EndGlobal diff --git a/1706-4/dobrohotov_vn/Project1/Project1/Project1.vcxproj b/1706-4/dobrohotov_vn/Project1/Project1/Project1.vcxproj deleted file mode 100644 index d02883e..0000000 --- a/1706-4/dobrohotov_vn/Project1/Project1/Project1.vcxproj +++ /dev/null @@ -1,123 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 15.0 - {0A418464-463C-4D66-ABBA-9D804D3E5DF7} - Project1 - 10.0.17763.0 - - - - Application - true - v141 - MultiByte - - - Application - false - v141 - true - MultiByte - - - Application - true - v141 - MultiByte - - - Application - false - v141 - true - MultiByte - - - - - - - - - - - - - - - - - - - - - - - Level3 - Disabled - true - true - - - - - Level3 - Disabled - true - true - - - - - Level3 - MaxSpeed - true - true - true - true - - - true - true - - - - - Level3 - MaxSpeed - true - true - true - true - - - true - true - - - - - - - - - \ No newline at end of file diff --git a/1706-4/dobrohotov_vn/Project1/Project1/Project1.vcxproj.filters b/1706-4/dobrohotov_vn/Project1/Project1/Project1.vcxproj.filters deleted file mode 100644 index 41d453a..0000000 --- a/1706-4/dobrohotov_vn/Project1/Project1/Project1.vcxproj.filters +++ /dev/null @@ -1,22 +0,0 @@ -п»ї - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;hm;inl;inc;ipp;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - \ No newline at end of file diff --git a/1706-4/dobrohotov_vn/Project1/Project1/Source.cpp b/1706-4/dobrohotov_vn/Project1/Project1/Source.cpp deleted file mode 100644 index 63d256b..0000000 --- a/1706-4/dobrohotov_vn/Project1/Project1/Source.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include -#include -using namespace std; - -void main() -{ - int c; - while (1) - { - c = _getch(); - if (c >= 48 && c <= 57) - break; - cout << c << endl; - } -} \ No newline at end of file From 6f27d0157c2fab9858caa225ccaa728cd7285c37 Mon Sep 17 00:00:00 2001 From: Vitaly Dobrohotov <19dobrohotov99@mail.ru> Date: Sat, 19 Oct 2019 23:57:52 +0300 Subject: [PATCH 5/6] clean code and find error --- 1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp | 66 ++++++++++++--------- 1 file changed, 39 insertions(+), 27 deletions(-) diff --git a/1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp b/1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp index da4ae73..b3b3c1a 100644 --- a/1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp +++ b/1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp @@ -17,8 +17,11 @@ int* InitMatrix(int rows, int cols) } void PrintVector(int *x, int size) { - for (int i = 0; i < size; i++) - cout << x[i] << " "; + if (size < 50) + for (int i = 0; i < size; i++) + cout << x[i] << " "; + else + cout << "Vector too large" << endl; } void PrintInfo(int rank, int size, int block, int rows, int cols, int *tmp, int *local_max) { @@ -41,7 +44,7 @@ void PrintMatrix(int *vec, int rows, int cols) cout << endl; } else - cout << "Matrix too big" << endl; + cout << "Matrix too large" << endl; } void Tranpose(int* vec, int rows, int cols) { @@ -106,20 +109,36 @@ int main(int argc, char ** argv) else break; } + //Initialize if (cols < size) //Если колонок меньше чем процессов, не задействовать все процессы, а столько сколько нужно size = cols; vec = InitMatrix(rows, cols); //инциализируется матрица в виде вектора рандомно + Tranpose(vec, rows, cols); //Транспонирование матрицы (переделывание вектора) block = cols / size; //в блоке n-ое кол во столбцов left = cols % size; //остаточные столбцы которые не попадут на процессы tmp = new int[rows*block]; // промежуточный массив для частей вектора local_max = new int[block]; - resl = new int[cols]; // массив в котором будут хранится максимальные значения - //resp = new int[cols]; // массив в котором будут хранится максимальные значения - /*resp = new vector (); - resp->resize(cols);*/ PrintMatrix(vec, rows, cols); - Tranpose(vec, rows, cols); //Транспонирование матрицы (переделывание вектора) + + //Linear algorithm + resl = new int[cols]; // массив в котором будут хранится максимальные значения линейного алгоритма + start_linear = MPI_Wtime(); + int max = vec[0]; + int k = 0; + for (int i = 1; i < rows*cols; i++) + { + if (max < vec[i]) + max = vec[i]; + if (i % rows == rows - 1) { + resl[k] = max; + k++; + max = vec[++i]; + } + } + end_linear = MPI_Wtime(); } + //parellel algorithm + start_pp = MPI_Wtime(); MPI_Bcast(&size, 1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(&block, 1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(&rows, 1, MPI_INT, 0, MPI_COMM_WORLD); @@ -128,9 +147,6 @@ int main(int argc, char ** argv) if (rank > 0) { tmp = new int[rows*block]; // промежуточный массив для частей вектора - //resp = new int[cols]; // массив в котором будут хранится максимальные значения - /*resp = new vector (); - resp->resize(cols);*/ local_max = new int[block]; } MPI_Scatter(vec, rows*block, MPI_INT, tmp, rows*block, MPI_INT, 0, MPI_COMM_WORLD); @@ -147,16 +163,12 @@ int main(int argc, char ** argv) c += rows; local_max[i] = max; } - PrintInfo(rank, size, block, rows, cols, tmp, local_max); - MPI_Gather(local_max, block, MPI_INT, resp, block, MPI_INT, 0, MPI_COMM_WORLD); - if (rank == 0) - for (int i = 0; i < cols; i++) - cout << " max vector" << resp[i] << " "; //Считаются столбцы которые не попали на процессы if (rank == 0) if (left != 0) { + cout << "i am in left" << endl; int c = 0; //Смещение for (int i = 0; i < left; i++) { @@ -170,20 +182,20 @@ int main(int argc, char ** argv) resp[i + size] = max; } } - if (rank == 0) + end_pp = MPI_Wtime(); + if (rank == 0) { - cout << "\nafter" << endl; - for (int i = 0; i < cols; i++) - cout << " max vector" << resp[i] << " "; + PrintVector(resl,cols); + cout << endl; + PrintVector(resp, cols); + cout << endl; + cout << "time linear " << (end_linear - start_linear) * 1000 << endl; + cout << "time parallel " << (end_pp - start_pp) * 1000 << endl; } - //MPI_Barrier(MPI_COMM_WORLD); - - /*cout << "Process " << rank << endl; - cout << " Size " << size << endl; - cout << "Block " << block;*/ delete[]vec; delete[]resl; - //delete[]resp; - + delete[]resp; + delete[] tmp; + delete[] local_max; MPI_Finalize(); } \ No newline at end of file From f088970fea755560a0153658027d35129744a7c3 Mon Sep 17 00:00:00 2001 From: Vitaly Dobrohotov <19dobrohotov99@mail.ru> Date: Sun, 20 Oct 2019 00:55:55 +0300 Subject: [PATCH 6/6] fix errors --- 1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp b/1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp index b3b3c1a..ba0374d 100644 --- a/1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp +++ b/1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp @@ -113,12 +113,12 @@ int main(int argc, char ** argv) if (cols < size) //Если колонок меньше чем процессов, не задействовать все процессы, а столько сколько нужно size = cols; vec = InitMatrix(rows, cols); //инциализируется матрица в виде вектора рандомно + PrintMatrix(vec, rows, cols); Tranpose(vec, rows, cols); //Транспонирование матрицы (переделывание вектора) block = cols / size; //в блоке n-ое кол во столбцов left = cols % size; //остаточные столбцы которые не попадут на процессы tmp = new int[rows*block]; // промежуточный массив для частей вектора local_max = new int[block]; - PrintMatrix(vec, rows, cols); //Linear algorithm resl = new int[cols]; // массив в котором будут хранится максимальные значения линейного алгоритма @@ -172,14 +172,14 @@ int main(int argc, char ** argv) int c = 0; //Смещение for (int i = 0; i < left; i++) { - int max = vec[rows*size + c]; + int max = vec[rows*size*block + c]; for (int j = 1; j < rows; j++) { - if (vec[j + rows * size + c] > max) - max = vec[j + rows * size + c]; + if (vec[j + rows * size * block + c] > max) + max = vec[j + rows * size *block + c]; } c += rows; - resp[i + size] = max; + resp[i + size*block] = max; } } end_pp = MPI_Wtime(); @@ -194,7 +194,7 @@ int main(int argc, char ** argv) } delete[]vec; delete[]resl; - delete[]resp; + //delete[]resp; delete[] tmp; delete[] local_max; MPI_Finalize();