На этом шаге мы рассмотримнекоторые особенности выполнения параллельных программ.
Последний рассмотренный на предыдушем шаге вариант организации параллельных вычислений для метода сеток обеспечивает практически максимально возможное ускорение выполняемых расчетов. Вместе с этим необходимо отметить, что разработанная вычислительная схема расчетов имеет важную принципиальную особенность - порождаемая при вычислениях последовательность обработки данных может различаться при разных запусках программы даже при одних и тех же исходных параметрах решаемой задачи. Данный эффект может проявляться в силу изменения каких-либо условий выполнения программы (вычислительной нагрузки, алгоритмов синхронизации потоков и т.п.), что может повлиять на временные соотношения между потоками. Взаиморасположение потоков по области расчетов может быть различным: одни потоки могут опережать другие и, обратно, часть потоков могут отставать (при этом характер взаиморасположения может меняться в ходе вычислений). Подобное поведение параллельных участков программы обычно именуется состязанием потоков.
В рассматриваемом примере при вычислении нового значения uij в зависимости от условий выполнения могут использоваться разные (от предыдущей или текущей итераций) оценки соседних значений по вертикали. Тем самым, количество итераций метода до выполнения условия остановки и, самое главное, конечное решение задачи может различаться при повторных запусках программы. Получаемые оценки величин uij будут соответствовать точному решению задачи в пределах задаваемой точности, но, тем не менее, могут быть различными. Использование вычислений такого типа для сеточных алгоритмов получило наименование метода хаотической релаксации. Следует отметить, что в общем случае неоднозначность результатов параллельных вычислений является нежелательной, поскольку повторяемость результатов работы программ является основой для возможности проверки правильности программного обеспечения. Стремление к однозначности получаемых результатов расчета приводит к необходимости соблюдения важного принципа параллельного программирования, в соответствии с которым временная динамика выполнения параллельных потоков не должна сказываться на выполнении параллельных программ.
На следующем шаге мы рассмотрим один из способов решения указанной проблемы.