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();