Научная статья на тему 'Использование инструментальной системы Sparse Assist при обучении программированию задач обработки разреженных матриц'

Использование инструментальной системы Sparse Assist при обучении программированию задач обработки разреженных матриц Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
58
13
i Надоели баннеры? Вы всегда можете отключить рекламу.

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Симуни Михаил Лазаревич

В работе рассматриваются особенности обучения программированию задач обработки разреженных матриц и возможности использования инструментальной системы SparseAssist при обучении программированию в данной предметной области. В первой части рассматриваются основные особенности программирования задач обработки разреженных матриц. В частности, описываются типичные проблемы и трудности, возникающие при создании программ. Во второй части рассматриваются особенности обучения программированию таких задач. Обосновывается целесообразность получения навыков работы с разреженными матрицами, в том числе и для специальностей, не связанных прямо с вычислительными методами или математическим моделированием. В третьей части перечисляются некоторые типичные трудности, возникающие при обучении. Рассматриваются возможности инструментальной системы SparseAssist, которые можно применить при обучении программированию для разреженных матриц. В четвертой части описываются другие подходы к рассматриваемой задаче.

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Симуни Михаил Лазаревич

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Использование инструментальной системы Sparse Assist при обучении программированию задач обработки разреженных матриц»

Симуни М.Л.

Санк-Петербургский государcтвенный университет,

старший преподаватель simuni@mail.ru

Использование инструментальной системы Sparse Assist при обучении программированию задач обработки

разреженных матриц

Аннотация

В работе рассматриваются особенности обучения программированию задач обработки разреженных матриц и возможности использования инструментальной системы SparseAssist при обучении программированию в данной предметной области.

В первой части рассматриваются основные особенности программирования задач обработки разреженных матриц. В частности, описываются типичные проблемы и трудности, возникающие при создании программ.

Во второй части рассматриваются особенности обучения программированию таких задач. Обосновывается целесообразность получения навыков работы с разреженными матрицами, в том числе и для специальностей, не связанных прямо с вычислительными методами или математическим моделированием.

В третьей части перечисляются некоторые типичные трудности, возникающие при обучении. Рассматриваются возможности инструментальной системы SparseAssist, которые можно применить при обучении программированию для разреженных матриц. В четвертой части описываются другие подходы к рассматриваемой задаче.

Некоторые особенности программирования задач обработки разреженных матриц

Разреженные матрицы - это матрицы, большинство элементов которых равны нулю [1]. Матрицы такого вида имеют большое значение в самых разных приложениях, от систем математического моделирования [2] до задач ранжирования веб-страниц в поисковых системах [3].

Программирование задач обработки разреженных матриц обладает рядом особенностей, которые делают его достаточно сложным, во многом не похожим на программирование в других предметных областях, и требующим, как правило, специального обучения. Расммотрим некоторые из этих особенностей.

Во первых, многие важные задачи, которые возникают в этой предметной области имеют очень простую формулировку: например умножение матрицы на вектор, сложение и умножение матриц, разложение

матрицы на произведение двух треугольных матриц ^и разложение) и т.д. Решение этих задач для обычных матриц не представляет труда даже для начинающего программиста (однако необходимо отметить, что если ставится задача достижения максимальной производительности, то и создание программ для обычных матриц требует высокой квалификации

[4].)

Для разреженных матриц программирование даже задач с простой формулировкой представляет значительную сложность. У начинающего программиста даже задача умножения матрицы на столбец может вызвать затруднения, задача сложения матриц требует хороших навыков программирования, а написание эффективной реализации умножения матриц требует знания специальных приемов программирования [1]. Если же речь идет о достижении максимальной производительности, то и такие простые задачи, как умножение матрицы на столбец становится сложной задачей, существенно зависящей как от архитектуры компьютера, так и от особенностей матрицы [5].

Перечислим некоторые другие особенности:

