<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE article PUBLIC "-//NLM/DTD JATS (Z39.96) Journal Publishing DTD v1.2 20120330//EN" "http://jats.nlm.nih.gov/publishing/1.2/JATS-journalpublishing1.dtd">
    <!--<?xml-stylesheet type="text/xsl" href="article.xsl">-->
<article xmlns:ns0="http://www.w3.org/1999/xlink" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" article-type="research-article" dtd-version="1.2" xml:lang="en">
	<front>
		<journal-meta>
			<journal-id journal-id-type="issn">2303-9868</journal-id>
			<journal-id journal-id-type="eissn">2227-6017</journal-id>
			<journal-title-group>
				<journal-title>Международный научно-исследовательский журнал</journal-title>
			</journal-title-group>
			<issn pub-type="epub">2303-9868</issn>
			<publisher>
				<publisher-name>ООО Цифра</publisher-name>
			</publisher>
		</journal-meta>
		<article-meta>
			<article-id pub-id-type="doi">10.60797/IRJ.2025.160s.35</article-id>
			<article-categories>
				<subj-group>
					<subject>Brief communication</subject>
				</subj-group>
			</article-categories>
			<title-group>
				<article-title>Реализация обобщенной библиотеки для матричных вычислений на графическом процессоре для методов решения СЛАУ</article-title>
			</title-group>
			<contrib-group>
				<contrib contrib-type="author" corresp="yes">
					<name>
						<surname>Устюжанин</surname>
						<given-names>Данил Алексеевич</given-names>
					</name>
					<email>danil.ustiuzhanin@urfu.me</email>
					<xref ref-type="aff" rid="aff-3">3</xref>
				</contrib>
				<contrib contrib-type="author">
					<contrib-id contrib-id-type="orcid">https://orcid.org/0000-0002-1863-2597</contrib-id>
					<name>
						<surname>Некрасов</surname>
						<given-names>Кирилл Александрович</given-names>
					</name>
					<email>kirillnkr@mail.ru</email>
					<xref ref-type="aff" rid="aff-1">1</xref>
				</contrib>
				<contrib contrib-type="author">
					<contrib-id contrib-id-type="orcid">https://orcid.org/0000-0003-2192-1880</contrib-id>
					<contrib-id contrib-id-type="rid">https://publons.com/researcher/ITT-0481-2023</contrib-id>
					<name>
						<surname>Пицхелаури</surname>
						<given-names>Сергей Сергеевич</given-names>
					</name>
					<email>s.s.pitskhelauri@urfu.ru</email>
					<xref ref-type="aff" rid="aff-2">2</xref>
				</contrib>
			</contrib-group>
			<aff id="aff-1">
				<label>1</label>
				<institution>Уральский федеральный университет имени первого Президента России Б. Н. Ельцина</institution>
			</aff>
			<aff id="aff-2">
				<label>2</label>
				<institution>Уральский федеральный университет имени первого Президента России Б. Н. Ельцина</institution>
			</aff>
			<aff id="aff-3">
				<label>3</label>
				<institution>Уральский федеральный университет имени первого Президента России Б. Н. Ельцина</institution>
			</aff>
			<pub-date publication-format="electronic" date-type="pub" iso-8601-date="2025-10-24">
				<day>24</day>
				<month>10</month>
				<year>2025</year>
			</pub-date>
			<pub-date pub-type="collection">
				<year>2025</year>
			</pub-date>
			<volume>10</volume>
			<issue>160s</issue>
			<fpage>1</fpage>
			<lpage>10</lpage>
			<history>
				<date date-type="accepted" iso-8601-date="2025-08-23">
					<day>23</day>
					<month>08</month>
					<year>2025</year>
				</date>
			</history>
			<permissions>
				<copyright-statement>Copyright: &amp;#x00A9; 2022 The Author(s)</copyright-statement>
				<copyright-year>2022</copyright-year>
				<license license-type="open-access" xlink:href="http://creativecommons.org/licenses/by/4.0/">
					<license-p>
						This is an open-access article distributed under the terms of the Creative Commons Attribution 4.0 International License (CC-BY 4.0), which permits unrestricted use, distribution, and reproduction in any medium, provided the original author and source are credited. See 
						<uri xlink:href="http://creativecommons.org/licenses/by/4.0/">http://creativecommons.org/licenses/by/4.0/</uri>
					</license-p>
					.
				</license>
			</permissions>
			<self-uri xlink:href="https://research-journal.org/archive/10-160-2025s-october/10.60797/IRJ.2025.160s.35"/>
			<abstract>
				<p>В рамках данной работы была реализована программная библиотека на языках программирования C/C++ и CUDA C. Центральное отличие предложенного в данной работе подхода к организации библиотеки для матричной алгебры на графическом процессоре, от подхода, описанного в статье [1], заключается в использовании системы классов под управлением matrixManagerDevice. Также в работе представлены механизмы обобщенного программирования матричных операций, т. е. механизмы, реализующие плотное взаимодействие матричных объектов, расположенных как в оперативной памяти под управлением центрального процессора (CPU), так и в памяти графического процессора (GPU). Результаты тестирования представленного программного обеспечения показывают, что приведенные изменения в устройстве библиотеки улучшают общую производительность и стабильности расчетов. В целом, данная работа представляет практическую значимость для многих областей, связанных с использованием вычислительной линейной алгебры, таких как машинное обучение, в частности, обучение глубоких нейронных сетей, молекулярная динамика, обработка больших объёмов данных и т. д.</p>
			</abstract>
			<kwd-group>
				<kwd>распараллеливание алгоритмов</kwd>
				<kwd> метод градиентного спуска</kwd>
				<kwd> метод сопряженных градиентов</kwd>
				<kwd> метод бисопряжённых градиентов</kwd>
			</kwd-group>
		</article-meta>
	</front>
	<body>
		<sec>
			<title>HTML-content</title>
			<p>1. Введение</p>
			<p>Матричная алгебра неотъемлемо связана со многими прикладными областями современного технического мира, в частности, к задачам вычислительной линейной алгебры приводят вопросы, возникающие при компьютерном моделировании физических процессов, машинном обучение, обработке данных. Например, в рамках физических задач часто возникает потребность в численном решении уравнений в частных производных, для которых разработаны различные разностные схемы [2]. Часть разностных схем, которые принято называть неявными, приводят к задаче о решении системы линейных алгебраических уравнений (СЛАУ), которая является традиционной для вычислительной линейной алгебры.  В связи со столь широким прикладным спектром задач возникает закономерная потребность в обобщённых математических пакетах для работы с матрицами на ЭВМ.</p>
			<p>Центральный процессор (CPU) хорошо справляется с обработкой матриц, но невысокого порядка. Как правило, на персональном компьютере пределом оптимальной работы матричных последовательных алгоритмов являются матрицы размера не более чем 1000 на 1000 элементов, этот предел объясняется тем, что большинство матричных операций имеют сложность более чем [LATEX_FORMULA]$O\left(n^2\right)$[/LATEX_FORMULA], где [LATEX_FORMULA]$n$[/LATEX_FORMULA] — размерность матрицы, для упрощения квадратной.  Этот предел сковывает многих программистов и научных сотрудников, у которых нет доступа к суперкомпьютерам.  </p>
			<p>Одним из путей решения ограниченности применения матриц высокого порядка являются параллельные вычисления на графическом процессоре (GPU). Графический процессор, изначально спроектированный для работы с графикой, оказался серьезным соперником для центрального процессора в области научных расчетов.</p>
			<p>Однако на данный момент не существует полноценных библиотек, не ориентированных на конкретную область, которые бы предоставляли многочисленный функционал для программирования матричных алгоритмов на графическом процессоре. Также нет библиотек, которые предоставляют возможность гибридной обработки матриц как на центральном, так и на графическом процессоре.</p>
			<p>В рамках данной работы мы хотим представить подход к организации библиотеки для работы с матрицами без выделенной прикладной области, для GPU и CPU на языках программирования С/C++ и CUDA C [3].</p>
			<fig id="F1">
				<label>Figure 1</label>
				<caption>
					<p>Блок схема библиотеки</p>
				</caption>
				<alt-text>Блок схема библиотеки</alt-text>
				<graphic ns0:href="/media/images/2025-08-22/2427dd53-0751-4757-9138-ef1c1194c376.png"/>
			</fig>
			<p>Библиотека формально состоит из двух частей (см. рис. 1). Первая — шаблонный класс Matrix для CPU, вторая — совокупность классов matrixManagerDevice, smartMatrix, devMatrix и devSparseMatrix.</p>
			<p>2. Шаблонный класс Matrix</p>
			<p>Matrix&lt;T&gt; — шаблонный класс, представляющий CPU часть библиотеки. В широком смысле предполагается, что данный класс можно использовать не только как двумерный или одномерный контейнер чисел, но и как многомерный контейнер некоторых объектов. Многомерность достигается, как и в случае класса vector из STL C++, путем вложенности шаблонов. Например, шаблон Matrix&lt;Matrix&lt;double&gt;&gt; является представлением объекта 4-го ранга, в качестве базового типа выбран вещественный тип двойной точности. Безопасность гарантируется путем установки базовых требований к классу шаблона Matrix, в частности, сам класс Matrix удовлетворяет поставленным требованиям.</p>
			<p>В рамках реализации Matrix, шаблоны также позволяют обрабатывать матрицы с объектами пользовательских типов, например с расширенными числовыми типами с плавающей запятой, комплексными числами и рациональными дробями. Последние в ряде случаев позволяют решать СЛАУ точными методами без потери знаков.</p>
			<p>Иллюстрацией применения шаблонного класса Matrix является матричная свертка (конволюция), определяемая как:</p>
			<code>[LATEX_FORMULA]$s(i, j)=(I * K)(i, j)=\sum_m\limits \sum_n\limits I(m, n) \cdot K(i-m, j-n)$[/LATEX_FORMULA]</code>
			<p>где </p>
			<p>—исходная матрица (изображение), [LATEX_FORMULA]$K$[/LATEX_FORMULA] - ядро свертки, [LATEX_FORMULA]$s(i, j)$[/LATEX_FORMULA] - элемент результирующей матрицы. Операция свертки широко используется в обработке и анализе изображений, в частности, она составляет основу сверхточных нейронных сетей (СНС) [4]. Рассмотрим процесс прямого распространения данных по СНС в сверточном слое. На вход в слой поступает объект 4-го ранга, будем считать, что первые два быстрых индекса определяют изображение (матрицу), третий — номер входного канала, четвертый — номер объекта в подмножестве тренировочной выборки. В качестве параметров (весов) слоя выступают элементы ядра, также объекта 4-го ранга. Первые два быстрых индекса ядра отвечают его размерам, третий — номеру входного канала, четвертый — номер выходного канала. Тогда свертка в индексах может быть записана следующим образом:</p>
			<code>[LATEX_FORMULA]$\begin{aligned} &amp;amp; O\left(h_{\text {out }}, w_{\text {out }}, c_{\text {out }}, b\right)= \\ &amp;amp; =\sum_{k_h=0}^{K_h-1} \sum_{k_w=0}^{K_w-1} \sum_{c_{\text {in }}}^{c_{\text {in }}-1} I\left(h_{\text {out }}+k_h, w_{\text {out }}+k_w, c_{\text {in }}, b\right) \\ &amp;amp; \cdot K\left(k_h, k_w, c_{\text {in }}, c_{\text {out }}\right)\end{aligned}$[/LATEX_FORMULA]</code>
			<p>Операция свертки может быть представлена как умножение двух матриц [LATEX_FORMULA]$I \cdot K$[/LATEX_FORMULA], где элементы первой матрицы — входные изображения, а второй — ядра свертки. Для случая тренировочной выборки из двух изображений двух входных и двух выходных каналов получаем следующею матричную запись:   </p>
			<code>[LATEX_FORMULA]$\begin{aligned} &amp;amp; I \cdot K=\left(I_{00} I_{01} I_{10} I_{11}\right) \cdot\left(K_{00} K_{01} K_{10} K_{11}\right)= \\ &amp;amp; \quad=\left(I_{00} * K_{00}+I_{01} * K_{10} I_{00} * K_{10}+I_{01} * K_{11} I_{10} * K_{00}\right. \\ &amp;amp; \left.\quad+I_{11} * K_{10} I_{10} * K_{10}+I_{11} * K_{11}\right)\end{aligned}$[/LATEX_FORMULA]</code>
			<p>где * </p>
			<p>— операция свертки.</p>
			<p>Для того чтобы реализовать механизм прямого распространения в СНС, понадобится только определить специализацию оператора * для шаблона Matrix&lt;T&gt;, который выступает в роли изображения, и вызвать оператор * для шаблона Matrix&lt;Matrix&lt;T&gt;&gt;.</p>
			<p>Представленный пример демонстрирует способность шаблонов к специализации кода общего назначения. Таким образом, мы хотим акцентировать внимание на том, что класс Matrix и система классов для расчетов на GPU предоставляют обширный функционал вне зависимости от прикладной области разработчика.</p>
			<p>3. DevMatrix под управлением matrixManagerDevice</p>
			<p>В ходе тестирования «автономной» реализации [2] выяснилось, что при исполнении итерационных алгоритмов с большими размерностями матриц  возникают резкие изменения в зависимости производительности от  размерности системы, связанные с особенностями работы сборщика мусора видеокарты. По этой причине была разработана система классов, управляемая matrixManagerDevice (см. рис. 2).</p>
			<fig id="F2">
				<label>Figure 2</label>
				<caption>
					<p>Блок схема GPU части библиотеки</p>
				</caption>
				<alt-text>Блок схема GPU части библиотеки</alt-text>
				<graphic ns0:href="/media/images/2025-08-22/433184da-b51c-4f18-9969-a90bea03fbdd.png"/>
			</fig>
			<p>Класс matrixManagerDevice берет на себя ответственность за управление памятью. В его полях объявлен двухсвязный список объектов типа devMatrix, в свою очередь эти объекты хранят данные о матрицах, расположенных на видеокарте.</p>
			<p>Объекты класса devMatrix имеют два состояния: первое отвечает логике активного объекта, который на данный момент участвует в вычислениях, второе состояние, напротив, соответствует «скрытой» матрице, которая готова для взаимодействия, но в данный момент в вычислениях не участвует. В случае инициализации нового объекта верхнего уровня архитектуры «скрытая» матрица проходит процедуру переинициализации и подстраивается под объект верхнего уровня.</p>
			<p>Таким образом, в итоговой библиотеке для программиста доступно два уровня архитектуры. Первый уровень требует от программиста, понимания организации внутренней структуры библиотеки и подразумевает ручное управлением состоянием матриц, как следствие, памятью. Он предназначен для реализации высокопроизводительных алгоритмов. На его базе построены различные методы решения СЛАУ.</p>
			<p>Второй уровень архитектуры или же высокий уровень абстракции реализован через вспомогательный класс smartMatrix, отвечающий концепции умных указателей. Класс smartMatrix обеспечивает связность библиотеки и простой синтаксис. Данный уровень предназначен для формирования математических моделей и структурных алгоритмов.</p>
			<p>Повторное тестирование уже с применением системы классов под управлением matrixManagerDevice, показало, что резкое изменение в производительности больше не возникает, также наблюдается общий прирост скорости вычислений (см. рис. 3).</p>
			<fig id="F3">
				<label>Figure 3</label>
				<caption>
					<p>Зависимость между временем работы алгоритма и размерностей матриц операндов</p>
				</caption>
				<alt-text>Зависимость между временем работы алгоритма и размерностей матриц операндов</alt-text>
				<graphic ns0:href="/media/images/2025-08-22/45242ef9-117d-4e00-bed6-8d5bc9617efd.png"/>
			</fig>
			<p>Стоит отметить, что график зависимости времени вычислений от размерности задачи в области малых размерностей имеет ступенчатый вид, связано это с перераспределением ресурсов на блоках сетки.</p>
			<p>4. Программирование нескольких
