From 5b354bd47128349a1030e8b3b3721e8d5db91406 Mon Sep 17 00:00:00 2001 From: Arity-T Date: Tue, 28 Apr 2026 21:08:54 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BA=D0=B0=D0=BA=D0=B8=D0=B5-=D1=82=D0=BE=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8,=20=D0=BD=D0=BE=20=D0=BE?= =?UTF-8?q?=D0=BD=20=D0=B2=D1=81=D1=91=20=D1=80=D0=B0=D0=B2=D0=BD=D0=BE=20?= =?UTF-8?q?=D0=BD=D0=B8=D1=87=D0=B5=D0=B3=D0=BE=20=D0=BD=D0=B5=20=D0=B3?= =?UTF-8?q?=D0=BB=D1=8F=D0=B4=D0=B5=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- report/report.tex | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/report/report.tex b/report/report.tex index f1e03b0..c733c45 100755 --- a/report/report.tex +++ b/report/report.tex @@ -256,7 +256,8 @@ Host polytech \item матрица $A$ и вектор $b$ один раз копируются на устройство, а далее итерационный процесс выполняется на GPU; \item завершение итераций контролируется через флаг \texttt{converged}, который может быть сброшен любым потоком, если изменение соответствующей компоненты превысило $\varepsilon$; \item после завершения расчёта на стороне CPU вычисляются невязка и ошибка относительно заранее известного решения; - \item для удобства дальнейшего анализа программа может сохранять результаты в CSV-файл. + \item для удобства дальнейшего анализа программа может сохранять результаты в CSV-файл; + \item конфигурация запуска ядра: размер блока фиксирован и равен $256$ потокам, размер сетки вычисляется как $\lceil n / 256 \rceil$, то есть всего активно ровно $n$ потоков --- по одному на строку матрицы. Значение $256$ потоков в блоке взято как оптимальное по результатам аналогичного GPU-эксперимента прошлого семестра и задаётся флагом \texttt{--threads 256} в \texttt{task1/scripts/run\_cuda.slurm}. \end{itemize} Такой вариант не является буквальной реализацией классического LU-LINPACK, однако решает ту же прикладную задачу --- измерение производительности при решении плотной СЛАУ --- и позволяет исследовать эффективность распараллеливания на GPU. @@ -446,6 +447,8 @@ Host polytech Для распараллеливания волнового алгоритма с использованием MPI \cite{gropp2014mpi} применена декомпозиция полигона по строкам. Полигон размера $n \times n$ разбивается на горизонтальные полосы, каждая из которых обрабатывается отдельным MPI-процессом. При использовании $P$ процессов каждый из них получает примерно $n / P$ строк. +В экспериментах на СКЦ запускается ровно один MPI-ранг на узел (\texttt{--ntasks-per-node=1}, \texttt{mpirun --map-by ppr:1:node --bind-to none}), поэтому число процессов $P$ совпадает с числом узлов и принимает значения $1$, $2$ или $4$. На каждом ранге выделяется \texttt{--cpus-per-task=56} CPU. + Для корректной обработки граничных ячеек каждый процесс дополнительно хранит по одной теневой строке (ghost row) сверху и снизу, содержащей актуальные значения расстояний из соседних процессов. Алгоритм работы программы: @@ -467,7 +470,7 @@ Host polytech \subsection{CUDA-реализация для сравнения} -Для сопоставления с MPI-реализацией подготовлена CUDA-версия того же волнового алгоритма, основанная на программе прошлого семестра. В отличие от исходной версии, размер полигона задаётся через аргумент командной строки (вместо \texttt{\#define}). Используется ядро с глобальной памятью: каждый поток обрабатывает несколько ячеек с шагом, равным общему числу потоков. Полный текст CUDA-реализации приведён в приложении Ж. +Для сопоставления с MPI-реализацией подготовлена CUDA-версия того же волнового алгоритма, основанная на программе прошлого семестра. В отличие от исходной версии, размер полигона задаётся через аргумент командной строки (вместо \texttt{\#define}). Используется ядро с глобальной памятью. Ядро запускается с конфигурацией \texttt{blocks = 256}, \texttt{threads = 256} (итого $65\,536$ потоков), при этом каждый поток обрабатывает несколько ячеек с шагом, равным общему числу потоков. Значения \texttt{blocks = 256} и \texttt{threads = 256} выбраны как оптимальные по результатам исследования прошлого семестра для той же задачи поиска пути на полигоне и передаются как аргументы командной строки в \texttt{task2/scripts/run\_cuda.slurm}. Полный текст CUDA-реализации приведён в приложении Ж. \subsection{Сборка и запуск}