• Для хранения данных используются специальные форматы, обеспечивающие компактное представление данных (например, сжатое представление по строкам, по столбцам, различные формы диагональных представлений, блочные представления [1,2],). Выбор оптимального представления зависит от структуры матрицы данной задачи, и в разных случаях имеет смысл использовать разные форматы.

• Форматы представления данных накладывают существенные ограничения на порядок обхода матрицы. Например, при использовании наиболее распространенного сжатого представления по строкам (CSR) [1], обход матрицы по столбцам становиться очень неэффективным. (Это, в частности, приводит к существенному усложнению алгоритма умножения матриц.)

• Как правило, предъявляются очень высокие требования к быстродействию. Как следствие, программы пишутся обычно на сравнительно низком уровне, без использования классов и т.д. и получаются сравнительно плохо читаемыми.

• Еще одно следствие высоких требований к быстродействию - это необходимость анализа 'узких' мест программы. Без навыков работы в данной предметной области такой анализ, как правило, вызывает затруднения. Например, при сложении или умножении матриц, существенное влияние на скорость работы оказывает то, насколько быстро мы можем обнулять используемые во время работы вспомогательные массивы, и для ускорения этой операции используется специальное представление данных [1]. Для программиста, привыкшего работать в других предметных областях,

необходимость оптимизации этого аспекта программы является в большинстве случаев неочевидной.

• При написании программ используются способы представления данных, редко встречающиеся в других областях (например, так называемые расширенные накопители [1]). Кроме этого, широко используются некоторые подходы, которые, хотя и встречаются в других областях, но не так распространены. Например, очень эффективной оказывается идея разделения алгоритма на два этапа -сначала проводятся символьные вычисления, которые используют только форму исходных матриц и определяют форму матрицы-результата, а потом, на втором этапе, проводятся вычисления с конкретными числами.

Необходимо отметить еще одну важную особенность: на современных компьютерах чрезвычайно важную роль играют вопросы организации многопоточной, параллельной или распределенной обработки матриц. Однако в данной работе мы изучаем вопросы, связанные с программированием последовательной обработки матриц и не рассматриваем вопросы, связанные с параллельной обработкой.

Целесообразность изучения обработки разреженных матриц в курсе программирования

Программирование задач, связанных с разреженными матрицами, сравнительно редко включается в курсы информатики и программирования для специальностей, не связанных с численными методами и математическим моделированием. Наиболее часто эти задачи рассматриваются к курсах, связанных с параллельным программированием (например, [6]). Кроме этого, такие задачи довольно часто включаются курсы представления данных, но, как правило, в этом случае они рассматриваются просто как пример сложного типа данных, и не ставиться задача создания высокопроизводительной реализации.

Как нам кажется, обучение навыкам программирования задач разреженных матриц имеет смысл и для специальностей, не связанных прямо с прикладными применениями матриц и может быть использовано как средство повышения общего уровня подготовки программистов. Приведем некоторые обоснования полезности такого обучения:

• Разреженные матрицы могут рассматриваться как пример предметной области, в которой необходимо использовать нестандартное представление данных, отличное от того, что используется в других разделах курса программирования (виды сжатого представления матриц, расширенные накопители и т.д.). Даже если это не пригодиться программистам в их практической деятельности, это будет способствовать расширению их кругозора.

• Данная предметная область дает возможность на относительно простых примерах практически понять важность знакомства с

архитектурой компьютера для создания высокопроизводительных вычислений (например, влияние кэш-памяти на производительность). Таким образом, более конкретным становиться понимание архитектуры современных компьютеров.

• Появляется возможность получения навыков поиска оптимального решения среди многих вариантов, в частности, с учетом специфики входных данных. Как уже упоминалось, для алгоритмов обработки разреженных матриц характерно наличие большого числа вариантов, и выбор оптимального варианта представляет сложную и интересную задаче, зависящую от большого числа факторов. (Некоторые примеры такого выбора оптимального варианта приведены в [6].)