устройств</p>
			<p>Описанная в предыдущем параграфе концепция matrixManagerDevice базируется на монопольном управлении ресурсами видеокарты (устройства) одним классом. Это неявно подразумевает, что класс matrixManagerDevice должен соответствовать паттерну проектирования Singleton. В действительности оказывается, что использование паттерна Singleton — это надежное решение, которое обеспечивает корректный учет памяти и эффективную загрузку GPU [5], однако, это также препятствует развитию идеи вычисления на нескольких устройствах. Чтобы совместить возможность выполнения вычислений на нескольких устройствах и представленную архитектуру, можно воспользоваться шаблонной специализаций.</p>
			<p>При компиляции кода на языке программирования C++ компилятор преобразует шаблонный код в отдельные экземпляры шаблона, использующие различные типы. Экземпляры шаблона не взаимосвязаны между собой и воспринимаются как уникальные классы. По этой причине, если изменить реализацию статической функции, которая обеспечивает выдачу ссылки на объект matrixManagerDevice, на шаблонную с одним параметром — беззнаковое целое число, соответствующее номеру устройства, получится механизм разделения классов matrixManagerDevice, отвечающих разным устройствам, на уровне компиляции. В качестве промежуточного звена или транспортера данных выступает шаблонный класс Matrix&lt;T&gt;.</p>
			<p>5. Разреженные  матрицы</p>
			<fig id="F4">
				<label>Figure 4</label>
				<caption>
					<p>Формат CSR</p>
				</caption>
				<alt-text>Формат CSR</alt-text>
				<graphic ns0:href="/media/images/2025-08-22/d3d56d8d-a731-48cf-b201-4a36fe1a83e0.jpg"/>
			</fig>
			<p>В качестве формата хранения разреженных матриц выбран CSR (сжатая разреженная строка) [6]. Формат CSR предполагает сопоставлять разреженной матрице три одномерных массива — сумм числа элементов строк, индексы столбцов и значения ненулевых элементов (см. рис. 4). </p>
			<p>Разреженные  матрицы реализованы как подчиненный matrixManagerDevice класс devSparseMatrix. Однако в реализации отсутствует концепция «скрытых» матриц, связано это с тем, что даже в рамках одной задачи размерности массивов Cumulates, Columns и Values для разных матриц могут сильно отличаться.</p>
			<p>Применение разреженных матриц несут за собой как однозначно положительные моменты, так и отрицательные. К положительным моментам относятся: сокращение требований к глобальной памяти, уменьшается необходимый объем для хранения матриц (4). Например, матрица размера миллион на миллион с 10 ненулевыми элементами в строке в плотном формате занимает около 7.3 терабайта, тогда как в формате CSR 118.26 мегабайта. Также, что немаловажно, уменьшается число запросов к глобальной памяти устройства, что увеличивает скорость умножения матриц, как следствие скорость решения СЛАУ.</p>
			<code>[LATEX_FORMULA]Size $=N($ int $)+V($ int $)+V($ double $)$[/LATEX_FORMULA]</code>
			<p>К недостаткам стоит отнести скорость построения матриц. Формат CSR подразумевает пересчет сумм числа ненулевых элементов для построения строк. Таким образом реализовать алгоритмы построения произвольных разреженных матриц с помощью функциональных объектов можно только в последовательном исполнении. Чтобы использовать GPU, необходимо для каждой математической модели строить уникальные алгоритмы, опираясь на особенности матриц.</p>
			<p>Частично компенсирует описанный выше недостаток сохранение разреженных матриц в бинарные файлы. Чтение данных занимает сравнительно меньше времени.</p>
			<p>6. Решение СЛАУ</p>
			<p>В качестве инструментария библиотеки реализованы следующие алгоритмы решения систем линейных уравнений:</p>
			<p>1) метод Крамера (CPU + GPU);</p>
			<p>2) метод на основе LU-разложения (CPU + GPU, SparseMatrix) [7], [8];</p>
			<p>3) метод покоординатного спуска (GPU);</p>
			<p>4) метод градиентного спуска (CPU + GPU);</p>
			<p>5) метод сопряженных градиентов (CPU + GPU, SparseMatrix) [9];</p>
			<p>6) стабилизированный метод бисопряженных градиентов (CPU + GPU, SparseMatrix) [10].</p>
			<p>В данной работе внимание акцентируется на методах 3-6, т. е. методах основанных на идеи минимизации функционала:</p>
			<code>[LATEX_FORMULA]$F(x)=(A x, x)-2(b, x)$[/LATEX_FORMULA]</code>
			<p>Где [LATEX_FORMULA]$A$[/LATEX_FORMULA] — основная матрица системы, [LATEX_FORMULA]$b$[/LATEX_FORMULA] — вектор-столбец свободных членов. Для методов покоординатного спуска (CDM), градиентного спуска (GDM), сопряженных градиентов (CGM) на матрицу [LATEX_FORMULA]$A$[/LATEX_FORMULA] накладывается условие положительной определенности и симметричности в случае вещественной задачи и положительной определености и самосопряженности в комплексной. Для стабилизиванного метода бисопряженных градиентов (BiCGStab) на основую матрицу системы не накладываются ограничения, помимо невырожденности, что делает этот метод более универсальным.</p>
			<p>7. Решение параболического дифференциального уравнения</p>
			<p>Одним из традиционных направлений применения методов решения СЛАУ, основанных на минимизации функционала [LATEX_FORMULA]$F(x)$[/LATEX_FORMULA], является метод конечных разностей в случае [11], [12], когда производные заменяются неявными разностными схемами.</p>
			<p>Рассмотрим однородное двумерное параболическое уравнение: </p>
			<code>[LATEX_FORMULA]$\begin{gathered}\left\{\frac{\partial u}{\partial t}=D\left(\frac{\partial^2 u}{\partial x^2}+\frac{\partial^2 u}{\partial x^2}\right), u_{m, k}^0=\psi_{m, k}, u_{0, k}^n=\varphi_k^n, u_{1, k}^n=\widetilde{\varphi}_k^n, u_{m, 0}^n\right. \\ =\xi_m^n, u_{m, 1}^n=\widetilde{\xi}_m^n\end{gathered}$[/LATEX_FORMULA]</code>
			<p>В случае неявной разностной схемы, иттерационная формула будет иметь вид:</p>
			<code>[LATEX_FORMULA]$-\sigma u_{m-1, k}^{n+1}-\sigma u_{m+1, k}^{n+1}+(4 \sigma+1) u_{m, k}^{n+1}-\sigma u_{m, k-1}^{n+1}-\sigma u_{m, k+1}^{n+1}=u_{m, k}^n$[/LATEX_FORMULA]</code>
			<p>где </p>
			<p>—параболический аналог числа Куранта. Если применить формулу (8) ко всем узлам двумерной решетки, получится система линейных уравнений [LATEX_FORMULA]$A U=F$[/LATEX_FORMULA]:</p>
			<code>[LATEX_FORMULA]$\begin{gathered}A=(K S: 00 S K: 00 \cdots \cdots \\ =(4 \sigma+1-\sigma 0-\sigma 4 \sigma+1-\sigma 0-\sigma 4 \sigma+1), \\ S=(-\sigma 000-\sigma 000-\sigma) .\end{gathered}$[/LATEX_FORMULA]</code>
			<p>Основная матрица системы положительно определена и имеет пяти-диагональный вид (трех-диагональный для одномерного случая и семи-диагональный для трехмерного). Размеры подматриц [LATEX_FORMULA]$S$[/LATEX_FORMULA] и [LATEX_FORMULA]$K$[/LATEX_FORMULA] определяются на основании количества узлов в координатной сетке. Столбец свободных членов включает граничные и начальные условия задачи. </p>
			<fig id="F5">
				<label>Figure 5</label>
				<caption>
					<p>Зависимость между временем работы алгоритмов решения и размерности задачи</p>
				</caption>
				<alt-text>Зависимость между временем работы алгоритмов решения и размерности задачи</alt-text>
				<graphic ns0:href="/media/images/2025-08-22/f262626f-146b-490d-9287-d15a14752924.png"/>
			</fig>
			<p>В процессе решения параболического уравнения [13] неявной разностной схемой, проводилось тестирование производительности библиотеки (см. рис. 5).</p>
			<p>В рамках задачи о решении параболического уравнения, самым производительным методом решения СЛАУ неявной разностной схемы является стабилизированный метод бисоппряженных градиентов, схожий качественный уровень производительности имеют методы градиентного спуска и сопряженных градиентов. Метод основанный на LU-разложении основной матрицы системы согласуется с оценочной сложностью [LATEX_FORMULA]$O\left(n^3\right)$[/LATEX_FORMULA], на малых размерностях за счет параллелизации графическим процессором одна степень сложности снимается. Метод покоординатного спуска показал наихудший результат и далее рассматриваться не будет. Под временем работы алгоритма решения СЛАУ здесь и далее понимается время, связывающее первую и последнюю итерацию метода, критерием остановки итерационных алгоритмов принята величина модуля вектора невязки (10) [14].</p>
			<code>[LATEX_FORMULA]$\|r\|=\|A x-B\|&amp;lt;\varepsilon$[/LATEX_FORMULA]</code>
			<fig id="F6">
				<label>Figure 6</label>
				<caption>
					<p>Зависимость между временем работы алгоритма CGM и размерности задачи</p>
				</caption>
				<alt-text>Зависимость между временем работы алгоритма CGM и размерности задачи</alt-text>
				<graphic ns0:href="/media/images/2025-08-22/3f2adf4e-cc5e-4f78-846b-58d1097857fc.png"/>
			</fig>
			<p> более подробно результат тестирования метода сопряженных градиентов (см. рис. 6).</p>
			<p>При тестировании было замечено, что на размерности происходит значительный скачок времени решения СЛАУ методами, основанными на минимизации функционала (5). Скачок возникает из-за совокупности факторов, которые относятся как к аппаратной, так и программной части. В первую очередь на размерностях кратных 1024 происходит переопределение числа блоков, запускаемых на устройстве, в таких алгоритмах, как умножение матриц [15]. Причем чем ближе размерность к числу, кратному 1024 справа, тем равномернее используются ресурсы устройства, с другой стороны, при размерностях близких к кратным 1024 слева ресурсы устройства используются неравномерно. Во вторую очередь скачок связан с тем, что матрицы перестают помещаться в кэш L2 графического процессора [16], возникает необходимость в многократном обращении к глобальной памяти, что снижает производительность.</p>
			<p>8. Решение СЛАУ с плотной матрицей</p>
			<fig id="F7">
				<label>Figure 7</label>
				<caption>
					<p>Зависимость между временем работы алгоритмов минимизации и размерностью задачи</p>
				</caption>
				<alt-text>Зависимость между временем работы алгоритмов минимизации и размерностью задачи</alt-text>
				<graphic ns0:href="/media/images/2025-08-22/99b84e38-d3a2-44f4-b1ea-42c5ae867b5f.png"/>
			</fig>
			<p>Предлагаем рассмотреть противоположную ситуацию, т.е. решения систем с плотной матрицей (см. рис. 7).Наблюдается качественно схожая картина со случаем разреженных матриц (см. рис. 5), отличие заключается в порядке времени расчета. Для плотных матриц время расчета находится в диапазоне 1.5-2 секунды, в зависимости от метода и критерия остановки, для разреженных матриц диапазон 14–20 мс.</p>
			<p>Теоретически метод сопряженных градиентов ассимптотически работает за [LATEX_FORMULA]$O\left(n^3\right)$[/LATEX_FORMULA], но на практике эта оценка не справедлива. Причина плохой сходимости метода сопряженных градиентов, и других методов оптимизаци: GDM, BiCGStab, лежит в неустойчивости шагов минимизации на больших размерностях с плотными матрицами. При вычислении на ЭВМ происходит неизбежная потеря доверительных знаков, соответственно на плотных матрицах достигается наивысшая ошибка, тогда как для разреженных матриц большая часть операций выполняется без ошибки (умножение числа на точный ноль на ЭВМ производится без ошибки, гарантируется стандартом IEEE 754 [17]). Совокупность нестойчивости шагов минимизации и накопительной ошибки при умножении матриц приводит к тому, что методы GDM, CGM, BiCGStab на плотных матриц на практике не применимы.</p>
			<p>9. Заключение</p>
			<p>В данной работе описана реализация библиотеки для матричной алгебры, оптимизированной в контексте памяти для решения итерационных задач на графическом процессоре с использованием технологии CUDA. Проведенные тесты показали общее повышение производительности расчетов. Были предложены инструменты для взаимодействия центрального процессора с графическим, а также для программирования матричной алгебры на нескольких GPU.</p>
			<p>Кроме того, в работе проведено сравнение различных методов решения систем линейных алгебраических уравнений (СЛАУ), включая методы, основанные на оптимизации. По результатам сравнительных тестов установлено, что методы минимизации применимы только к разреженным матрицам, так как на плотных матрицах из-за вычислительных ошибок они ведут себя неустойчиво. Это открывает перспективы для дальнейших исследований и оптимизаций в области вычислительной линейной алгебры, особенно в контексте использования гибридных систем CPU-GPU и разработки более устойчивых алгоритмов для работы с плотными матрицами.</p>
		</sec>
		<sec sec-type="supplementary-material">
			<title>Additional File</title>
			<p>The additional file for this article can be found as follows:</p>
			<supplementary-material xmlns:xlink="http://www.w3.org/1999/xlink" id="S1" xlink:href="https://doi.org/10.5334/cpsy.78.s1">
				<!--[<inline-supplementary-material xlink:title="local_file" xlink:href="https://research-journal.org/media/articles/21177.docx">21177.docx</inline-supplementary-material>]-->
				<!--[<inline-supplementary-material xlink:title="local_file" xlink:href="https://research-journal.org/media/articles/21177.pdf">21177.pdf</inline-supplementary-material>]-->
				<label>Online Supplementary Material</label>
				<caption>
					<p>
						Further description of analytic pipeline and patient demographic information. DOI:
						<italic>
							<uri>https://doi.org/10.60797/IRJ.2025.160s.35</uri>
						</italic>
					</p>
				</caption>
			</supplementary-material>
		</sec>
	</body>
	<back>
		<ack>
			<title>Acknowledgements</title>
			<p/>
		</ack>
		<sec>
			<title>Competing Interests</title>
			<p/>
		</sec>
		<ref-list>
			<ref id="B1">
				<label>1</label>
				<mixed-citation publication-type="confproc">Устюжанин Д. А. Реализация метода сопряженных градиентов на графическом процессоре с применением матричных методов решения СЛАУ / Д. А. Устюжанин , С. С. Пицхелаури , К. А. Некрасов // Международный научно-исследовательский журнал. — 2024. — 5 (143) .</mixed-citation>
			</ref>
			<ref id="B2">
				<label>2</label>
				<mixed-citation publication-type="confproc">Крылов В. И. . Вычислительные методы в 2 т.; / В. И. Крылов, В. В. Бобков, П. И. Монастырный — Москва: Наука, 1976. - II т. — 401 с.</mixed-citation>
			</ref>
			<ref id="B3">
				<label>3</label>
				<mixed-citation publication-type="confproc">CUDA Toolkit Documentation 13.0 // NVIDIA Documentation Hub. — URL: https://docs.nvidia.com/cuda/ (accessed: 05.10.24)</mixed-citation>
			</ref>
			<ref id="B4">
				<label>4</label>
				<mixed-citation publication-type="confproc">Lecun Y. Gradient-Based Learning Applied to Document Recognition / Y. Lecun, L. Bottou, Y. Bengio, P. Haffner // Proceedings of the IEEE. — 1998. — 11. DOI: 10.1109/5.726791. [in English]</mixed-citation>
			</ref>
			<ref id="B5">
				<label>5</label>
				<mixed-citation publication-type="confproc">Тумаков Д. Н. Технология программирования CUDA / Д. Н. Тумаков, Д. Е. Чикрин, А. А. Егорчев, С. В. Голоусов — Казань: Казанский федеральный ун-т., 2017. — 111 с.</mixed-citation>
			</ref>
			<ref id="B6">
				<label>6</label>
				<mixed-citation publication-type="confproc">Jamalmohammed S. B. . Review on Sparse Matrix Storage Formats With Space Complexity Analysis / S. B. Jamalmohammed, K. Lavanya, I. Sumaiya Thaseen, V. Biju // Applications of Artificial Intelligence for Smart Technology; — Hershey: IGI Global, 2020. — с. 122–145. DOI: 10.4018/978-1-7998-3335-2.ch009. [in English]</mixed-citation>
			</ref>
			<ref id="B7">
				<label>7</label>
				<mixed-citation publication-type="confproc">Lei X. . High-Performance Batched LU Decomposition on GPU / X. Lei, X. Zhang, L. Ma, T. Bao // Applied Mathematics, Modeling and Computer Simulation; — Amsterdam: IOS Press, 2022. [in English]</mixed-citation>
			</ref>
			<ref id="B8">
				<label>8</label>
				<mixed-citation publication-type="confproc">Atasoy N. A. Using gauss - Jordan elimination method with CUDA for linear circuit equation systems / N. A. Atasoy, S. Baha, S. Burhan // Procedia Technology. — 2012. — 1. — с. 31–35. DOI: 10.1016/j.protcy.2012.02.008. [in English]</mixed-citation>
			</ref>
			<ref id="B9">
				<label>9</label>
				<mixed-citation publication-type="confproc">Cevahir A. . Fast Conjugate Gradients with Multiple GPUs / A. Cevahir, A. Nukada, S. Matsuoka // Computational Science — ICCS 2009, 9th International Conference; — New York: Springer, 2009. DOI: 10.1007/978-3-642-01970-8_90. [in English]</mixed-citation>
			</ref>
			<ref id="B10">
				<label>10</label>
				<mixed-citation publication-type="confproc">Lopez G. O. The BiConjugate gradient method on GPUs / G. O. Lopez, F. Vázquez, E. M. Garzon, I. G. Fernandez // The Journal of Supercomputing. — 2013. — 64(1). — с. 49–58. DOI: 10.1007/s11227-012-0761-2. [in English]</mixed-citation>
			</ref>
			<ref id="B11">
				<label>11</label>
				<mixed-citation publication-type="confproc">Локтионов И. К. Численные методы / И. К. Локтионов — Москва: Инфа-Инженерия, 2022. — 308 с.</mixed-citation>
			</ref>
			<ref id="B12">
				<label>12</label>
				<mixed-citation publication-type="confproc">Огородникова О. М. Вычислительные методы в компьютерном инжиниринге / О. М. Огородникова — Екатеринбург: Изд-во Уральского ун-та, 2013. — 130 с.</mixed-citation>
			</ref>
			<ref id="B13">
				<label>13</label>
				<mixed-citation publication-type="confproc">Амосов А. А. Вычислительные методы для инженеров / А. А. Амосов, Ю. А. Дубинский, Н. В. Копченова — Москва: Высш. шк, 1994. — 543 с.</mixed-citation>
			</ref>
			<ref id="B14">
				<label>14</label>
				<mixed-citation publication-type="confproc">Пирумов У. Г. Численные методы / У. Г. Пирумов, В. Ю. Гидаспов, И. Э. Иванов — Москва: Юрайт, 2023. — 421 с.</mixed-citation>
			</ref>
			<ref id="B15">
				<label>15</label>
				<mixed-citation publication-type="confproc">Снытников А. В. Математическое моделирование и программная модель CUDA / А. В. Снытников, А. С. Колганов, Н. Н. Попова — Москва: МАКС Пресс, 2018. — 171 с.</mixed-citation>
			</ref>
			<ref id="B16">
				<label>16</label>
				<mixed-citation publication-type="confproc">Тоуманен Б. Программирование GPU при помощи Python и CUDA / Б. Тоуманен — Москва: ДМК Пресс, 2020. — 235 с.</mixed-citation>
			</ref>
			<ref id="B17">
				<label>17</label>
				<mixed-citation publication-type="confproc">IEEE 754 // Wikipedia. — 2003 — URL: https://en.wikipedia.org/wiki/IEEE_754 (дата обращения: 12.10.2024)</mixed-citation>
			</ref>
		</ref-list>
	</back>
	<fundings>
		<funding lang="RUS">Работа выполнена на основе гранта Министерства образования РФ № FEUZ-2023-0013.</funding>
		<funding lang="ENG">The work was carried out on the basis of a grant from the Ministry of Education of the Russian Federation No. FEUZ-2023-0013.</funding>
	</fundings>
</article>