Параллельное программирование: Учебное пособие, страница 65

CC++ не дает никаких гарантий детерминированного выполнения множества взаимодействующих процессов в едином адресном пространстве. Программа на CC++ легко оказывается детерминированной, если базовая задача использует модель параллелизма, в которой для каждого процесса выделен свой процессорный объект, и если подзадачи взаимодействуют только посредством библиотечных функций канала с одним передатчиком и одним получателем на канал, как в тексте 3.3.

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

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

par

{

value = pobj->get_remote_value();   // Связь

perform_computation();              // Вычисление

}

use_remote_value(value);

Для реализации асинхронных механизмов связи можно использовать RPC-ы, которые читают и записывают структуры данных в других процессорных объектах

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

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

3.5.7  Отображение

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

Рисунок 3.7. Отображение в CC++.

На рисунке 3.7 показан двухступенчатый процесс отображения параллельных процессов для программы, написанной на CC++. Сначала процессы привязывают к процессорным объектам, а затем последние отображают на процессоры.

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

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

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

3.5.8  Размещение процессорных объектов