• Некоторые идеи, такие, как, например, введение предварительного этапа, символьных вычислений, являются полезными и для других предметных областей.

Некоторые другие обоснования для использования разреженных матриц в курсе программирования приведены в [7].

Некоторые типичные трудности, возникающие при обучении. Использование инструментальной системы Sparse Assist

Практика показывает, что при обучении программированию задач обработки разреженных матриц, обучающиеся часто испытывают трудности, связанные часто не столько со сложностью алгоритмов, сколько со сложностью понимания программ. Перечислим некоторые из возникающих при этом проблем:

• Использование относительно низкоуровневых конструкций приводит к тому, что связь кода с исходной постановкой задачи становится неочевидной.

• В программе присутствует большое количество вспомогательного кода.

В результате, для программиста, не имеющего опыта работы с такими задачами, становится сложным как понять отдельные фрагменты кода, так и охватить общую картину. Приведем в качестве примера простой фрагмент реального кода, взятый из библиотеки CSparse [2] (рис. 1). int p, j, n, *Lp, *Li; double *Lx; n = L->n; Lp = L->p; Li = L->i; Lx = L->x; for (j = 0; j < n; j++) {

x [j] /= Lx[Lp[j]]; for (p = Lp [j]+1; p < Lp [j+1]; p++)

x[Li[p]] -= Lx[p]*x [j];

}

Рис. 1. Фрагмент кода для решения треугольного матричного

уравнения Lx = b Для неподготовленного пользователя часто представляет трудность,

как и общее понимание кода, так и выделение в нем отдельных частей -например, кода, отвечающего за обход матрицы или кода, выполняющего вычисления.

Для того, чтобы упростить и сделать более понятным работу с кодом предлагается использовать возможности инструментальной системы Sparse Assist [8]. Sparse Assist - это инструментальная система поддержки создания программ для обработки разреженных матриц. Система ориентирована в основном на профессионального разработчика и предназначена для использования при разработке новых версий системы инженерного моделирования ELCUT [9]. Основное назначение системы Sparse Assist - предоставить разработчикам средства рефакторинга, удобные возможности для перехода от одного варианта реализации алгоритма к другому.

Но, кроме этого, система Sparse Assist содержит ряд возможностей, которые могут быть полезны и при обучении. Рассмотрим их подробнее:

Использование цвета для выявления логики программы. Sparse Assist позволяет выделить в тексте разными цветами код, отвечающий за обход разреженной матрицы, код, выполняющий вычисления, и вспомогательный код. В результате программисту становится легче сконцентрироваться на важном для него в данный момент аспекте программы.

Подсказки в виде всплывающих окон или комментариев. Система показывает для фрагментов программы их смысл (в терминах операций надо обычными матрицами) в виде всплывающих окон-подсказок. Например, подведя курсор к фрагменту Lx[Lp[j]] в тексте программы, программист увидит в всплывающем окне надпись L[j,j] - пояснение смысла исходного текста. Предусмотрена также возможность добавить поясняющую надпись в текст в виде комментария.

На рис 2. приведен пример кода с выделенным цветом кодом, отвечающим за вычисления и добавленными комментариями. int p, j, n, *Lp, *Li; double *Lx; n = L->n; Lp = L->p; Li = L->i; Lx = L->x; for (j = 0; j < n; j++) {

x [j] /= Lx [Lp [j]]; // x[j] /= L[j][j];

for (p = Lp [j]+1; p < Lp [j+1]; p++)

x[Li[p]] -= Lx[p]*x[j];

}

Рис. 2. Фрагмент кода с выделенным цветом частью кода, отвечающей за вычисления и добавленными комментариями.

Вставка стандартных фрагментов кода. Простой, но полезной возможностью, является наличие в Sparse Assist функции вставки стандартных фрагментов кода, характерных для обработки разреженных матриц (обход матрицы, описание и инициализация расширенного накопителя, слияние двух разреженных строк и т.д.)

