commit 9c1f0043bda44818684d9b4a35236cc70736a9c0
parent fb22767fa24f51e6aa21dd06552539a1343a8a76
Author: Ivan Gankevich <igankevich@ya.ru>
Date: Wed, 10 Aug 2016 23:08:59 +0300
Generate makefile.
Diffstat:
Makefile | | | 17 | +++++++++++++++++ |
gankevich_utf8.tex | | | 74 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
overlap.svg | | | 171 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
performance.svg | | | 100 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
pmstyle14.sty | | | 219 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
tex/Makefile | | | 17 | ----------------- |
tex/gankevich_utf8.tex | | | 74 | -------------------------------------------------------------------------- |
tex/overlap.svg | | | 171 | ------------------------------------------------------------------------------- |
tex/performance.svg | | | 100 | ------------------------------------------------------------------------------- |
tex/pmstyle14.sty | | | 219 | ------------------------------------------------------------------------------- |
10 files changed, 581 insertions(+), 581 deletions(-)
diff --git a/Makefile b/Makefile
@@ -0,0 +1,17 @@
+NAME=gankevich
+
+$(NAME).pdf: $(NAME).tex performance.eps overlap.eps
+ pdflatex $(NAME).tex
+ pdflatex $(NAME).tex
+ pdflatex $(NAME).tex
+
+%.eps: %.svg
+ inkscape --file=$< --without-gui --export-eps=$@
+
+$(NAME).tex: $(NAME)_utf8.tex
+ iconv -f utf8 -t cp1251 <$(NAME)_utf8.tex >$(NAME).tex
+
+clean:
+ rm -f $(NAME).log $(NAME).aux $(NAME).pdf *-converted-to.pdf
+ rm -f *.eps *.nav *.out *.toc *.snm
+ rm -f $(NAME).tex
diff --git a/gankevich_utf8.tex b/gankevich_utf8.tex
@@ -0,0 +1,74 @@
+\documentclass{article}
+\usepackage{pmstyle14}
+\usepackage{cite}
+
+\begin{document}
+\hyphenation{СПбГУ}
+\udk{УДК 51.37}
+\author{Ганкевич~И.\:Г., Дегтярев~А.\:Б.}
+\title{Метод распределения нагрузки на~многопроцессорную систему}
+\renewcommand{\thefootnote}{ }
+{\footnotetext{{\it Ганкевич Иван Геннадьевич} -- аспирант, Санкт-Петербургский государственный университет; e-mail: igankevich@cc.spbu.ru, тел.: +7(921)422-23-21}}
+{\footnotetext{{\it Дегтярев Александр Борисович} -- профессор, Санкт-Петербургский государственный университет; e-mail: deg@csa.ru, тел.: +7(911)913-48-99}}
+\maketitle
+\norec{}
+
+
+\razdel[n]{Введение}
+Наиболее разработанным и широко применяемым подходом к распределению нагрузки на вычислительную систему является разбиение данных на однородные части (или разбиение задачи на однородные подзадачи) с последующим распределением их между отдельными ядрами вычислительного устройства или узлами кластера, однако такой подход не всегда работает эффективно. Во-первых, часто общее количество частей, на которые разбиваются входные данные, диктуется не архитектурой и конфигурацией вычислительной системы, а самой задачей и присущими ей ограничениями, и такое распределение не всегда эффективно с точки зрения вычислительной машины: количество частей оказывается либо слишком большим по сравнению с количеством процессоров, работающих параллельно, что ведет к увеличению накладных расходов на обмен данными, либо слишком маленьким, что не позволяет эффективно использовать все доступные вычислительные ядра. Во-вторых, сам характер деления входных данных на части может стать причиной появления неоднородности в размерах различных частей и дисбаланса нагрузки на отдельные вычислительные ядра системы. В-третьих, поскольку в вычислительной системе процессор --- не единственное устройство, справляющееся с нагрузкой, и существуют другие компоненты, участвующие в вычислениях (такие как векторные ускорители, видеокарты и устройства хранения), то окончательная производительность системы и время решения конкретной задачи зависят от производительности не только процессоров, но и всех устройств, принимающих участие в вычислениях. Таким образом, учет только лишь процессоров при распределении нагрузки на вычислительную систему является лишь первым приближением к решению задачи о достижении высокой производительности, и учет всех компонент системы позволит улучшить этот результат.
+
+\razdel[n]{Алгоритм распределения нагрузки}
+Для учета производительности всех компонент вычислительной системы и неоднородности различных частей, на которые делятся входные и выходные данные, распределение нагрузки можно провести в два этапа. На первом этапе часть входных данных (или подзадача) направляется на соответствующее устройство, на которое предполагается произвести нагрузку, например, видеокарту или процессор; если же предполагается произвести нагрузку на устройство хранения, то подзадача направляется на процессор или процессорное ядро, специально выделенное под такой тип нагрузки. На втором этапе, когда тип устройства уже выбран, подзадача распределяется на одно из доступных в системе устройств данного типа. Несмотря на то, что на этом этапе подсистема в большинстве случаев является однородной (состоящей из устройств одного типа), для учета неоднородных подзадач необходим алгоритм распределения, который бы учитывал размер частей, на которые делится задача.
+
+Такой алгоритм можно построить на основе алгоритма <<заполнения>> (англ. backfill), который широко применяется для распределения нагрузки на узлы вычислительного кластера, но для его эффективной работы в случае многопроцессорной системы нужно произвести определенные модификации. Для расчета времени решения задачи на кластере не существует надежного метода, и часто это время задается вручную перед отправкой задачи в очередь~\cite{backfill}, что неприемлемо в случае многопроцессорной системы, и поэтому время решения отдельных подзадач необходимо предсказать. Для получения надежного предсказания можно воспользоваться любым подходящим статистическим методом и использовать время выполнения предыдущих подзадач в качестве исходных данных. Для учета неоднородной производительности устройств можно воспользоваться тем же методом, только в качестве исходных данных взять производительность устройства на предыдующих задачах (количество задач, завершенных в единицу времени). Чтобы сократить накладные расходы, метод должен быть достаточно простым, и поэтому в тестах был использовано осреднение $N$ последних значений характеристики. Использование статистических методов в случае многопроцессорной системы оправдано, поскольку в отличие от задач, решаемых на кластерах, время решения подзадач достаточно мало, чтобы статистические методы работали эффективно. В случае же кластерных систем ввиду очень большого времени решения одной задачи использование статистических методов не может дать надежный результат, и алгоритм <<заполнения>> работает эффективно для небольших \mbox{задач}~\cite{backfill}.
+
+Таким образом, распределение нагрузки осуществляется в два этапа: на первом этапе задача направляется на соответствующее ее типу нагрузки устройство, а на втором этапе она направляется на одно из выбранных устройств по алгоритму распределения. Сам же алгоритм является алгоритмом <<заполнения>> с модификациями, позволяющими автоматически предсказывать время выполнения задачи и производительность устройств.
+
+\razdel[n]{Нагрузочное тестирование}
+В качестве задачи для нагрузочного тестирования была выбрана задача генерации взволнованной морской поверхности, имеющая практическое применение в создании виртуального полигона~\cite{csit, autoreg1, autoreg2, stab}. Генерация взволнованной поверхности реализована как преобразование белого шума, поверхность генерируется с помощью авторегрессионной модели, а давления рассчитываются по аналитической формуле. Алгоритм задачи состоит из трех фаз, наиболее требовательной к вычислительным ресурсам из которых является фаза генерации. Решение начинается с определения коэффициентов авторегрессии и дисперсии белого шума путем решения системы уравнений Юла --- Уокера, затем следует генерация белого шума и его преобразование во взволнованную морскую поверхность, которая в завершении записывается в файл. Таким образом, задача заключается в генерации реальной морской поверхности и расчете поля давлений в каждой точке под этой поверхностью и является основой для расчета качки судна и воздействия взволнованной поверхности на стационарный объект.
+
+Программа сбалансированна с точки зрения нагрузки на процессорные ядра, однако, как показали тесты, характеризуется высокой нагрузкой на устройства хранения. До проведения тестирования программа была реализована на OpenMP и для сравнения переписана в соответствии с разработанным подходом к распределению нагрузки, реализованным в виде отдельной библиотеки. Конфигурация оборудования, использованная в тестах, приведена в таблице~1. В результате две реализации были сопоставлены с точки зрения производительности.
+\newpage
+
+\Table{Конфигурация оборудования.}{ll} {
+ Компонента & Подробности \\
+ \hline
+ Язык программирования & C++11 \\
+ Библиотека потоков & C++11 STL threads \\
+ Библиотека атомарных операций & C++11 STL atomic \\
+ Подрограммы замера времени & clock\_gettime(CLOCK\_MONOTONIC) \\
+ & /usr/bin/time -f \%e \\
+ Компилятор & GCC 4.8.2 \\
+ Опции компиляции & -std=c++11 -O2 -march=native \\
+ Операционная система & Debian 3.2.51-1 x86\_64 \\
+ Файловая система & ext4 \\
+ Процессор & Intel Core 2 Quad Q9650 \\
+ Частота процессора (ГГц) & 3.00 \\
+ Количество ядер & 4 \\
+ Емкость ОЗУ (ГБ) & 8 \\
+ Диск & Seagate ST3250318AS \\
+ Скорость диска (об./мин.) & 7200 \\
+ \hline
+}
+
+В процессе экспериментов была измерена эффективность описанного метода распределения нагрузки, и он показал более высокую производительность в задаче генерации взволнованной поверхности (в задаче генерации большого объема данных) по сравнению с реализацией OpenMP. В результате предыдущих исследований было установлено, что реализация OpenMP имеет наилучшую производительность по сравнению с другими технологиями параллельного программирования~\cite{csit}, поэтому эксперимент заключался в сравнении ее производительности с производительностью нового метода на ряде входных данных. При каждом запуске варьировался только размер взволнованной поверхности. В результате эксперимента было установлено, что с увеличением размера поверхности увеличивается разрыв в производительности этих двух реализаций (см.~рис.~\ref{fig:performance}), а высокая производительность предложенного метода обуславливается наложением по времени фазы генерации взволнованной поверхности и фазы записи ее на диск (см.~рис.~\ref{fig:overlap}). В реализации OpenMP такого наложения не происходит, и запись на диск начинается сразу после окончания генерации поверхности в отличие от новой реализации, в которой генерация и запись на диск заканчиваются почти одновременно. Таким образом, в программах, работающих с большим объемом данных, конвейеризация параллельных вычислительных фаз более эффективна, чем их последовательное выполнение и позволяет сбалансировать нагрузку не только на процессорные ядра, но и на дисковую подсистему.
+
+\newpage
+\Figure{0.77\textwidth}{performance.eps}{Сравнение производительности реализаций программы на OpenMP и на разработанной технологии\label{fig:performance}}
+\Figure{0.77\textwidth}{overlap.eps}{Наложение параллельных вычислений на $[G_0,G_1]$ и записи данных на диск на $[W_0,W_1]$. В реализации OpenMP наложение отсутствует \label{fig:overlap}}
+
+Несмотря на то, что технология OpenMP содержит примитивы для создания конвейеров, соединить конвейером две распараллеленные фазы программы можно только вручную. Такое соединение можно реализовать с помощью синхронизированной очереди, в которую направляются сгенерированные части взволнованной поверхности, готовые к записи в файл. Используя директиву \textit{omp section}, можно описать работу каждого из звеньев получившегося конвейера, однако реализовать параллельную обработку каждого из звеньев (или хотя бы первого) не представляется возможным, так как требуется поддержка вложенных директив \textit{omp parallel}, что редко встречается в реализациях OpenMP. Таким образом, реализация описанного метода распределения нагрузки в рамках стандарта OpenMP затруднена.
+
+\razdel[n]{Выводы}
+Предложенный метод распределения нагрузки на многопроцессорную систему позволяет получить прирост производительности для приложений, считывающих и записывающих большой объем данных на диск, позволяет сбалансировать нагрузку на процессорные ядра вычислительной системы и назначить различные типы рабочей нагрузки разным процессорным ядрам, а также различным устройствам, в том числе дискам. В дальнейших исследованиях предполагается обобщить этот метод на распределенную вычислительную среду.
+%\newpage
+
+\begin{thebibliography}{5}
+ \bibitem{backfill} Zotkin~D., Keleher~P.\:J. Job-length estimation and performance in backfilling schedulers // Proceedings of the 8\textsuperscript{th} International Symposium on High Performance Distributed Computing. 1999. P.~236--243.
+ \bibitem{csit} Degtyarev~A.\:B., Gankevich~I.\:G. Wave surface generation using OpenCL, OpenMP and MPI // Proceedings of 8\textsuperscript{th} International Conference <<Computer Science \& Information Technologies>>. 2011. P.~248--251.
+ \bibitem{autoreg1} Degtyarev~A.\:B., Reed~A.\:M. Modelling of incident waves near the ship's hull (application of autoregressive approach in problems of simulation of rough seas) // Proceedings of 12\textsuperscript{th} International Ship Stability Workshop. 2011.
+ \bibitem{autoreg2} Degtyarev~A.\:B., Reed~A.\:M. Synoptic and short-term modeling of ocean waves // Proceedings of 29\textsuperscript{th} Symposium on Naval Hydrodynamics. 2012.
+ \bibitem{stab} Degtyarev~A.\:B., Gankevich~I.\:G. Evaluation of hydrodynamic pressures for autoregression model of irregular waves // Proceedings of 11\textsuperscript{th} International Conference <<Stability of Ships and Ocean Vehicles>>. 2012. P.~841--852.
+\end{thebibliography}
+
+\end{document}
diff --git a/overlap.svg b/overlap.svg
@@ -0,0 +1,171 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg
+ width="354" height="150"
+ viewBox="0 0 354 150"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+>
+
+<title>Gnuplot</title>
+<desc>Produced by GNUPLOT 4.6 patchlevel 3 </desc>
+
+<g id="gnuplot_canvas">
+
+<rect x="0" y="0" width="354" height="150" fill="none"/>
+<defs>
+
+ <circle id='gpDot' r='0.5' stroke-width='0.5'/>
+ <path id='gpPt0' stroke-width='0.333' stroke='currentColor' d='M-1,0 h2 M0,-1 v2'/>
+ <path id='gpPt1' stroke-width='0.333' stroke='currentColor' d='M-1,-1 L1,1 M1,-1 L-1,1'/>
+ <path id='gpPt2' stroke-width='0.333' stroke='currentColor' d='M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1'/>
+ <rect id='gpPt3' stroke-width='0.333' stroke='currentColor' x='-1' y='-1' width='2' height='2'/>
+ <rect id='gpPt4' stroke-width='0.333' stroke='currentColor' fill='currentColor' x='-1' y='-1' width='2' height='2'/>
+ <circle id='gpPt5' stroke-width='0.333' stroke='currentColor' cx='0' cy='0' r='1'/>
+ <use xlink:href='#gpPt5' id='gpPt6' fill='currentColor' stroke='none'/>
+ <path id='gpPt7' stroke-width='0.333' stroke='currentColor' d='M0,-1.33 L-1.33,0.67 L1.33,0.67 z'/>
+ <use xlink:href='#gpPt7' id='gpPt8' fill='currentColor' stroke='none'/>
+ <use xlink:href='#gpPt7' id='gpPt9' stroke='currentColor' transform='rotate(180)'/>
+ <use xlink:href='#gpPt9' id='gpPt10' fill='currentColor' stroke='none'/>
+ <use xlink:href='#gpPt3' id='gpPt11' stroke='currentColor' transform='rotate(45)'/>
+ <use xlink:href='#gpPt11' id='gpPt12' fill='currentColor' stroke='none'/>
+</defs>
+<g style="fill:none; color:white; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+ <path stroke='black' d='M142.8,74.2 L148.8,74.2 h0.01'/> <g transform="translate(137.2,77.2)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:end">
+ <text><tspan>Новый подход</tspan></text>
+ </g>
+ <path stroke='black' d='M142.8,27.0 L148.8,27.0 h0.01'/> <g transform="translate(137.2,30.0)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:end">
+ <text><tspan>OpenMP</tspan></text>
+ </g>
+ <path stroke='black' d='M142.8,105.6 L142.8,111.6 h0.01'/> <g transform="translate(142.8,126.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
+ <text><tspan> 0</tspan></text>
+ </g>
+ <path stroke='black' d='M170.6,105.6 L170.6,111.6 h0.01'/> <g transform="translate(170.6,126.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
+ <text><tspan> 5</tspan></text>
+ </g>
+ <path stroke='black' d='M198.5,105.6 L198.5,111.6 h0.01'/> <g transform="translate(198.5,126.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
+ <text><tspan> 10</tspan></text>
+ </g>
+ <path stroke='black' d='M226.3,105.6 L226.3,111.6 h0.01'/> <g transform="translate(226.3,126.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
+ <text><tspan> 15</tspan></text>
+ </g>
+ <path stroke='black' d='M254.2,105.6 L254.2,111.6 h0.01'/> <g transform="translate(254.2,126.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
+ <text><tspan> 20</tspan></text>
+ </g>
+ <path stroke='black' d='M282.0,105.6 L282.0,111.6 h0.01'/> <g transform="translate(282.0,126.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
+ <text><tspan> 25</tspan></text>
+ </g>
+ <path stroke='black' d='M309.9,105.6 L309.9,111.6 h0.01'/> <g transform="translate(309.9,126.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
+ <text><tspan> 30</tspan></text>
+ </g>
+ <path stroke='black' d='M337.7,105.6 L337.7,111.6 h0.01'/> <g transform="translate(337.7,126.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
+ <text><tspan> 35</tspan></text>
+ </g>
+ <path stroke='black' d='M142.8,11.3 M142.8,105.6 L337.7,105.6 M337.7,11.3 M142.8,11.3 h0.01'/> <g transform="translate(240.2,144.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
+ <text><tspan>Время [с]</tspan></text>
+ </g>
+</g>
+ <g id="gnuplot_plot_1" ><title>gnuplot_plot_1</title>
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+ <g transform="translate(247.6,45.0)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
+ <text><tspan>W</tspan><tspan font-size="6.4pt" dy="2.40pt">0</tspan><tspan font-size="8.0pt" dy="-2.40pt"></tspan></text>
+ </g>
+</g>
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+ <use xlink:href='#gpPt5' transform='translate(244.6,27.0) scale(2.31)' color='rgb( 0, 0, 0)'/>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+ <g transform="translate(316.9,45.0)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
+ <text><tspan>W</tspan><tspan font-size="6.4pt" dy="2.40pt">1</tspan><tspan font-size="8.0pt" dy="-2.40pt"></tspan></text>
+ </g>
+</g>
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+ <use xlink:href='#gpPt5' transform='translate(313.9,27.0) scale(2.31)' color='rgb( 0, 0, 0)'/>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+</g>
+ </g>
+ <g id="gnuplot_plot_2" ><title>gnuplot_plot_2</title>
+<g style="fill:none; color:green; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+ <g transform="translate(148.5,92.2)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
+ <text><tspan>W</tspan><tspan font-size="6.4pt" dy="2.40pt">0</tspan><tspan font-size="8.0pt" dy="-2.40pt"></tspan></text>
+ </g>
+</g>
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+ <use xlink:href='#gpPt5' transform='translate(145.5,74.2) scale(2.31)' color='rgb( 0, 0, 0)'/>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+ <g transform="translate(266.1,92.2)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
+ <text><tspan>W</tspan><tspan font-size="6.4pt" dy="2.40pt">1</tspan><tspan font-size="8.0pt" dy="-2.40pt"></tspan></text>
+ </g>
+</g>
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+ <use xlink:href='#gpPt5' transform='translate(263.1,74.2) scale(2.31)' color='rgb( 0, 0, 0)'/>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+</g>
+ </g>
+ <g id="gnuplot_plot_3" ><title>gnuplot_plot_3</title>
+<g style="fill:none; color:blue; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+ <g transform="translate(146.8,15.0)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
+ <text><tspan>G</tspan><tspan font-size="6.4pt" dy="2.40pt">0</tspan><tspan font-size="8.0pt" dy="-2.40pt"></tspan></text>
+ </g>
+</g>
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+ <use xlink:href='#gpPt5' transform='translate(143.8,27.0) scale(2.31)' color='rgb( 0, 0, 0)'/>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+ <g transform="translate(247.5,15.0)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
+ <text><tspan>G</tspan><tspan font-size="6.4pt" dy="2.40pt">1</tspan><tspan font-size="8.0pt" dy="-2.40pt"></tspan></text>
+ </g>
+</g>
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+ <use xlink:href='#gpPt5' transform='translate(244.5,27.0) scale(2.31)' color='rgb( 0, 0, 0)'/>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+</g>
+ </g>
+ <g id="gnuplot_plot_4" ><title>gnuplot_plot_4</title>
+<g style="fill:none; color:cyan; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+ <g transform="translate(147.7,62.2)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
+ <text><tspan>G</tspan><tspan font-size="6.4pt" dy="2.40pt">0</tspan><tspan font-size="8.0pt" dy="-2.40pt"></tspan></text>
+ </g>
+</g>
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+ <use xlink:href='#gpPt5' transform='translate(144.7,74.2) scale(2.31)' color='rgb( 0, 0, 0)'/>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+ <g transform="translate(266.1,62.2)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
+ <text><tspan>G</tspan><tspan font-size="6.4pt" dy="2.40pt">1</tspan><tspan font-size="8.0pt" dy="-2.40pt"></tspan></text>
+ </g>
+</g>
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+ <use xlink:href='#gpPt5' transform='translate(263.1,74.2) scale(2.31)' color='rgb( 0, 0, 0)'/>
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+</g>
+ </g>
+ <g id="gnuplot_plot_5" ><title>gnuplot_plot_5</title>
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+ <path stroke='rgb( 0, 0, 0)' d='M142.8,27.0 L143.8,27.0 L244.5,27.0 L244.6,27.0 L313.9,27.0 L314.3,27.0 h0.01'/></g>
+ </g>
+ <g id="gnuplot_plot_6" ><title>gnuplot_plot_6</title>
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+ <path stroke='rgb( 0, 0, 0)' d='M142.8,74.2 L144.7,74.2 L145.5,74.2 L263.1,74.2 L263.2,74.2 h0.01'/></g>
+ </g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+ <path stroke='black' d='M142.8,11.3 M142.8,105.6 L337.7,105.6 M337.7,11.3 M142.8,11.3 h0.01'/></g>
+</g>
+</svg>
+
diff --git a/performance.svg b/performance.svg
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg
+ width="354" height="150"
+ viewBox="0 0 354 150"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+>
+
+<title>Gnuplot</title>
+<desc>Produced by GNUPLOT 4.6 patchlevel 3 </desc>
+
+<g id="gnuplot_canvas">
+
+<rect x="0" y="0" width="354" height="150" fill="none"/>
+<defs>
+
+ <circle id='gpDot' r='0.5' stroke-width='0.5'/>
+ <path id='gpPt0' stroke-width='0.333' stroke='currentColor' d='M-1,0 h2 M0,-1 v2'/>
+ <path id='gpPt1' stroke-width='0.333' stroke='currentColor' d='M-1,-1 L1,1 M1,-1 L-1,1'/>
+ <path id='gpPt2' stroke-width='0.333' stroke='currentColor' d='M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1'/>
+ <rect id='gpPt3' stroke-width='0.333' stroke='currentColor' x='-1' y='-1' width='2' height='2'/>
+ <rect id='gpPt4' stroke-width='0.333' stroke='currentColor' fill='currentColor' x='-1' y='-1' width='2' height='2'/>
+ <circle id='gpPt5' stroke-width='0.333' stroke='currentColor' cx='0' cy='0' r='1'/>
+ <use xlink:href='#gpPt5' id='gpPt6' fill='currentColor' stroke='none'/>
+ <path id='gpPt7' stroke-width='0.333' stroke='currentColor' d='M0,-1.33 L-1.33,0.67 L1.33,0.67 z'/>
+ <use xlink:href='#gpPt7' id='gpPt8' fill='currentColor' stroke='none'/>
+ <use xlink:href='#gpPt7' id='gpPt9' stroke='currentColor' transform='rotate(180)'/>
+ <use xlink:href='#gpPt9' id='gpPt10' fill='currentColor' stroke='none'/>
+ <use xlink:href='#gpPt3' id='gpPt11' stroke='currentColor' transform='rotate(45)'/>
+ <use xlink:href='#gpPt11' id='gpPt12' fill='currentColor' stroke='none'/>
+</defs>
+<g style="fill:none; color:white; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+ <path stroke='black' d='M48.8,105.6 L42.8,105.6 h0.01'/> <g transform="translate(37.2,108.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:end">
+ <text><tspan> 0</tspan></text>
+ </g>
+ <path stroke='black' d='M48.8,92.1 L42.8,92.1 h0.01'/> <g transform="translate(37.2,95.1)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:end">
+ <text><tspan> 5</tspan></text>
+ </g>
+ <path stroke='black' d='M48.8,78.7 L42.8,78.7 h0.01'/> <g transform="translate(37.2,81.7)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:end">
+ <text><tspan> 10</tspan></text>
+ </g>
+ <path stroke='black' d='M48.8,65.2 L42.8,65.2 h0.01'/> <g transform="translate(37.2,68.2)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:end">
+ <text><tspan> 15</tspan></text>
+ </g>
+ <path stroke='black' d='M48.8,51.7 L42.8,51.7 h0.01'/> <g transform="translate(37.2,54.7)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:end">
+ <text><tspan> 20</tspan></text>
+ </g>
+ <path stroke='black' d='M48.8,38.2 L42.8,38.2 h0.01'/> <g transform="translate(37.2,41.2)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:end">
+ <text><tspan> 25</tspan></text>
+ </g>
+ <path stroke='black' d='M48.8,24.8 L42.8,24.8 h0.01'/> <g transform="translate(37.2,27.8)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:end">
+ <text><tspan> 30</tspan></text>
+ </g>
+ <path stroke='black' d='M48.8,11.3 L42.8,11.3 h0.01'/> <g transform="translate(37.2,14.3)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:end">
+ <text><tspan> 35</tspan></text>
+ </g>
+ <path stroke='black' d='M48.8,105.6 L48.8,111.6 h0.01'/> <g transform="translate(48.8,126.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
+ <text><tspan>0</tspan></text>
+ </g>
+ <path stroke='black' d='M89.0,105.6 L89.0,111.6 h0.01'/> <g transform="translate(89.0,126.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
+ <text><tspan>10</tspan><tspan font-size="6.4pt" dy="-4.00pt">7</tspan><tspan font-size="8.0pt" dy="4.00pt"></tspan></text>
+ </g>
+ <path stroke='black' d='M129.1,105.6 L129.1,111.6 h0.01'/> <g transform="translate(129.1,126.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
+ <text><tspan>2∙10</tspan><tspan font-size="6.4pt" dy="-4.00pt">7</tspan><tspan font-size="8.0pt" dy="4.00pt"></tspan></text>
+ </g>
+ <path stroke='black' d='M169.3,105.6 L169.3,111.6 h0.01'/> <g transform="translate(169.3,126.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
+ <text><tspan>3∙10</tspan><tspan font-size="6.4pt" dy="-4.00pt">7</tspan><tspan font-size="8.0pt" dy="4.00pt"></tspan></text>
+ </g>
+ <path stroke='black' d='M48.8,11.3 L48.8,105.6 L169.3,105.6 M169.3,11.3 M48.8,11.3 h0.01'/> <g transform="translate(11.8,58.5) rotate(270)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
+ <text><tspan>Время [с]</tspan></text>
+ </g>
+ <g transform="translate(109.0,144.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
+ <text><tspan>Размер задачи</tspan></text>
+ </g>
+</g>
+ <g id="gnuplot_plot_1" ><title>gnuplot_plot_1</title>
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+ <g transform="translate(309.3,55.5)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:end">
+ <text><tspan>OpenMP</tspan></text>
+ </g>
+ <path stroke='rgb( 0, 0, 0)' d='M314.9,52.5 L343.3,52.5 M57.0,97.0 L65.3,88.4 L73.5,76.6 L81.7,72.1 L89.9,63.6 L98.2,55.1
+ L106.4,46.4 L114.6,37.7 L122.8,29.2 L131.1,20.9 h0.01'/></g>
+ </g>
+ <g id="gnuplot_plot_2" ><title>gnuplot_plot_2</title>
+<g style="fill:none; color:green; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+ <g transform="translate(309.3,67.5)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:end">
+ <text><tspan>Новый подход</tspan></text>
+ </g>
+ <path stroke='rgb( 0, 0, 0)' stroke-dasharray=' 5,8' d='M314.9,64.5 L343.3,64.5 M57.0,99.4 L65.3,93.6 L73.5,85.8 L81.7,82.4 L89.9,74.9 L98.2,69.7
+ L106.4,63.8 L114.6,57.6 L122.8,51.4 L131.1,44.9 h0.01'/></g>
+ </g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
+ <path stroke='black' d='M48.8,11.3 L48.8,105.6 L169.3,105.6 M169.3,11.3 M48.8,11.3 h0.01'/></g>
+</g>
+</svg>
+
diff --git a/pmstyle14.sty b/pmstyle14.sty
@@ -0,0 +1,219 @@
+%%%%%%%%%%%%%%%%%%%%%%%
+%%% %%%
+%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% : 25.01.2014
+%%%
+%%% 2. ,
+%%% . .
+%%%
+%%% 3.
+%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%% %%%
+\usepackage{ifthen}
+\usepackage[cp1251]{inputenc}
+\usepackage[russian]{babel}
+\usepackage{amsmath,amsfonts,amssymb}
+
+\usepackage{floatrow}
+\usepackage[dvips]{graphicx}
+\usepackage{verbatim}
+\usepackage{wrapfig}
+\usepackage{url}
+
+%%% %%%
+\def\maketitle{
+
+{\raggedright \@udk \par \smallskip {\bf\@author} \par}
+
+\bigskip
+{\centering\large\bf\@title\par} \par
+\bigskip
+}
+
+\def\udk#1{\gdef\@udk{#1}}
+\def\@udk{}
+
+%%% %%%
+\def\recprof#1{\noindent\textit{ #1}\bigskip\vskip-0.3cm}
+
+\def\recdotz#1{\noindent\textit{ #1}\bigskip\vskip-0.3cm}
+
+\def\recsp#1{\noindent\textit{ \newline{}#1}\bigskip\vskip-0.3cm}
+
+\def\norec{\bigskip\vskip-0.3cm\vskip-0.3cm}
+
+%%% %%%
+%% / 3-
+\newcounter{c_sec}
+\newcounter{c_sec2}
+\newcounter{c_sec3}
+\setcounter{c_sec}{0}
+\newcommand{\secn}{\arabic{c_sec}.}
+\newcommand{\subsecn}{\secn\arabic{c_sec2}.}
+\newcommand{\subsubsecn}{\subsecn\arabic{c_sec3}.}
+\newcommand{\razdel}[2][numbered]{\par\ifthenelse{\equal{#1}{numbered}}
+{\addtocounter{c_sec}{+1}\setcounter{c_sec2}{0}\vspace{0.2cm}\textbf{\secn\,\,#2.}}%
+{\vspace{0.2cm}\textbf{#2.}}}%
+\newcommand{\podrazdel}[1]{\par\addtocounter{c_sec2}{+1}\setcounter{c_sec3}{0}\hspace{0.3cm}\textbf{\subsecn\,\,#1.}}%
+\newcommand{\podpodrazdel}[1]{\par\addtocounter{c_sec3}{+1}\hspace{0.3cm}\textbf{\subsubsec\,\,#1.}}%
+
+%%% %%%
+% . .
+
+%%% %%%
+\newcounter{c_teo}
+\setcounter{c_teo}{0}
+\newcounter{c_lem}
+\setcounter{c_lem}{0}
+\newcounter{c_gip}
+\setcounter{c_gip}{0}
+\newcounter{c_utv}
+\setcounter{c_utv}{0}
+\newcounter{c_opr}
+\setcounter{c_opr}{0}
+\newcounter{c_zam}
+\setcounter{c_zam}{0}
+\newcounter{c_pri}
+\setcounter{c_pri}{0}
+\newcounter{c_sle}
+\setcounter{c_sle}{0}
+
+\newcommand{\theorn}{\arabic{c_teo}}
+\newcommand{\Theorem}[2][numbered]{\par\setcounter{c_sle}{0}\ifthenelse{\equal{#1}{numbered}}%
+{\addtocounter{c_teo}{+1}\par\textbf{\,\,\theorn.}\textit{ #2}}%
+{\par\textbf{.}\textit{ #2}}}%
+\newcommand{\TheoremCite}[3][numbered]{\par\setcounter{c_sle}{0}\ifthenelse{\equal{#1}{numbered}}%
+{\addtocounter{c_teo}{+1}\par\textbf{\,\,\theorn}\,\,\cite{#2}.\textit{ #3}}%
+{\par\textbf{}\,\,\cite{#2}.\textit{ #3}}}%
+
+\newcommand{\lemman}{\arabic{c_lem}}
+\newcommand{\Lemma}[2][numbered]{\par\ifthenelse{\equal{#1}{numbered}}%
+{\addtocounter{c_lem}{+1}\par\textbf{\,\,\lemman.}\textit{ #2}}%
+{\par\textbf{.}\textit{ #2}}}%
+\newcommand{\LemmaCite}[3][numbered]{\par\ifthenelse{\equal{#1}{numbered}}%
+{\addtocounter{c_lem}{+1}\par\textbf{\,\,\lemman}\,\,\cite{#2}.\textit{ #3}}%
+{\par\textbf{}\,\,\cite{#2}.\textit{ #3}}}%
+
+\newcommand{\hypotn}{\arabic{c_gip}}
+\newcommand{\Hypothesis}[2][numbered]{\par\ifthenelse{\equal{#1}{numbered}}%
+{\addtocounter{c_gip}{+1}\par\textbf{\,\,\hypotn.}\textit{ #2}}%
+{\par\textbf{.}\textit{ #2}}}%
+\newcommand{\HypothesisCite}[3][numbered]{\par\ifthenelse{\equal{#1}{numbered}}%
+{\addtocounter{c_gip}{+1}\par\textbf{\,\,\hypotn}\,\,\cite{#2}.\textit{ #3}}%
+{\par\textbf{}\,\,\cite{#2}.\textit{ #3}}}%
+
+\newcommand{\staten}{\arabic{c_utv}}
+\newcommand{\Statement}[2][numbered]{\par\ifthenelse{\equal{#1}{numbered}}%
+{\addtocounter{c_utv}{+1}\par\textbf{\,\,\staten.}\textit{ #2}}%
+{\par\textbf{.}\textit{ #2}}}%
+\newcommand{\StatementCite}[3][numbered]{\par\ifthenelse{\equal{#1}{numbered}}%
+{\addtocounter{c_utv}{+1}\par\textbf{\,\,\staten}\,\,\cite{#2}.\textit{ #3}}%
+{\par\textbf{}\,\,\cite{#2}.\textit{ #3}}}%
+
+\newcommand{\definn}{\arabic{c_opr}}
+\newcommand{\Definition}[1][numbered]{\par\ifthenelse{\equal{#1}{numbered}}%
+{\addtocounter{c_opr}{+1}\par\textbf{\,\,\definn.\,}}%
+{\par\textbf{.}}}%
+\newcommand{\DefinitionCite}[2][numbered]{\par\ifthenelse{\equal{#1}{numbered}}%
+{\addtocounter{c_opr}{+1}\par\textbf{\,\,\definn}\,\,\cite{#2}.}%
+{\par\textbf{}\,\,\cite{#2}.}}%
+
+\newcommand{\Proof}{\par\textbf{.} }
+
+\newcommand{\exampn}{\arabic{c_pri}}
+\newcommand{\Example}[1][numbered]{\par\ifthenelse{\equal{#1}{numbered}}%
+{\addtocounter{c_pri}{+1}\par\textbf{\,\,\exampn.}}%
+{\par\textbf{.}}}%
+\newcommand{\ExampleCite}[2][numbered]{\par\ifthenelse{\equal{#1}{numbered}}%
+{\addtocounter{c_pri}{+1}\par\textbf{\,\,\exampn}\,\,\cite{#2}.}%
+{\par\textbf{}\,\,\cite{#2}.}}%
+
+\newcommand{\remrkn}{\arabic{c_zam}}
+\newcommand{\Remark}[1][numbered]{\par\ifthenelse{\equal{#1}{numbered}}%
+{\addtocounter{c_zam}{+1}\par\textbf{\,\,\remrkn.}}%
+{\par\textbf{.}}}%
+\newcommand{\RemarkCite}[2][numbered]{\par\ifthenelse{\equal{#1}{numbered}}%
+{\addtocounter{c_zam}{+1}\par\textbf{\,\,\remrkn}\,\,\cite{#2}.}%
+{\par\textbf{}\,\,\cite{#2}.}}%
+
+\newcommand{\coroln}{\arabic{c_sle}}
+\newcommand{\Corollary}[2][numbered]{\par\ifthenelse{\equal{#1}{numbered}}%
+{\addtocounter{c_sle}{+1}\par\textbf{\,\,\coroln.}\textit{ #2}}%
+{\par\textbf{.}\textit{ #2}}}%
+\newcommand{\CorollaryCite}[3][numbered]{\par\ifthenelse{\equal{#1}{numbered}}%
+{\addtocounter{c_sle}{+1}\par\textbf{,\,\coroln}\,\,\cite{#2}.\textit{ #3}}%
+{\par\textbf{}\,\,\cite{#2}.\textit{ #3}}}%
+
+%%% %%%
+\newcounter{c_tab}
+\setcounter{c_tab}{0}
+\newcommand{\tabn}{\arabic{c_tab}}
+\newcommand{\nextline}{\tabularnewline\hline}
+\newcommand{\Table}[5][numbered]{\par\vspace{-0.3cm}\begin{flushright}\ifthenelse{\equal{#1}{numbered}}%
+{\addtocounter{c_tab}{+1}{\footnotesize\textbf{\,\,\tabn.} #2}}%
+{{\footnotesize\textbf{.} #2}}%
+\end{flushright}\vspace{-0.5cm}\par{\footnotesize\begin{center}\begin{tabular}{#3}\hline#4\end{tabular}\end{center}}}%
+
+%%% %%%
+\renewcommand{\@makecaption}[2]{%
+\abovecaptionskip=-5pt
+\belowcaptionskip=-27pt
+\vspace{\abovecaptionskip}%
+\sbox{\@tempboxa}{{\footnotesize {\textbf{#1.}} #2}}
+\ifdim \wd\@tempboxa > \hsize
+ \begin{center} {\footnotesize {\textbf{#1.}} #2} \par \end{center}
+\else
+ \global\@minipagefalse
+ \hbox to \hsize {\footnotesize \hfil{\textbf{#1.}} #2\hfil}%
+\fi
+\vspace{\belowcaptionskip}}
+
+\newcommand{\Figure}[3]{\begin{figure}[h]\begin{center}\includegraphics[width=#1]{#2}\caption{#3\vspace{ 1cm}}\end{center}\end{figure}}
+
+\newcommand{\WrapFigure}[5]{\begin{wrapfigure}[#1]{l}{#2}
+\includegraphics[width=#3]{#4}\caption{#5}
+\end{wrapfigure}\vspace{0.3cm}}
+
+\newcommand{\WrapFigureR}[5]{\begin{wrapfigure}[#1]{r}{#2}
+\includegraphics[width=#3]{#4}\caption{#5}
+\end{wrapfigure}\vspace{0.3cm}}
+
+%%% %%%
+\newcommand{\ITEM}{\vspace{-0.2cm}\item}
+\newcommand{\MList}[1]{\par\begin{itemize}#1\end{itemize}}
+\newcommand{\NList}[1]{\par\begin{enumerate}#1\end{enumerate}}
+
+
+\pagestyle{empty}
+\textwidth 110mm
+\textheight 165mm
+\oddsidemargin 24mm
+\topmargin 2.7cm
+\renewcommand\@biblabel[1]{#1.}
+%\AtBeginDocument{\def\refname{}}
+\renewenvironment{thebibliography}[1]
+ {\vskip12pt plus3pt minus6pt
+ {\centering\large\bf \par}%
+ \medskip
+ \list{\@biblabel{\@arabic\c@enumiv}}%
+ {\settowidth\labelwidth{\@biblabel{#1}}%
+ \leftmargin\labelwidth
+ \advance\leftmargin\labelsep
+ \@openbib@code
+ \usecounter{enumiv}%
+ \let\p@enumiv\@empty
+ \renewcommand\theenumiv{\@arabic\c@enumiv}}%
+ \sloppy
+ \clubpenalty4000
+ \@clubpenalty \clubpenalty
+ \widowpenalty4000%
+ \sfcode`\.\@m}
+ {\def\@noitemerr
+ {\@latex@warning{Empty `thebibliography' environment}}%
+ \endlist}
+
+\tolerance=1000
diff --git a/tex/Makefile b/tex/Makefile
@@ -1,17 +0,0 @@
-NAME=gankevich
-
-$(NAME).pdf: $(NAME).tex performance.eps overlap.eps
- pdflatex $(NAME).tex
- pdflatex $(NAME).tex
- pdflatex $(NAME).tex
-
-%.eps: %.svg
- inkscape --file=$< --export-area-drawing --without-gui --export-eps=$@
-
-$(NAME).tex: $(NAME)_utf8.tex
- iconv -f utf8 -t cp1251 <$(NAME)_utf8.tex >$(NAME).tex
-
-clean:
- rm -f $(NAME).log $(NAME).aux $(NAME).pdf *-converted-to.pdf
- rm -f *.eps *.nav *.out *.toc *.snm
- rm -f $(NAME).tex
diff --git a/tex/gankevich_utf8.tex b/tex/gankevich_utf8.tex
@@ -1,74 +0,0 @@
-\documentclass{article}
-\usepackage{pmstyle14}
-\usepackage{cite}
-
-\begin{document}
-\hyphenation{СПбГУ}
-\udk{УДК 51.37}
-\author{Ганкевич~И.\:Г., Дегтярев~А.\:Б.}
-\title{Метод распределения нагрузки на~многопроцессорную систему}
-\renewcommand{\thefootnote}{ }
-{\footnotetext{{\it Ганкевич Иван Геннадьевич} -- аспирант, Санкт-Петербургский государственный университет; e-mail: igankevich@cc.spbu.ru, тел.: +7(921)422-23-21}}
-{\footnotetext{{\it Дегтярев Александр Борисович} -- профессор, Санкт-Петербургский государственный университет; e-mail: deg@csa.ru, тел.: +7(911)913-48-99}}
-\maketitle
-\norec{}
-
-
-\razdel[n]{Введение}
-Наиболее разработанным и широко применяемым подходом к распределению нагрузки на вычислительную систему является разбиение данных на однородные части (или разбиение задачи на однородные подзадачи) с последующим распределением их между отдельными ядрами вычислительного устройства или узлами кластера, однако такой подход не всегда работает эффективно. Во-первых, часто общее количество частей, на которые разбиваются входные данные, диктуется не архитектурой и конфигурацией вычислительной системы, а самой задачей и присущими ей ограничениями, и такое распределение не всегда эффективно с точки зрения вычислительной машины: количество частей оказывается либо слишком большим по сравнению с количеством процессоров, работающих параллельно, что ведет к увеличению накладных расходов на обмен данными, либо слишком маленьким, что не позволяет эффективно использовать все доступные вычислительные ядра. Во-вторых, сам характер деления входных данных на части может стать причиной появления неоднородности в размерах различных частей и дисбаланса нагрузки на отдельные вычислительные ядра системы. В-третьих, поскольку в вычислительной системе процессор --- не единственное устройство, справляющееся с нагрузкой, и существуют другие компоненты, участвующие в вычислениях (такие как векторные ускорители, видеокарты и устройства хранения), то окончательная производительность системы и время решения конкретной задачи зависят от производительности не только процессоров, но и всех устройств, принимающих участие в вычислениях. Таким образом, учет только лишь процессоров при распределении нагрузки на вычислительную систему является лишь первым приближением к решению задачи о достижении высокой производительности, и учет всех компонент системы позволит улучшить этот результат.
-
-\razdel[n]{Алгоритм распределения нагрузки}
-Для учета производительности всех компонент вычислительной системы и неоднородности различных частей, на которые делятся входные и выходные данные, распределение нагрузки можно провести в два этапа. На первом этапе часть входных данных (или подзадача) направляется на соответствующее устройство, на которое предполагается произвести нагрузку, например, видеокарту или процессор; если же предполагается произвести нагрузку на устройство хранения, то подзадача направляется на процессор или процессорное ядро, специально выделенное под такой тип нагрузки. На втором этапе, когда тип устройства уже выбран, подзадача распределяется на одно из доступных в системе устройств данного типа. Несмотря на то, что на этом этапе подсистема в большинстве случаев является однородной (состоящей из устройств одного типа), для учета неоднородных подзадач необходим алгоритм распределения, который бы учитывал размер частей, на которые делится задача.
-
-Такой алгоритм можно построить на основе алгоритма <<заполнения>> (англ. backfill), который широко применяется для распределения нагрузки на узлы вычислительного кластера, но для его эффективной работы в случае многопроцессорной системы нужно произвести определенные модификации. Для расчета времени решения задачи на кластере не существует надежного метода, и часто это время задается вручную перед отправкой задачи в очередь~\cite{backfill}, что неприемлемо в случае многопроцессорной системы, и поэтому время решения отдельных подзадач необходимо предсказать. Для получения надежного предсказания можно воспользоваться любым подходящим статистическим методом и использовать время выполнения предыдущих подзадач в качестве исходных данных. Для учета неоднородной производительности устройств можно воспользоваться тем же методом, только в качестве исходных данных взять производительность устройства на предыдующих задачах (количество задач, завершенных в единицу времени). Чтобы сократить накладные расходы, метод должен быть достаточно простым, и поэтому в тестах был использовано осреднение $N$ последних значений характеристики. Использование статистических методов в случае многопроцессорной системы оправдано, поскольку в отличие от задач, решаемых на кластерах, время решения подзадач достаточно мало, чтобы статистические методы работали эффективно. В случае же кластерных систем ввиду очень большого времени решения одной задачи использование статистических методов не может дать надежный результат, и алгоритм <<заполнения>> работает эффективно для небольших \mbox{задач}~\cite{backfill}.
-
-Таким образом, распределение нагрузки осуществляется в два этапа: на первом этапе задача направляется на соответствующее ее типу нагрузки устройство, а на втором этапе она направляется на одно из выбранных устройств по алгоритму распределения. Сам же алгоритм является алгоритмом <<заполнения>> с модификациями, позволяющими автоматически предсказывать время выполнения задачи и производительность устройств.
-
-\razdel[n]{Нагрузочное тестирование}
-В качестве задачи для нагрузочного тестирования была выбрана задача генерации взволнованной морской поверхности, имеющая практическое применение в создании виртуального полигона~\cite{csit, autoreg1, autoreg2, stab}. Генерация взволнованной поверхности реализована как преобразование белого шума, поверхность генерируется с помощью авторегрессионной модели, а давления рассчитываются по аналитической формуле. Алгоритм задачи состоит из трех фаз, наиболее требовательной к вычислительным ресурсам из которых является фаза генерации. Решение начинается с определения коэффициентов авторегрессии и дисперсии белого шума путем решения системы уравнений Юла --- Уокера, затем следует генерация белого шума и его преобразование во взволнованную морскую поверхность, которая в завершении записывается в файл. Таким образом, задача заключается в генерации реальной морской поверхности и расчете поля давлений в каждой точке под этой поверхностью и является основой для расчета качки судна и воздействия взволнованной поверхности на стационарный объект.
-
-Программа сбалансированна с точки зрения нагрузки на процессорные ядра, однако, как показали тесты, характеризуется высокой нагрузкой на устройства хранения. До проведения тестирования программа была реализована на OpenMP и для сравнения переписана в соответствии с разработанным подходом к распределению нагрузки, реализованным в виде отдельной библиотеки. Конфигурация оборудования, использованная в тестах, приведена в таблице~1. В результате две реализации были сопоставлены с точки зрения производительности.
-\newpage
-
-\Table{Конфигурация оборудования.}{ll} {
- Компонента & Подробности \\
- \hline
- Язык программирования & C++11 \\
- Библиотека потоков & C++11 STL threads \\
- Библиотека атомарных операций & C++11 STL atomic \\
- Подрограммы замера времени & clock\_gettime(CLOCK\_MONOTONIC) \\
- & /usr/bin/time -f \%e \\
- Компилятор & GCC 4.8.2 \\
- Опции компиляции & -std=c++11 -O2 -march=native \\
- Операционная система & Debian 3.2.51-1 x86\_64 \\
- Файловая система & ext4 \\
- Процессор & Intel Core 2 Quad Q9650 \\
- Частота процессора (ГГц) & 3.00 \\
- Количество ядер & 4 \\
- Емкость ОЗУ (ГБ) & 8 \\
- Диск & Seagate ST3250318AS \\
- Скорость диска (об./мин.) & 7200 \\
- \hline
-}
-
-В процессе экспериментов была измерена эффективность описанного метода распределения нагрузки, и он показал более высокую производительность в задаче генерации взволнованной поверхности (в задаче генерации большого объема данных) по сравнению с реализацией OpenMP. В результате предыдущих исследований было установлено, что реализация OpenMP имеет наилучшую производительность по сравнению с другими технологиями параллельного программирования~\cite{csit}, поэтому эксперимент заключался в сравнении ее производительности с производительностью нового метода на ряде входных данных. При каждом запуске варьировался только размер взволнованной поверхности. В результате эксперимента было установлено, что с увеличением размера поверхности увеличивается разрыв в производительности этих двух реализаций (см.~рис.~\ref{fig:performance}), а высокая производительность предложенного метода обуславливается наложением по времени фазы генерации взволнованной поверхности и фазы записи ее на диск (см.~рис.~\ref{fig:overlap}). В реализации OpenMP такого наложения не происходит, и запись на диск начинается сразу после окончания генерации поверхности в отличие от новой реализации, в которой генерация и запись на диск заканчиваются почти одновременно. Таким образом, в программах, работающих с большим объемом данных, конвейеризация параллельных вычислительных фаз более эффективна, чем их последовательное выполнение и позволяет сбалансировать нагрузку не только на процессорные ядра, но и на дисковую подсистему.
-
-\newpage
-\Figure{0.77\textwidth}{performance.eps}{Сравнение производительности реализаций программы на OpenMP и на разработанной технологии\label{fig:performance}}
-\Figure{0.77\textwidth}{overlap.eps}{Наложение параллельных вычислений на $[G_0,G_1]$ и записи данных на диск на $[W_0,W_1]$. В реализации OpenMP наложение отсутствует \label{fig:overlap}}
-
-Несмотря на то, что технология OpenMP содержит примитивы для создания конвейеров, соединить конвейером две распараллеленные фазы программы можно только вручную. Такое соединение можно реализовать с помощью синхронизированной очереди, в которую направляются сгенерированные части взволнованной поверхности, готовые к записи в файл. Используя директиву \textit{omp section}, можно описать работу каждого из звеньев получившегося конвейера, однако реализовать параллельную обработку каждого из звеньев (или хотя бы первого) не представляется возможным, так как требуется поддержка вложенных директив \textit{omp parallel}, что редко встречается в реализациях OpenMP. Таким образом, реализация описанного метода распределения нагрузки в рамках стандарта OpenMP затруднена.
-
-\razdel[n]{Выводы}
-Предложенный метод распределения нагрузки на многопроцессорную систему позволяет получить прирост производительности для приложений, считывающих и записывающих большой объем данных на диск, позволяет сбалансировать нагрузку на процессорные ядра вычислительной системы и назначить различные типы рабочей нагрузки разным процессорным ядрам, а также различным устройствам, в том числе дискам. В дальнейших исследованиях предполагается обобщить этот метод на распределенную вычислительную среду.
-%\newpage
-
-\begin{thebibliography}{5}
- \bibitem{backfill} Zotkin~D., Keleher~P.\:J. Job-length estimation and performance in backfilling schedulers // Proceedings of the 8\textsuperscript{th} International Symposium on High Performance Distributed Computing. 1999. P.~236--243.
- \bibitem{csit} Degtyarev~A.\:B., Gankevich~I.\:G. Wave surface generation using OpenCL, OpenMP and MPI // Proceedings of 8\textsuperscript{th} International Conference <<Computer Science \& Information Technologies>>. 2011. P.~248--251.
- \bibitem{autoreg1} Degtyarev~A.\:B., Reed~A.\:M. Modelling of incident waves near the ship's hull (application of autoregressive approach in problems of simulation of rough seas) // Proceedings of 12\textsuperscript{th} International Ship Stability Workshop. 2011.
- \bibitem{autoreg2} Degtyarev~A.\:B., Reed~A.\:M. Synoptic and short-term modeling of ocean waves // Proceedings of 29\textsuperscript{th} Symposium on Naval Hydrodynamics. 2012.
- \bibitem{stab} Degtyarev~A.\:B., Gankevich~I.\:G. Evaluation of hydrodynamic pressures for autoregression model of irregular waves // Proceedings of 11\textsuperscript{th} International Conference <<Stability of Ships and Ocean Vehicles>>. 2012. P.~841--852.
-\end{thebibliography}
-
-\end{document}
diff --git a/tex/overlap.svg b/tex/overlap.svg
@@ -1,171 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
- "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg
- width="354" height="150"
- viewBox="0 0 354 150"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
->
-
-<title>Gnuplot</title>
-<desc>Produced by GNUPLOT 4.6 patchlevel 3 </desc>
-
-<g id="gnuplot_canvas">
-
-<rect x="0" y="0" width="354" height="150" fill="none"/>
-<defs>
-
- <circle id='gpDot' r='0.5' stroke-width='0.5'/>
- <path id='gpPt0' stroke-width='0.333' stroke='currentColor' d='M-1,0 h2 M0,-1 v2'/>
- <path id='gpPt1' stroke-width='0.333' stroke='currentColor' d='M-1,-1 L1,1 M1,-1 L-1,1'/>
- <path id='gpPt2' stroke-width='0.333' stroke='currentColor' d='M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1'/>
- <rect id='gpPt3' stroke-width='0.333' stroke='currentColor' x='-1' y='-1' width='2' height='2'/>
- <rect id='gpPt4' stroke-width='0.333' stroke='currentColor' fill='currentColor' x='-1' y='-1' width='2' height='2'/>
- <circle id='gpPt5' stroke-width='0.333' stroke='currentColor' cx='0' cy='0' r='1'/>
- <use xlink:href='#gpPt5' id='gpPt6' fill='currentColor' stroke='none'/>
- <path id='gpPt7' stroke-width='0.333' stroke='currentColor' d='M0,-1.33 L-1.33,0.67 L1.33,0.67 z'/>
- <use xlink:href='#gpPt7' id='gpPt8' fill='currentColor' stroke='none'/>
- <use xlink:href='#gpPt7' id='gpPt9' stroke='currentColor' transform='rotate(180)'/>
- <use xlink:href='#gpPt9' id='gpPt10' fill='currentColor' stroke='none'/>
- <use xlink:href='#gpPt3' id='gpPt11' stroke='currentColor' transform='rotate(45)'/>
- <use xlink:href='#gpPt11' id='gpPt12' fill='currentColor' stroke='none'/>
-</defs>
-<g style="fill:none; color:white; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
-</g>
-<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
- <path stroke='black' d='M142.8,74.2 L148.8,74.2 h0.01'/> <g transform="translate(137.2,77.2)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:end">
- <text><tspan>Новый подход</tspan></text>
- </g>
- <path stroke='black' d='M142.8,27.0 L148.8,27.0 h0.01'/> <g transform="translate(137.2,30.0)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:end">
- <text><tspan>OpenMP</tspan></text>
- </g>
- <path stroke='black' d='M142.8,105.6 L142.8,111.6 h0.01'/> <g transform="translate(142.8,126.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
- <text><tspan> 0</tspan></text>
- </g>
- <path stroke='black' d='M170.6,105.6 L170.6,111.6 h0.01'/> <g transform="translate(170.6,126.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
- <text><tspan> 5</tspan></text>
- </g>
- <path stroke='black' d='M198.5,105.6 L198.5,111.6 h0.01'/> <g transform="translate(198.5,126.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
- <text><tspan> 10</tspan></text>
- </g>
- <path stroke='black' d='M226.3,105.6 L226.3,111.6 h0.01'/> <g transform="translate(226.3,126.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
- <text><tspan> 15</tspan></text>
- </g>
- <path stroke='black' d='M254.2,105.6 L254.2,111.6 h0.01'/> <g transform="translate(254.2,126.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
- <text><tspan> 20</tspan></text>
- </g>
- <path stroke='black' d='M282.0,105.6 L282.0,111.6 h0.01'/> <g transform="translate(282.0,126.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
- <text><tspan> 25</tspan></text>
- </g>
- <path stroke='black' d='M309.9,105.6 L309.9,111.6 h0.01'/> <g transform="translate(309.9,126.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
- <text><tspan> 30</tspan></text>
- </g>
- <path stroke='black' d='M337.7,105.6 L337.7,111.6 h0.01'/> <g transform="translate(337.7,126.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
- <text><tspan> 35</tspan></text>
- </g>
- <path stroke='black' d='M142.8,11.3 M142.8,105.6 L337.7,105.6 M337.7,11.3 M142.8,11.3 h0.01'/> <g transform="translate(240.2,144.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
- <text><tspan>Время [с]</tspan></text>
- </g>
-</g>
- <g id="gnuplot_plot_1" ><title>gnuplot_plot_1</title>
-<g style="fill:none; color:red; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
-</g>
-<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
- <g transform="translate(247.6,45.0)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
- <text><tspan>W</tspan><tspan font-size="6.4pt" dy="2.40pt">0</tspan><tspan font-size="8.0pt" dy="-2.40pt"></tspan></text>
- </g>
-</g>
-<g style="fill:none; color:red; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
- <use xlink:href='#gpPt5' transform='translate(244.6,27.0) scale(2.31)' color='rgb( 0, 0, 0)'/>
-</g>
-<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
- <g transform="translate(316.9,45.0)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
- <text><tspan>W</tspan><tspan font-size="6.4pt" dy="2.40pt">1</tspan><tspan font-size="8.0pt" dy="-2.40pt"></tspan></text>
- </g>
-</g>
-<g style="fill:none; color:red; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
- <use xlink:href='#gpPt5' transform='translate(313.9,27.0) scale(2.31)' color='rgb( 0, 0, 0)'/>
-</g>
-<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
-</g>
- </g>
- <g id="gnuplot_plot_2" ><title>gnuplot_plot_2</title>
-<g style="fill:none; color:green; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
-</g>
-<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
- <g transform="translate(148.5,92.2)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
- <text><tspan>W</tspan><tspan font-size="6.4pt" dy="2.40pt">0</tspan><tspan font-size="8.0pt" dy="-2.40pt"></tspan></text>
- </g>
-</g>
-<g style="fill:none; color:red; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
- <use xlink:href='#gpPt5' transform='translate(145.5,74.2) scale(2.31)' color='rgb( 0, 0, 0)'/>
-</g>
-<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
- <g transform="translate(266.1,92.2)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
- <text><tspan>W</tspan><tspan font-size="6.4pt" dy="2.40pt">1</tspan><tspan font-size="8.0pt" dy="-2.40pt"></tspan></text>
- </g>
-</g>
-<g style="fill:none; color:red; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
- <use xlink:href='#gpPt5' transform='translate(263.1,74.2) scale(2.31)' color='rgb( 0, 0, 0)'/>
-</g>
-<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
-</g>
- </g>
- <g id="gnuplot_plot_3" ><title>gnuplot_plot_3</title>
-<g style="fill:none; color:blue; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
-</g>
-<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
- <g transform="translate(146.8,15.0)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
- <text><tspan>G</tspan><tspan font-size="6.4pt" dy="2.40pt">0</tspan><tspan font-size="8.0pt" dy="-2.40pt"></tspan></text>
- </g>
-</g>
-<g style="fill:none; color:red; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
- <use xlink:href='#gpPt5' transform='translate(143.8,27.0) scale(2.31)' color='rgb( 0, 0, 0)'/>
-</g>
-<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
- <g transform="translate(247.5,15.0)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
- <text><tspan>G</tspan><tspan font-size="6.4pt" dy="2.40pt">1</tspan><tspan font-size="8.0pt" dy="-2.40pt"></tspan></text>
- </g>
-</g>
-<g style="fill:none; color:red; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
- <use xlink:href='#gpPt5' transform='translate(244.5,27.0) scale(2.31)' color='rgb( 0, 0, 0)'/>
-</g>
-<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
-</g>
- </g>
- <g id="gnuplot_plot_4" ><title>gnuplot_plot_4</title>
-<g style="fill:none; color:cyan; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
-</g>
-<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
- <g transform="translate(147.7,62.2)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
- <text><tspan>G</tspan><tspan font-size="6.4pt" dy="2.40pt">0</tspan><tspan font-size="8.0pt" dy="-2.40pt"></tspan></text>
- </g>
-</g>
-<g style="fill:none; color:red; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
- <use xlink:href='#gpPt5' transform='translate(144.7,74.2) scale(2.31)' color='rgb( 0, 0, 0)'/>
-</g>
-<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
- <g transform="translate(266.1,62.2)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
- <text><tspan>G</tspan><tspan font-size="6.4pt" dy="2.40pt">1</tspan><tspan font-size="8.0pt" dy="-2.40pt"></tspan></text>
- </g>
-</g>
-<g style="fill:none; color:red; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
- <use xlink:href='#gpPt5' transform='translate(263.1,74.2) scale(2.31)' color='rgb( 0, 0, 0)'/>
-</g>
-<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
-</g>
- </g>
- <g id="gnuplot_plot_5" ><title>gnuplot_plot_5</title>
-<g style="fill:none; color:red; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
- <path stroke='rgb( 0, 0, 0)' d='M142.8,27.0 L143.8,27.0 L244.5,27.0 L244.6,27.0 L313.9,27.0 L314.3,27.0 h0.01'/></g>
- </g>
- <g id="gnuplot_plot_6" ><title>gnuplot_plot_6</title>
-<g style="fill:none; color:red; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
- <path stroke='rgb( 0, 0, 0)' d='M142.8,74.2 L144.7,74.2 L145.5,74.2 L263.1,74.2 L263.2,74.2 h0.01'/></g>
- </g>
-<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
- <path stroke='black' d='M142.8,11.3 M142.8,105.6 L337.7,105.6 M337.7,11.3 M142.8,11.3 h0.01'/></g>
-</g>
-</svg>
-
diff --git a/tex/performance.svg b/tex/performance.svg
@@ -1,100 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
- "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg
- width="354" height="150"
- viewBox="0 0 354 150"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
->
-
-<title>Gnuplot</title>
-<desc>Produced by GNUPLOT 4.6 patchlevel 3 </desc>
-
-<g id="gnuplot_canvas">
-
-<rect x="0" y="0" width="354" height="150" fill="none"/>
-<defs>
-
- <circle id='gpDot' r='0.5' stroke-width='0.5'/>
- <path id='gpPt0' stroke-width='0.333' stroke='currentColor' d='M-1,0 h2 M0,-1 v2'/>
- <path id='gpPt1' stroke-width='0.333' stroke='currentColor' d='M-1,-1 L1,1 M1,-1 L-1,1'/>
- <path id='gpPt2' stroke-width='0.333' stroke='currentColor' d='M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1'/>
- <rect id='gpPt3' stroke-width='0.333' stroke='currentColor' x='-1' y='-1' width='2' height='2'/>
- <rect id='gpPt4' stroke-width='0.333' stroke='currentColor' fill='currentColor' x='-1' y='-1' width='2' height='2'/>
- <circle id='gpPt5' stroke-width='0.333' stroke='currentColor' cx='0' cy='0' r='1'/>
- <use xlink:href='#gpPt5' id='gpPt6' fill='currentColor' stroke='none'/>
- <path id='gpPt7' stroke-width='0.333' stroke='currentColor' d='M0,-1.33 L-1.33,0.67 L1.33,0.67 z'/>
- <use xlink:href='#gpPt7' id='gpPt8' fill='currentColor' stroke='none'/>
- <use xlink:href='#gpPt7' id='gpPt9' stroke='currentColor' transform='rotate(180)'/>
- <use xlink:href='#gpPt9' id='gpPt10' fill='currentColor' stroke='none'/>
- <use xlink:href='#gpPt3' id='gpPt11' stroke='currentColor' transform='rotate(45)'/>
- <use xlink:href='#gpPt11' id='gpPt12' fill='currentColor' stroke='none'/>
-</defs>
-<g style="fill:none; color:white; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
-</g>
-<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
- <path stroke='black' d='M48.8,105.6 L42.8,105.6 h0.01'/> <g transform="translate(37.2,108.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:end">
- <text><tspan> 0</tspan></text>
- </g>
- <path stroke='black' d='M48.8,92.1 L42.8,92.1 h0.01'/> <g transform="translate(37.2,95.1)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:end">
- <text><tspan> 5</tspan></text>
- </g>
- <path stroke='black' d='M48.8,78.7 L42.8,78.7 h0.01'/> <g transform="translate(37.2,81.7)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:end">
- <text><tspan> 10</tspan></text>
- </g>
- <path stroke='black' d='M48.8,65.2 L42.8,65.2 h0.01'/> <g transform="translate(37.2,68.2)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:end">
- <text><tspan> 15</tspan></text>
- </g>
- <path stroke='black' d='M48.8,51.7 L42.8,51.7 h0.01'/> <g transform="translate(37.2,54.7)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:end">
- <text><tspan> 20</tspan></text>
- </g>
- <path stroke='black' d='M48.8,38.2 L42.8,38.2 h0.01'/> <g transform="translate(37.2,41.2)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:end">
- <text><tspan> 25</tspan></text>
- </g>
- <path stroke='black' d='M48.8,24.8 L42.8,24.8 h0.01'/> <g transform="translate(37.2,27.8)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:end">
- <text><tspan> 30</tspan></text>
- </g>
- <path stroke='black' d='M48.8,11.3 L42.8,11.3 h0.01'/> <g transform="translate(37.2,14.3)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:end">
- <text><tspan> 35</tspan></text>
- </g>
- <path stroke='black' d='M48.8,105.6 L48.8,111.6 h0.01'/> <g transform="translate(48.8,126.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
- <text><tspan>0</tspan></text>
- </g>
- <path stroke='black' d='M89.0,105.6 L89.0,111.6 h0.01'/> <g transform="translate(89.0,126.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
- <text><tspan>10</tspan><tspan font-size="6.4pt" dy="-4.00pt">7</tspan><tspan font-size="8.0pt" dy="4.00pt"></tspan></text>
- </g>
- <path stroke='black' d='M129.1,105.6 L129.1,111.6 h0.01'/> <g transform="translate(129.1,126.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
- <text><tspan>2∙10</tspan><tspan font-size="6.4pt" dy="-4.00pt">7</tspan><tspan font-size="8.0pt" dy="4.00pt"></tspan></text>
- </g>
- <path stroke='black' d='M169.3,105.6 L169.3,111.6 h0.01'/> <g transform="translate(169.3,126.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
- <text><tspan>3∙10</tspan><tspan font-size="6.4pt" dy="-4.00pt">7</tspan><tspan font-size="8.0pt" dy="4.00pt"></tspan></text>
- </g>
- <path stroke='black' d='M48.8,11.3 L48.8,105.6 L169.3,105.6 M169.3,11.3 M48.8,11.3 h0.01'/> <g transform="translate(11.8,58.5) rotate(270)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
- <text><tspan>Время [с]</tspan></text>
- </g>
- <g transform="translate(109.0,144.6)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:middle">
- <text><tspan>Размер задачи</tspan></text>
- </g>
-</g>
- <g id="gnuplot_plot_1" ><title>gnuplot_plot_1</title>
-<g style="fill:none; color:red; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
- <g transform="translate(309.3,55.5)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:end">
- <text><tspan>OpenMP</tspan></text>
- </g>
- <path stroke='rgb( 0, 0, 0)' d='M314.9,52.5 L343.3,52.5 M57.0,97.0 L65.3,88.4 L73.5,76.6 L81.7,72.1 L89.9,63.6 L98.2,55.1
- L106.4,46.4 L114.6,37.7 L122.8,29.2 L131.1,20.9 h0.01'/></g>
- </g>
- <g id="gnuplot_plot_2" ><title>gnuplot_plot_2</title>
-<g style="fill:none; color:green; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
- <g transform="translate(309.3,67.5)" style="stroke:none; fill:black; font-family:DejaVU Serif; font-size:8.00pt; text-anchor:end">
- <text><tspan>Новый подход</tspan></text>
- </g>
- <path stroke='rgb( 0, 0, 0)' stroke-dasharray=' 5,8' d='M314.9,64.5 L343.3,64.5 M57.0,99.4 L65.3,93.6 L73.5,85.8 L81.7,82.4 L89.9,74.9 L98.2,69.7
- L106.4,63.8 L114.6,57.6 L122.8,51.4 L131.1,44.9 h0.01'/></g>
- </g>
-<g style="fill:none; color:black; stroke:currentColor; stroke-width:0.50; stroke-linecap:butt; stroke-linejoin:miter">
- <path stroke='black' d='M48.8,11.3 L48.8,105.6 L169.3,105.6 M169.3,11.3 M48.8,11.3 h0.01'/></g>
-</g>
-</svg>
-
diff --git a/tex/pmstyle14.sty b/tex/pmstyle14.sty
@@ -1,219 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%
-%%% %%%
-%%%%%%%%%%%%%%%%%%%%%%%
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%% : 25.01.2014
-%%%
-%%% 2. ,
-%%% . .
-%%%
-%%% 3.
-%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%%% %%%
-\usepackage{ifthen}
-\usepackage[cp1251]{inputenc}
-\usepackage[russian]{babel}
-\usepackage{amsmath,amsfonts,amssymb}
-
-\usepackage{floatrow}
-\usepackage[dvips]{graphicx}
-\usepackage{verbatim}
-\usepackage{wrapfig}
-\usepackage{url}
-
-%%% %%%
-\def\maketitle{
-
-{\raggedright \@udk \par \smallskip {\bf\@author} \par}
-
-\bigskip
-{\centering\large\bf\@title\par} \par
-\bigskip
-}
-
-\def\udk#1{\gdef\@udk{#1}}
-\def\@udk{}
-
-%%% %%%
-\def\recprof#1{\noindent\textit{ #1}\bigskip\vskip-0.3cm}
-
-\def\recdotz#1{\noindent\textit{ #1}\bigskip\vskip-0.3cm}
-
-\def\recsp#1{\noindent\textit{ \newline{}#1}\bigskip\vskip-0.3cm}
-
-\def\norec{\bigskip\vskip-0.3cm\vskip-0.3cm}
-
-%%% %%%
-%% / 3-
-\newcounter{c_sec}
-\newcounter{c_sec2}
-\newcounter{c_sec3}
-\setcounter{c_sec}{0}
-\newcommand{\secn}{\arabic{c_sec}.}
-\newcommand{\subsecn}{\secn\arabic{c_sec2}.}
-\newcommand{\subsubsecn}{\subsecn\arabic{c_sec3}.}
-\newcommand{\razdel}[2][numbered]{\par\ifthenelse{\equal{#1}{numbered}}
-{\addtocounter{c_sec}{+1}\setcounter{c_sec2}{0}\vspace{0.2cm}\textbf{\secn\,\,#2.}}%
-{\vspace{0.2cm}\textbf{#2.}}}%
-\newcommand{\podrazdel}[1]{\par\addtocounter{c_sec2}{+1}\setcounter{c_sec3}{0}\hspace{0.3cm}\textbf{\subsecn\,\,#1.}}%
-\newcommand{\podpodrazdel}[1]{\par\addtocounter{c_sec3}{+1}\hspace{0.3cm}\textbf{\subsubsec\,\,#1.}}%
-
-%%% %%%
-% . .
-
-%%% %%%
-\newcounter{c_teo}
-\setcounter{c_teo}{0}
-\newcounter{c_lem}
-\setcounter{c_lem}{0}
-\newcounter{c_gip}
-\setcounter{c_gip}{0}
-\newcounter{c_utv}
-\setcounter{c_utv}{0}
-\newcounter{c_opr}
-\setcounter{c_opr}{0}
-\newcounter{c_zam}
-\setcounter{c_zam}{0}
-\newcounter{c_pri}
-\setcounter{c_pri}{0}
-\newcounter{c_sle}
-\setcounter{c_sle}{0}
-
-\newcommand{\theorn}{\arabic{c_teo}}
-\newcommand{\Theorem}[2][numbered]{\par\setcounter{c_sle}{0}\ifthenelse{\equal{#1}{numbered}}%
-{\addtocounter{c_teo}{+1}\par\textbf{\,\,\theorn.}\textit{ #2}}%
-{\par\textbf{.}\textit{ #2}}}%
-\newcommand{\TheoremCite}[3][numbered]{\par\setcounter{c_sle}{0}\ifthenelse{\equal{#1}{numbered}}%
-{\addtocounter{c_teo}{+1}\par\textbf{\,\,\theorn}\,\,\cite{#2}.\textit{ #3}}%
-{\par\textbf{}\,\,\cite{#2}.\textit{ #3}}}%
-
-\newcommand{\lemman}{\arabic{c_lem}}
-\newcommand{\Lemma}[2][numbered]{\par\ifthenelse{\equal{#1}{numbered}}%
-{\addtocounter{c_lem}{+1}\par\textbf{\,\,\lemman.}\textit{ #2}}%
-{\par\textbf{.}\textit{ #2}}}%
-\newcommand{\LemmaCite}[3][numbered]{\par\ifthenelse{\equal{#1}{numbered}}%
-{\addtocounter{c_lem}{+1}\par\textbf{\,\,\lemman}\,\,\cite{#2}.\textit{ #3}}%
-{\par\textbf{}\,\,\cite{#2}.\textit{ #3}}}%
-
-\newcommand{\hypotn}{\arabic{c_gip}}
-\newcommand{\Hypothesis}[2][numbered]{\par\ifthenelse{\equal{#1}{numbered}}%
-{\addtocounter{c_gip}{+1}\par\textbf{\,\,\hypotn.}\textit{ #2}}%
-{\par\textbf{.}\textit{ #2}}}%
-\newcommand{\HypothesisCite}[3][numbered]{\par\ifthenelse{\equal{#1}{numbered}}%
-{\addtocounter{c_gip}{+1}\par\textbf{\,\,\hypotn}\,\,\cite{#2}.\textit{ #3}}%
-{\par\textbf{}\,\,\cite{#2}.\textit{ #3}}}%
-
-\newcommand{\staten}{\arabic{c_utv}}
-\newcommand{\Statement}[2][numbered]{\par\ifthenelse{\equal{#1}{numbered}}%
-{\addtocounter{c_utv}{+1}\par\textbf{\,\,\staten.}\textit{ #2}}%
-{\par\textbf{.}\textit{ #2}}}%
-\newcommand{\StatementCite}[3][numbered]{\par\ifthenelse{\equal{#1}{numbered}}%
-{\addtocounter{c_utv}{+1}\par\textbf{\,\,\staten}\,\,\cite{#2}.\textit{ #3}}%
-{\par\textbf{}\,\,\cite{#2}.\textit{ #3}}}%
-
-\newcommand{\definn}{\arabic{c_opr}}
-\newcommand{\Definition}[1][numbered]{\par\ifthenelse{\equal{#1}{numbered}}%
-{\addtocounter{c_opr}{+1}\par\textbf{\,\,\definn.\,}}%
-{\par\textbf{.}}}%
-\newcommand{\DefinitionCite}[2][numbered]{\par\ifthenelse{\equal{#1}{numbered}}%
-{\addtocounter{c_opr}{+1}\par\textbf{\,\,\definn}\,\,\cite{#2}.}%
-{\par\textbf{}\,\,\cite{#2}.}}%
-
-\newcommand{\Proof}{\par\textbf{.} }
-
-\newcommand{\exampn}{\arabic{c_pri}}
-\newcommand{\Example}[1][numbered]{\par\ifthenelse{\equal{#1}{numbered}}%
-{\addtocounter{c_pri}{+1}\par\textbf{\,\,\exampn.}}%
-{\par\textbf{.}}}%
-\newcommand{\ExampleCite}[2][numbered]{\par\ifthenelse{\equal{#1}{numbered}}%
-{\addtocounter{c_pri}{+1}\par\textbf{\,\,\exampn}\,\,\cite{#2}.}%
-{\par\textbf{}\,\,\cite{#2}.}}%
-
-\newcommand{\remrkn}{\arabic{c_zam}}
-\newcommand{\Remark}[1][numbered]{\par\ifthenelse{\equal{#1}{numbered}}%
-{\addtocounter{c_zam}{+1}\par\textbf{\,\,\remrkn.}}%
-{\par\textbf{.}}}%
-\newcommand{\RemarkCite}[2][numbered]{\par\ifthenelse{\equal{#1}{numbered}}%
-{\addtocounter{c_zam}{+1}\par\textbf{\,\,\remrkn}\,\,\cite{#2}.}%
-{\par\textbf{}\,\,\cite{#2}.}}%
-
-\newcommand{\coroln}{\arabic{c_sle}}
-\newcommand{\Corollary}[2][numbered]{\par\ifthenelse{\equal{#1}{numbered}}%
-{\addtocounter{c_sle}{+1}\par\textbf{\,\,\coroln.}\textit{ #2}}%
-{\par\textbf{.}\textit{ #2}}}%
-\newcommand{\CorollaryCite}[3][numbered]{\par\ifthenelse{\equal{#1}{numbered}}%
-{\addtocounter{c_sle}{+1}\par\textbf{,\,\coroln}\,\,\cite{#2}.\textit{ #3}}%
-{\par\textbf{}\,\,\cite{#2}.\textit{ #3}}}%
-
-%%% %%%
-\newcounter{c_tab}
-\setcounter{c_tab}{0}
-\newcommand{\tabn}{\arabic{c_tab}}
-\newcommand{\nextline}{\tabularnewline\hline}
-\newcommand{\Table}[5][numbered]{\par\vspace{-0.3cm}\begin{flushright}\ifthenelse{\equal{#1}{numbered}}%
-{\addtocounter{c_tab}{+1}{\footnotesize\textbf{\,\,\tabn.} #2}}%
-{{\footnotesize\textbf{.} #2}}%
-\end{flushright}\vspace{-0.5cm}\par{\footnotesize\begin{center}\begin{tabular}{#3}\hline#4\end{tabular}\end{center}}}%
-
-%%% %%%
-\renewcommand{\@makecaption}[2]{%
-\abovecaptionskip=-5pt
-\belowcaptionskip=-27pt
-\vspace{\abovecaptionskip}%
-\sbox{\@tempboxa}{{\footnotesize {\textbf{#1.}} #2}}
-\ifdim \wd\@tempboxa > \hsize
- \begin{center} {\footnotesize {\textbf{#1.}} #2} \par \end{center}
-\else
- \global\@minipagefalse
- \hbox to \hsize {\footnotesize \hfil{\textbf{#1.}} #2\hfil}%
-\fi
-\vspace{\belowcaptionskip}}
-
-\newcommand{\Figure}[3]{\begin{figure}[h]\begin{center}\includegraphics[width=#1]{#2}\caption{#3\vspace{ 1cm}}\end{center}\end{figure}}
-
-\newcommand{\WrapFigure}[5]{\begin{wrapfigure}[#1]{l}{#2}
-\includegraphics[width=#3]{#4}\caption{#5}
-\end{wrapfigure}\vspace{0.3cm}}
-
-\newcommand{\WrapFigureR}[5]{\begin{wrapfigure}[#1]{r}{#2}
-\includegraphics[width=#3]{#4}\caption{#5}
-\end{wrapfigure}\vspace{0.3cm}}
-
-%%% %%%
-\newcommand{\ITEM}{\vspace{-0.2cm}\item}
-\newcommand{\MList}[1]{\par\begin{itemize}#1\end{itemize}}
-\newcommand{\NList}[1]{\par\begin{enumerate}#1\end{enumerate}}
-
-
-\pagestyle{empty}
-\textwidth 110mm
-\textheight 165mm
-\oddsidemargin 24mm
-\topmargin 2.7cm
-\renewcommand\@biblabel[1]{#1.}
-%\AtBeginDocument{\def\refname{}}
-\renewenvironment{thebibliography}[1]
- {\vskip12pt plus3pt minus6pt
- {\centering\large\bf \par}%
- \medskip
- \list{\@biblabel{\@arabic\c@enumiv}}%
- {\settowidth\labelwidth{\@biblabel{#1}}%
- \leftmargin\labelwidth
- \advance\leftmargin\labelsep
- \@openbib@code
- \usecounter{enumiv}%
- \let\p@enumiv\@empty
- \renewcommand\theenumiv{\@arabic\c@enumiv}}%
- \sloppy
- \clubpenalty4000
- \@clubpenalty \clubpenalty
- \widowpenalty4000%
- \sfcode`\.\@m}
- {\def\@noitemerr
- {\@latex@warning{Empty `thebibliography' environment}}%
- \endlist}
-
-\tolerance=1000