\section{Распараллеливание на общую память}

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

Основной проблемой, возникающей при попытке построить схему распределения данных, является то, что разные циклы для их распараллеливания могут требовать разных, конфликтующих схем распределения данных. В силу объёмности практически значимых программ при их распараллеливании такие конфликты возникают повсеместно. Эта проблема подробно рассматривается в \cite{par-reg}.

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

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

\input{src/sections/task/dvm_shared}
\input{src/sections/task/sapfor_shared}
\input{src/sections/task/aims}
\input{src/sections/task/existing_solution}