From ef4acd4ec660e1755b20ed0b28c4514f66825e13 Mon Sep 17 00:00:00 2001 From: yasha Date: Sun, 15 Dec 2024 01:24:02 +0400 Subject: [PATCH] fadeeva_nastya_lab_5 --- fadeeva_nastya_lab_5/README.md | 32 +++++++++++++++++ fadeeva_nastya_lab_5/RVIP_lab_5.png | Bin 0 -> 49026 bytes fadeeva_nastya_lab_5/main.py | 54 ++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+) create mode 100644 fadeeva_nastya_lab_5/README.md create mode 100644 fadeeva_nastya_lab_5/RVIP_lab_5.png create mode 100644 fadeeva_nastya_lab_5/main.py diff --git a/fadeeva_nastya_lab_5/README.md b/fadeeva_nastya_lab_5/README.md new file mode 100644 index 0000000..8cb002e --- /dev/null +++ b/fadeeva_nastya_lab_5/README.md @@ -0,0 +1,32 @@ +# Лабораторная работа №5 - Параллельное умножение матриц + +## Задание + +Требуется реализовать умножение двух больших квадратных матриц. +Надо сделать два алгоритма: обычный и параллельный. В параллельном алгоритме предусмотреть ручное задание количества потоков, каждый из которых будет выполнять умножение элементов матрицы в рамках своей зоны ответственности. + +## Описание работы + +Функция **benchmark** выполняет бенчмарк для матриц заданного размера. + +Генерируются две матрицы **matrix1** и **matrix2** заданного размера. + +После вызываются соответствующие методы для вычисления произведения матриц: ++ **multiply_matrices** - для обычного умножения ++ **multiply_matrices_parallel** - для параллельного умножения + +Прописываем бенчмарк (**benchmark**) для сравнения производительности, где генерируется две случайные матрицы заданного размера с помощью **random** и измеряется время выполнения каждого из методов с использованием функции **time.time()**. Функция **benchmark** вызывается трижды с различными размерами матриц (100x100, 300x300 и 500x500). + +### Результат работы программы + +![](RVIP_lab_5.png "") + +## Вывод + +Параллельный подход может быть более эффективным, чем последовательный, при работе с большими матрицами, поскольку он позволяет выполнять операции параллельно. +Это имеет смысл использовать при работе с крупными матрицами, где выигрыш от параллельных вычислений компенсирует затраты на управление потоками. +Однако для небольших матриц может быть более эффективным использовать обычное выполнение. + +# Видеозапись работы програмы + +https://vkvideo.ru/video186826232_456239556 diff --git a/fadeeva_nastya_lab_5/RVIP_lab_5.png b/fadeeva_nastya_lab_5/RVIP_lab_5.png new file mode 100644 index 0000000000000000000000000000000000000000..e5deb22d27f8f22c8c183a4108b634165e4c1af6 GIT binary patch literal 49026 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νJoejP>02W;NfpsHPoD!vis&VbgH|yktvOp<1RzFx4WPEj6+&elBk}V#T_M%3Ra)+ z6l!fC$Kzg$olBU;Ux*3RD-=I%#R2MkNsX)OiUVzuqn2;@_ir# zd}|@#4_$Mq!Juv{3;(7*I|L3CB$q!(lyiinvu*Ypqs8M+kh9*a$f zR#@8~br29cIS43U65@d%T)0Qtl{nsM_pvzUmR|Q+mZLQM>8`Th=?$&CR%iOw?){LY zd%xViU%2-h`sux2mie`KYE461X`7v7`C^z%$i+6bfUJ?khf*D8$EQXTfnVV05g?{t z%$mQ8Q6&pBNVp`Lu!F2eE&wOMJSS(wp?U+b?mR_v8|_-7Ba!vE8raU$j<;@ z4y4ts3+jcIXVH0vRiYE6a5#!FGY_*G%_*QtKvEm_Ht{c^ zzu=fss=JY{(k$im8P*XE7~pBsuYNwLSg)s(4Up>T#axLGtmBK5$ozZXd>jVJ$`K#5 zbIa_NjN>^M?AnsccSmOUeN}eSo&hxi9p!O8s**OcDzAI)>@zC-R9BWJj>eb@?d@=H zyu=MWfnng-E_SqGj&nI)`xxD!+Igcv&IatGtLFh#p^5v4C(h8r?F)BZ3ttkJ9rq7a z)=)T3i3QwU!i7#hpa}3QsnaO6fX7mKJq3w%6d!(cbPGq4gNuXW>^VgsPp+kAPK#`fhV0`Lt9Yp(U zQAblR>@)+`wqLUwJMPjrh}q8OE!)^&BL(X!kEN+sIQUA)3ERs!0I^yMl7INqOz0m9BpJOB<}ZeDmT*$?zk(7qKI3ieob zZI8NfI+m^k=5X_ewNmZomsZ0Eri+)t4TYo#Eo;cCkqlEZ6RuDdRGh&-7hsOTN$><1 z!b2|2`#>}8t|n$onCDD!C2Bw7{f73s;PO^EyC%5?$hA%OibEPiKgX#Ct?^L!5f?!f z{K5gj1!#gCxY|!{_>|CKh5VUJIFH>Ihhe<`!c&NhZ_1|Lde(Nm^?53%%;yxiB3}U6 zg>E?CyJmNU&{9v!DO_lEZI{##`{0aFQ}OMl))k1YM+oPZ>mN!R6msaV_ArB9=W{K{`Sx{F!&Xq>bMChx&5m^ZxR;hU2& z9Tt0sg9aw0GKv}F5Pk}j1S`{trg*=>gg)l%O$Qt$w(VfDEAC75MdmrN!`>}l>@C)O zMZ=!ME0(!(0*Njv{Dk3c3hmddJrJWuJz+rnu7knL8vlkr^TB>pW9hdE_rTm|fq^%- z*-xNzea{G48w-dVl&XnGVB;)T%GVAzxFCeOQWN*eGOS1T(~+(ZhH702G|?u{YE~;Z%L>i=S%-^1a;MK>*ElRd8WOUNupAK0$$j`-ueN>N-6o1jAn1~K5C}7;b!c(wXmHKz+ z6Qy^F4jo!x05-bFt7!^g4gR`Ih%uy=rYfgIXoD`DYy!r{mXsI^*{}Iqg(JLSYw2N< zNgGLesQXq!OAu|bwe`@Vx9(Lo{aTwHg3Rm=W-~O(qRu^LCSoGl>6BRZYHs8W=*6nO z_(;h=AcE&TXEO#?ZPbu1D|wP_A^MP+%{!Ne94!A42j$6Sf*Y`StOoIVh8y+wpKf6D zdM%gcFtKYN@?fAcYS_#s_-%WMD#ED=dskFg8d1+vfDB~WXB>l1oyG}2Y3q>$lEZbG zji#5C^X&q-0_HhcO61Rn--(EElc3A_L&spg@|i9!5*sw*H?k8oAjq{@xToD@mbH)E zc9L;Y@n-nXe^tEc=8Te`wexwyP_3r*x9JPl**kZ4+U`NhrNk9fbp~v(lmmFjcjh$z^;lIH!6tZYvm^248N;>K`wXH79&D3h!INcqQm&H0 zGs_nABoGm9&RUe8dHJ@qAzkSwFWunFqTOZ=ul$WTk1y;GQ$NQf`2;04WG6-P3$ln|i)$xp(9wpZ_LIAcdf!gob6*``A+FEG=QRG~TpY-w l!2QP1|9^Fdm3#UV<-I|SmCqUB5YjiLD5v&Mn(U>U{|7QV<6Zy& literal 0 HcmV?d00001 diff --git a/fadeeva_nastya_lab_5/main.py b/fadeeva_nastya_lab_5/main.py new file mode 100644 index 0000000..2d31ef6 --- /dev/null +++ b/fadeeva_nastya_lab_5/main.py @@ -0,0 +1,54 @@ +import time +import numpy +import concurrent.futures + +# Функция для умножения матриц +def multiply_matrices(matrix1, matrix2): + return numpy.dot(matrix1, matrix2) + +# Параллельное умножение матриц +def multiply_matrices_parallel(matrix1, matrix2, num_threads): + result = numpy.zeros_like(matrix1) + chunk_size = matrix1.shape[0] // num_threads + + def multiply_chunk(start, end): + nonlocal result + for i in range(start, end): + result[i] = numpy.dot(matrix1[i], matrix2) + + with concurrent.futures.ThreadPoolExecutor(max_workers=num_threads) as executor: + futures = [] + for i in range(0, matrix1.shape[0], chunk_size): + futures.append(executor.submit(multiply_chunk, i, i + chunk_size)) + + for future in concurrent.futures.as_completed(futures): + future.result() + + return result + +# Бенчмарк для сравнения производительности +def benchmark(matrix_size, num_threads_list=[1, 2, 4]): + # Генерация матриц + matrix1 = numpy.random.rand(matrix_size, matrix_size) + matrix2 = numpy.random.rand(matrix_size, matrix_size) + + # Бенчмарк для обычного умножения + start_time = time.time() + result = multiply_matrices(matrix1, matrix2) + end_time = time.time() + print(f"Размер матрицы {matrix_size}x{matrix_size}") + print(f"Последовательный: Время выполнения: {end_time - start_time:.6f} секунд") + + # Бенчмарк для параллельного умножения + for num_threads in num_threads_list: + start_time = time.time() + result_parallel = multiply_matrices_parallel(matrix1, matrix2, num_threads) + end_time = time.time() + print(f"Параллельный ({num_threads} поток): Время выполнения: {end_time - start_time:.6f} секунд") + + print() + +# Запуск бенчмарков +benchmark(100) +benchmark(300) +benchmark(500) \ No newline at end of file