rtsIDr (1158449), страница 3
Текст из файла (страница 3)
Абстрактная машина (родительская), представление которой задано ссылкой *AMViewRefPtr, на момент обращения к функции setpsw_ должна быть отображена.
Все процессоры системы, заданной ссылкой *PSRefPtr, должны входить в состав элементного пересечения текущей процессорной системы с процессорной системой, в которую отображена родительская абстрактная машина. Равное NULL значение указателя PSRefPtr или нулевое значение ссылки *PSRefPtr означают, что задаются веса координат элементов текущей процессорной системы.
-
AMViewRefPtr = NULL или *AMViewRefPtr = 0.
Устанавливаемые веса координат процессоров, как и заданные при запуске системы поддержки, будут использоваться при отображении или переотображении всех представлений абстрактных машин в заданную процессорную систему (кроме тех, для которых функцией setpsw_ уже установлены или будут установлены свои веса координат процессоров).
Все процессоры системы, заданной ссылкой *PSRefPtr, должны входить в состав текущей процессорной системы. Равное NULL значение указателя PSRefPtr или нулевое значение ссылки *PSRefPtr означают, что задаются веса координат элементов текущей процессорной системы.
Вес координаты Pi i-го измерения процессорной системы задаётся значением
| i-1 |
| (PSSIZEk + Pi)-го |
| k=1 |
элемента массива CoordWeightArray. Число элементов массива CoordWeightArray с весами координат процессоров должно быть равно сумме размеров всех измерений многопроцессорной системы. Веса координат в массиве CoordWeightArray могут быть любыми вещественными положительными числами. При выполнении функции setpsw_ система поддержки корректирует каждый вес Pi делением его на минимальный вес координаты в массиве CoordWeightArray.
Если CoordWeightArray = NULL или CoordWeightArray[0] = 0, то в качестве устанавливаемых весов координат будут приняты веса, заданные параметрами запуска системы поддержки (для начальной процессорной системы), или единичные веса координат (для процессорной системы, не являющейся начальной).
Если CoordWeightArray[0] = 1, то веса всех координат будут установлены равными единице и не будут подвергнуты дальнейшей коррекции, т. е. будут приняты за оптимальные веса координат процессоров (см. ниже).
Функция возвращает нулевое значение.
Рассмотренные выше веса координат процессоров называются вычислительными весами и определяют распределение данных и вычислений по процессорам: вычислительная нагрузка на процессор пропорциональна вычислительному весу процессора (равному произведению вычислительных весов его координат). Вычислительные веса координат процессоров отражают вычислительную неоднородность решаемой задачи и задаются таким образом, чтобы обеспечить равномерную загрузку процессоров при условии равенства их производительностей.
Различие в производительности процессоров задается с помощью весов производительности: производительность процессора пропорциональна весу его производительности. Веса производительности (вещественные числа, большие или равные единице) являются параметрами запуска системы поддержки и в процессе выполнения пользовательской программы меняться не могут.
При инициализации системы поддержки (и при выполнении функции setpsw_) осуществляется коррекция вычислительных весов координат процессоров с учетом их производительностей. Результатом этой коррекции являются оптимальные веса координат процессоров, отражающие как вычислительную неоднородность решаемой задачи, так и аппаратурную неоднородность многопроцессорной системы. Оптимальные веса обеспечивают максимальную сбалансированность вычислений и определяются следующим образом. Пусть:
| WEIGHTcalc,i (Pi) | | вычислительный вес координаты Pi i-го измерения многопроцессорной системы (заданный в предположении, что веса производительностей всех процессоров равны единице); |
| WEIGHTperf (P1, ... , Pi, ... , Pn) | | вес производительности процессорного элемента (P1, ... , Pi, ... , Pn); |
| WEIGHTopt,i (Pi) | | искомый оптимальный вес координаты Pi i-го измерения многопроцессорной системы. |
Будем предполагать, что вес процессора, определяющий загрузку его данными и вычислениями:
-
пропорционален весу производительности процессора;
-
при любой производительности процессора равен произведению весов его координат.
Будем считать также, что "вклад" веса производительности процессора в веса его координат одинаков.
Поэтому значение веса производительности процессора WEIGHTperf(P1, ... ,Pi, ... ,Pn) требует увеличения вычислительного веса любой его координаты в WEIGHTperf1/n(P1, ... , Pi, ... , Pn) раз.
Поскольку при вычислении оптимального веса координаты Pi необходимо учитывать веса производительности всех процессоров с координатой Pi, требуемый WEIGHTopt,i(Pi) для любого Pi должен являться решением следующей задачи оптимизации (критерий максимально равномерная загрузка процессоров):
| MAX ( abs( WEIGHTopt,i(Pi) | WEIGHTperf1/n(P1, ... ,Pi, ... Pn) * |
| 0 ≤ p1 < pssize1 | WEIGHTcalc,i(Pi) ) ) MIN |
Решение в области больших или равных единице вещественных чисел есть
| WEIGHTopt,i (Pi) = | n |
| WEIGHTcalc,i (Pi) * | WEIGHTperf1/n (P1, ... ,Pi, ... Pn) / PSSIZEk |
| 0 ≤ p1 < pssize1 k=1 |
Использование оптимальных весов координат процессоров для неравномерного распределения элементов представления абстрактной машины (и, как следствие, элементов распределённого массива и витков параллельного цикла) рассмотрено в п.5.7.
Кроме рассмотренной ранее функции setpsw_, вычислительные веса координат процессоров могут быть заданы с помощью функций
| .long genbli_( | PSRef long | *PSRefPtr, *AxisCountPtr ); |
и
| .long genbld_( | PSRef long | *PSRefPtr, *AxisCountPtr ); |
Параметры PSRefPtr и AMViewRefPtr этих функций аналогичны одноимённым параметрам функции setpsw_. Веса координат процессоров задаются в отдельном для каждого измерения процессорной системы массиве, адрес которого содержится в массиве AxisWeightAddr: i-й элемент массива AxisWeightAddr является приведённым к типу AddrType указателем на массив с весами координат процессоров (i+1)-го измерения заданной процессорной системы. Функция genbli_ предполагает представление весов координат процессоров в виде целых положительных чисел (integer), а функция genbld_ в виде положительных вещественных (double).
Нулевое значение i-го элемента массива AxisWeightAddr означает, что для (i+1)-го измерения процессорной системы будут установлены веса координат процессоров, равные весам, заданым параметрами запуска системы поддержки (для начальной процессорной системы), или равные единице (для процессорной системы, не являющейся начальной).
Параметр *AxisCountPtr (неотрицательное целое число) задаёт количество элементов в массиве AxisWeightAddr. Его значение не может превосходить размерности заданной процессорной системы. Недостающие до размерности процессорной системы элементы массива AxisWeightAddr будут считаться нулевыми. В частности, равное нулю значение параметра *AxisCountPtr означает, что веса всех координат всех процессоров будут установлены либо единичными, либо равными весам, заданным в параметрах запуска системы поддержки.
Функции возращают нулевые значения.
Замечание. Выполнение функций genbli_ и genbld_ сводится к обращению к функции
| .long genblk_( | PSRef long long | *PSRefPtr, *AxisCountPtr, *DoubleSignPtr ); , |
первые четыре параметра которой идентичны одноимённым параметрам функций genbli_ и genbld_, а последний, *DoubleSignPtr, является ненулевым признаком представления весов координат процессоров в виде вещественных положительных чисел (double).
4.6Задание весов координат процессоров по весам их загрузки
| .long setelw_ ( | PSRef | *PSRefPtr, |
| *PSRefPtr | | ссылка на процессорную систему, для элементов которой устанавливаются веса координат. |
| *AMViewRefPtr | | ссылка на представление абстрактной машины, при отображении которого будут использованы вычисленные функцией setelw_ веса координат. |
| LoadWeightAddr | | массив, i-й элемент которого является приведённым к типу AddrType указателем на массив с координатными весами загрузки процессоров для (i+1)-го измерения процессорной системы, заданной ссылкой *PSRefPtr. |
| WeightNumber | | массив, i-й элемент которого содержит число элементов (координатных весов загрузки) в массиве, указатель на который задан в LoadWeightAddr[i]. |
| *AddrNumberPtr | | число элементов в массивах LoadWeightAddr и WeightNumber. |
Функция setelw_ определяет вычислительные веса координат элементов процессорной системы, заданной ссылкой *PSRefPtr, и затем устанавливает их с помощью функции setbld_ (см.п.4.5).
Установленные веса координат процессоров будут использованы только при отображении или переотображении заданного представления абстрактной машины в заданную процессорную систему.
Абстрактная машина (родительская), представление которой задано ссылкой *AMViewRefPtr, на момент обращения к функции setelw_ должна быть отображена.
Все процессоры системы, заданной ссылкой *PSRefPtr, должны входить в состав элементного пересечения текущей процессорной системы с процессорной системой, в которую отображена родительская абстрактная машина.
Равное NULL значение указателя PSRefPtr или нулевое значение ссылки *PSRefPtr означают, что задаются веса координат элементов текущей процессорной системы.














