программное обеспечение параллельных вычислений

 

Причины некорректного поведения программы

 
 

Наконец, выяснилось, что причиной некорректного поведения программы было непреднамеренное (и нежелательное) распределение данных, которое возникало в упомянутом операторе CREATE. В Фортране все параметры передаются "по ссылке", а это значит, что адрес переменной I передавался при каждом вызове подпрограммы CALC и, таким образом, становился общим для всех N процессов и исходного процесса, образованного каким-то другим процессом. При создании каждого процесса происходит обращение к переменной I, используемой для вычисления интервала, соответствующего этому процессу. Однако в то же самое время исходный процесс производит изменение переменной I как часть цикла DO. В зависимости от точности синхронизации и планирования процессов любой процесс мог получить либо предназначенное для него значение I, либо некоторое произвольное более позднее значение I.

Еще одно замечание. Для устранения этой ошибки часто предлагается простой прием, навеянный многолетним использованием языка Фортран. Опыт подсказывает, что при передаче в качестве параметра для подпрограммы CALC некоторого выражения (например, что-нибудь типа 1*1) действия подпрограммы не будут изменять значение I в основной программе. Это решение, казалось бы, устраняет нежелаемую общую переменную. Но это не так. Фортран просто образует временную переменную для хранения значения выражения 1*1 и адрес этой временной переменной передает затем в подпрограмму CALC Но теперь вместо совместного использования адреса переменной I процессы совместно используют адрес временной переменной!

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

В этом случае программа будет выглядеть следующим образом:

DO 100 I - 1 , N IARG(I) " I CREATE CALC (IARG(I)) 100 CONTINUE

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

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

 
 
 
Copyright (c) 2009. Использование материалов данного сайта возможно только при проставлении активной, не закрытой от индексации гиперссылки. http://soft-tlt.ru