diff --git a/1706-4/brazhnikov_ea/OpenMPFoxAlg/OpenMP.sln b/1706-4/brazhnikov_ea/OpenMPFoxAlg/OpenMP.sln new file mode 100644 index 0000000..9555c72 --- /dev/null +++ b/1706-4/brazhnikov_ea/OpenMPFoxAlg/OpenMP.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29613.14 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OpenMP", "OpenMP.vcxproj", "{1B1C8D32-78CD-45DF-9974-696CB25F6C82}" +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 + {1B1C8D32-78CD-45DF-9974-696CB25F6C82}.Debug|x64.ActiveCfg = Debug|x64 + {1B1C8D32-78CD-45DF-9974-696CB25F6C82}.Debug|x64.Build.0 = Debug|x64 + {1B1C8D32-78CD-45DF-9974-696CB25F6C82}.Debug|x86.ActiveCfg = Debug|Win32 + {1B1C8D32-78CD-45DF-9974-696CB25F6C82}.Debug|x86.Build.0 = Debug|Win32 + {1B1C8D32-78CD-45DF-9974-696CB25F6C82}.Release|x64.ActiveCfg = Release|x64 + {1B1C8D32-78CD-45DF-9974-696CB25F6C82}.Release|x64.Build.0 = Release|x64 + {1B1C8D32-78CD-45DF-9974-696CB25F6C82}.Release|x86.ActiveCfg = Release|Win32 + {1B1C8D32-78CD-45DF-9974-696CB25F6C82}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {6C4D8EEB-51FE-4154-99E4-CDCA1A9EC6A1} + EndGlobalSection +EndGlobal diff --git a/1706-4/brazhnikov_ea/OpenMPFoxAlg/OpenMP.vcxproj b/1706-4/brazhnikov_ea/OpenMPFoxAlg/OpenMP.vcxproj new file mode 100644 index 0000000..c4f34d3 --- /dev/null +++ b/1706-4/brazhnikov_ea/OpenMPFoxAlg/OpenMP.vcxproj @@ -0,0 +1,154 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + {1B1C8D32-78CD-45DF-9974-696CB25F6C82} + OpenMP + 10.0 + + + + Application + true + v142 + Unicode + + + Application + false + v142 + true + Unicode + + + Application + true + v142 + Unicode + + + Application + false + v142 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + true + /Zc:twoPhase- %(AdditionalOptions) + + + Console + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + true + /Zc:twoPhase- %(AdditionalOptions) + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + true + /Zc:twoPhase- %(AdditionalOptions) + + + Console + true + true + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + true + /Zc:twoPhase- %(AdditionalOptions) + + + Console + true + true + true + + + + + + + + + \ No newline at end of file diff --git a/1706-4/brazhnikov_ea/OpenMPFoxAlg/OpenMP.vcxproj.filters b/1706-4/brazhnikov_ea/OpenMPFoxAlg/OpenMP.vcxproj.filters new file mode 100644 index 0000000..7e02311 --- /dev/null +++ b/1706-4/brazhnikov_ea/OpenMPFoxAlg/OpenMP.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 + + + + + Файлы ресурсов + + + \ No newline at end of file diff --git a/1706-4/brazhnikov_ea/OpenMPFoxAlg/OpenMP.vcxproj.user b/1706-4/brazhnikov_ea/OpenMPFoxAlg/OpenMP.vcxproj.user new file mode 100644 index 0000000..88a5509 --- /dev/null +++ b/1706-4/brazhnikov_ea/OpenMPFoxAlg/OpenMP.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/1706-4/brazhnikov_ea/OpenMPFoxAlg/Source.cpp b/1706-4/brazhnikov_ea/OpenMPFoxAlg/Source.cpp new file mode 100644 index 0000000..3be3aee --- /dev/null +++ b/1706-4/brazhnikov_ea/OpenMPFoxAlg/Source.cpp @@ -0,0 +1,167 @@ +#include +#include +#include +#include + +using namespace std; + +void PrintMatrix(double* matrix, int N) { + + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) + { + cout.width(3); + cout << matrix[i * N + j] << " "; + } + cout << endl; + } + cout << endl; +} + +void MatrixCreate(double* A, double* B, double* C, double *CSeq, int size) { + for (int i = 0; i < size * size; ++i) { + A[i] = rand() % 10 + 1; + B[i] = rand() % 10 + 1; + C[i] = 0; + CSeq[i] = 0; + } +} + +bool matComparison(double* A, double* B, int size) +{ + for (int i = 0; i < size; i++) { + for (int j = 0; j < size; j++) + { + if (A[i * size + j] != B[i * size + j]) + return false; + } + } + return true; +} + + +void Multiplication(double* Ablock, double* Bblock, double* Cblock, int _blockSize) +{ + double temp; + for (int i = 0; i < _blockSize; i++) + for (int j = 0; j < _blockSize; j++) { + temp = 0; + for (int k = 0; k < _blockSize; k++) + temp += Ablock[i * _blockSize + k] * Bblock[k * _blockSize + j]; + Cblock[i * _blockSize + j] += static_cast(temp * 100) / 100; + } +} + +void SequentialAlgorithm(double* A, double* B, double* C, int size) { + for (int i = 0; i < size * size; ++i) + C[i] = 0; + Multiplication(A, B, C, size); +} + +void Fox(double* A, double* B, double* C, int size, int procNum) { + int Grid = int(sqrt(procNum)); + int BlockSize = size / Grid; + omp_set_num_threads(procNum); +#pragma omp parallel + { + int numThreads = omp_get_thread_num(); + int RowIndex = numThreads / Grid; + int ColIndex = numThreads % Grid; + for (int iter = 0; iter < Grid; iter++) + { + for (int i = RowIndex * BlockSize; i < (RowIndex + 1) * BlockSize; i++) + { + for (int j = ColIndex * BlockSize; j < (ColIndex + 1) * BlockSize; j++) + { + for (int k = iter * BlockSize; k < (iter + 1) * BlockSize; k++) + { + C[i * size + j] += A[i * size + k] * B[k * size + j]; + } + } + } + } + } //pragma parallel +} + +int main(int argc, char* argv[]) +{ + double* A; + double* B; + double* CSeq; + double* CFox; + int size, procNum; + double StartFoxAlg = 0, FinFoxAlg = 0, StartSeqAlg = 0, FinSeqAlg = 0; //time + + cout << "input the size and then the procnun: " << endl; + + if (argc > 1) { + size = atoi(argv[1]); + procNum = atoi(argv[2]); + } + else { + cout << "Input the size of matrix and then procnum: " << endl; + cin >> size; + cin >> procNum; + } + + int BlockSize = int(sqrt(procNum)); + + if (BlockSize * BlockSize == procNum && size % BlockSize == 0) { + + + // + A = new double[size * size]; + B = new double[size * size]; + CSeq = new double[size * size]; + CFox = new double[size * size]; + MatrixCreate(A, B, CFox, CSeq,size); + // + + // + if (size < 30) { + cout << "Matrix A" << endl; + PrintMatrix(A, size); + cout << "Matrix B" << endl; + PrintMatrix(B, size); + } + // + + //FoxAlgPar + if (procNum != 1) { + StartFoxAlg = omp_get_wtime(); //omp_get_wtime (); + Fox(A, B, CFox, size, procNum); + FinFoxAlg = omp_get_wtime(); + } + // + + //FoxAlgSeq + StartSeqAlg = omp_get_wtime(); //omp_get_wtime (); + SequentialAlgorithm(A, B, CSeq, size); + FinSeqAlg = omp_get_wtime(); + // + + // + if (size < 30) { + cout << "Parallel Alg " << endl; + PrintMatrix(CFox, size); + } + if (size < 30) { + cout << "Seq Alg " << endl; + PrintMatrix(CSeq, size); + } + + if (matComparison(CFox, CSeq, size)) + cout << "Matrix identical\n" << endl; + + cout << "time of parallel alg is " << (FinFoxAlg - StartFoxAlg) << endl; + cout << "time of seq alg is " << (FinSeqAlg - StartSeqAlg) << endl; + // + + delete[] A, B, CSeq, CFox; + } + else + { + cout << "Error" << endl; + } + +} \ No newline at end of file