Организация параллельных потоков. Часть 1 | страница 9



Вот этапы работы с критической секцией (К.С.):


Этап 1.Объявление переменной.

До начала основного модуля программы объявляем глобальную переменную:

CRITICAL_SECTION CS.

Это своего рода «указатель» на объект типа К.С.


Этап 2. Инициализация К. С.

В основном модуле программы инициализируем критическую секцию:

InitializeCriticalSection (&CS).

Начиная с этого момента, мы можем её использовать.


Этап 3. Начало К. С.

Мы объявляем, что входим в критическую секцию:

EnterCriticalSection (&CS).

Все команды, начиная с этого момента, могут выполняться только в одном потоке.


Этап 4. Конец К. С.

Объявляем, что выходим из критической секции

LeaveCriticalSection (&CS).

Дальнейшие команды снова можно выполнять в любом количестве параллельных потоков.


Этап 5. Удаление К. С.

В конце программы удаляем критическую секцию:

DeleteCriticalSection (&CS).

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


Пример программы параллельного суммирования с использованием К.С. приводится на рис. 5.3.


Рис. 5.3. Использование критической секции


Задание. Составьте программу параллельного суммирования с использованием критических секций (рис. 5.3). Запустите скомпилированную программу на выполнение несколько раз и сравните результаты вычислений.

5.5. Взаимодействие потоков

С помощью критической секции мы обеспечили целостность данных. Теперь программа выполняется без ошибок. Доступ к общей переменной S происходит корректно.

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

Задание. Модифицируйте программу (рис. 5.3) так, чтобы получить приемлемое ускорение без потери точности расчетов, используя глобальные и локальные переменные.

5.6. Эффективность распараллеливания

При анализе работы параллельных программ используют два основных показателя (рис. 5.4):

— ускорение S>p;

— эффективность E>p.

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

p — количество виртуальных процессоров (вычислительных устройств);

T>1 — время выполнения последовательной программы на одном виртуальном процессоре;

T — время выполнения параллельной программы на р виртуальных процессорах;


Рис. 5.4. Ускорение и эффективность