Описанные возможности реализованы с использованием платформы Ecipse CDT [10, 11] и использует встроенные в нее возможности задания аннотаций.

Другие существующие подходы

В работе [12] рассматривается система, помогающая пользователю понять код, работающий с разреженными матрицами. Система работает при помощи поиска в тексте программы фрагментов, соответствующих описанным заранее базовым методам работы с матрицами.

Существует ряд работ, в которых делаются попытки полностью или частично автоматизировать разработку оптимальных алгоритмов для работы с разреженными матрицами. В частности, в работе [13] рассматривается возможность автоматической генерации оптимальной программы по ее высокоуровневому представлению. При этом получается достаточно эффективный код, хотя и уступающий по эффективности коду, созданному вручную. Такой поход, видимо, мог бы быть полезен и в процессе обучения, в особенности, если бы он был дополнен средствами объяснения выбранного варианта реализации.

Заключение

В работе описаны основные возможности инструментальной системы Sparse Assist, которые позволяют использовать ее при обучении навыка программирование задач обработки разреженных матриц. Использование этой системы упрощает создание и понимание программ в данной предметной области. Обучение программированию для задач обработки разреженных матриц может быть полезно не только в курсах, связанных с решениями вычислительных задач, но и в других курсах с целью повышения качества подготовки программистов.

Литература

1. Писсанецки С. Технология разреженных матриц.- М.:Мир, 1988. - 416 с.

2. Davis, T. A. Direct Methods for Sparse Linear Systems. - SIAM, Philadelphia, PA, 2006. -

229 p.

3. Brin S., Page L. The Anatomy of a Large-Scale Hypertextual Web Search Engine. //COMPUTER NETWORKS AND ISDN SYSTEMS. Elsevier, 1998, pp. 107-117.

4. Донгарра Д., Лушчек П. Как первоклассный код развивается вместе с аппаратным обеспечением. //Идеальный код/ Под ред. Э. Орама и Г. Уилсона.- СПб.:Питер, 2011. С. 263-289.

5. Karakasis V, Goumas G, Koziris N. Performance models for blocked Sparse Matrix-Vector multiplication kernels. //Proceedings of the 2009 International Conference on Parallel Processing, 2009. pp, 356-364.

6. Мееров И.Б., Сысоев А.В. Разреженное матричное умножение. Н.Новгород, 2011. -82 с. http://www.software.unn.ru/ccam/file.php?id=568

7. Brandon D. Sparse matrices in CS education. //J. Comput. Sci. Coll. 2009, V.24 N. S, pp.

93-98.

8. Симуни М.Л. Проект системы рефакторинга, ориентрированной на программы обработки разреженных матриц. //Вестник Санкт-Петербургского университета. Серия 10: Прикладная математика. Информатика. Процессы управления. 2010, 2. - C. 122-128.

9. Дубицкий С.Д. ELCUT 5.1 - платформа разработки приложений анализа полей. //Exponenta Pro. Математика в приложениях. 2004, Н. 1(5). С. 20--26.

10. Гамма Э., Бек К. Расширения Eclipse: принципы, шаблоны и подключаемые модули - М.:КУДИЦ-Образ, 2005. - 384 с.

11. Prigogin S. С++ Refactoring - Now for Real //EclipseCon 2012. - 12 p.

12. Kessler C., The SPARAMAT Approach to Automatic Comprehension of Sparse Matrix Computations. //Proc. of the 7th International Workshop on Program Comprehension. 1999. pp. 200-207.

13. Ahmed, N., Mateev N., Pingali K..A framework for sparse matrix code synthesis from high-level specifications. //Proc. of the 2000 ACM/IEEE conference on Supercomputing (CDROM) (Supercomputing '00). IEEE Computer Society, Washington, DC, USA, Article 58.

i Надоели баннеры? Вы всегда можете отключить рекламу.