rtsIDr (1158390), страница 20
Текст из файла (страница 20)
| ArrayHeader | | заголовок распределённого массива. |
| BufferHeader | | заголовок создаваемого буфера удалённых элементов. |
| BasePtr | | базовый указатель для доступа к буферу удалённых элементов. |
| *StaticSignPtr | | признак создания статического буфера. |
| MEHeader | | заголовок индексной матрицы. |
| ConstArray | | массив, i-й элемент которого содержит значение константы выборки удалённых элементов для (i+1)-го измерения распределённого массива (Ci+1). |
Функция crtib_ создает буфер для размещения в нём удалённых элементов распределённого массива с заголовком ArrayHeader, удовлетворяющего условиям удалённого доступа.
Заголовок создаваемого буфера BufferHeader представляет собой массив из 3-х элементов типа «long ». Размещение заголовка в памяти (статическое или динамическое) производится пользовательской программой, а инициализация системой поддержки при выполнении функции crtib_.
Базовый указатель BasePtr должен ссылаться на любую переменную того же типа, что и тип элементов распределённого массива (содержимое этой переменной несущественно).
Подробнее работа с заголовком буфера удалённых элементов и базовым указателем рассмотрена в п.15.5.
Ненулевое значение *StaticSignPtr означает создание буфера, не уничтожаемого при выходе из программного блока (см.п.8). Такой буфер может быть уничтожен только явно, с помощью рассмотренной ниже функции delib_.
Заголовок индексной матрицы MEHeader представляет собой массив из 3-х элементов типа «long ». На момент обращения к функции crtib_ индексная матрица и распределённый массив должны быть размещены в памяти (отображены).
Значение ConstArray[k-1] несущественно (k номер распределённого измерения массива с заголовком ArrayHeader).
Функция возвращает нулевое значение.
15.2Запуск загрузки буфера удаленных элементов нерегулярного доступа
long loadib_ (long BufferHeader[]);
BufferHeader заголовок буфера удалённых элементов нерегулярного доступа.
Функция loadib_ инициирует загрузку заданного буфера элементами распределённого массива, для которого этот буфер был создан с помощью функции crtib_ .
Возвращается нулевое значение.
15.3Ожидание завершения загрузки буфера удаленных элементов нерегулярного доступа
long waitib_ (long BufferHeader[]);
BufferHeader заголовок буфера удалённых элементов нерегулярного доступа.
Возвращается нулевое значение.
15.4Уничтожение буфера удаленных элементов нерегулярного доступа
long delib_ (long BufferHeader[]);
BufferHeader заголовок уничтожаемого буфера удалённых элементов.
Буфер удалённых элементов может быть уничтожен функцией delib_ только в том случае, если он был создан в текущей подзадаче и в текущем программном блоке (или его подблоке) (см. п. 8 и п. 10).
Буфер удалённых элементов нерегулярного доступа может быть уничтожен также с помощью функции delobj_ (см.п.17.5).
Возвращается нулевое значение.
15.5Доступ к размещенным в буфере удаленным элементам
На любом процессоре буфер удалённых элементов нерегулярного доступа аналогичен локальной части двухмерного распределённого массива. Поэтому его заголовок может быть объявлен, например, как
long BufferHeader[3];
Обращение к размещённому в буфере удалённому элементу производится по индексным переменным правила выборки распределённого измерения массива (по индексным переменным матрицы глобальных индексов):
BasePtr[ BufferHeader[1]*Vk + J + BufferHeader[2] ] , где:
| BasePtr | | базовый указатель, соответствующий типу элементов распределённого массива; |
| Vk , J | | индексные переменные 1-го и 2-го измерений матрицы глобальных индексов. |
Для языка C при обращении к функции crtib_ значение базового указателя можно задать равным NULL. Тогда доступ к размещённому в буфере удалённому элементу можно осуществить разименованно:
( (Type *)BufferHeader[2] )[ BufferHeader[1]*Vk + J ] ,
где Type тип элементов распределённого массива.
Коеффициент BufferHeader[1] и адресная константа BufferHeader[2] вычисляются системой поддержки при выполнении функции crtib_ следующим образом.
Пусть:
BufferPtr адрес буфера удалённых элементов;
TypeSize размер в байтах одного элемента распределённого массива.
Тогда:
| BufferHeader[1] = | MAX( ME[Vk,0] ); |
BufferHeader[2] = BufferHeader[1] * Vk,нач;
| BufferHeader[2] = | { | BufferHeader[2] ((long)BufferPtr (long)BasePtr) / TypeSize при BasePtr NULL; BufferHeader[2]*TypeSize (long)BufferPtr при BasePtr = NULL. |
Замечание. Для доступа к размещённым в буфере удалённым элементам могут быть использованы все рассмотренные в п.13 функции и макроопределения. При их применении:
-
вместо заголовка распределённого массива необходимо использовать заголовок буфера;
-
размерность массива полагается равной 2;
-
в качестве индексного вектора элемента выступает вектор значений индексных переменных (Vk и J) правила выборки распределённого измерения массива.
15.6Создание группы буферов удаленных элементов нерегулярного доступа
| IndirectAccessGroupRef crtig_ ( | long | *StaticSignPtr, |
| *StaticSignPtr | | признак создания статической группы буферов. |
| *DelBufSignPtr | | признак уничтожения всех буферов, входящих в группу, при её уничтожении. |
Функция crtig_ создает пустую группу буферов (не содержащую ни одного буфера) и возвращает ссылку на неё.
Задаваемый ненулевым значением *StaticSignPtr признак статической группы означает создание группы, не уничтожаемой при выходе из программного блока (см.п.8). Такая группа может быть уничтожена только явно, с помощью рассмотреной ниже функции delig_ .
Ненулевое значение *DelBufSignPtr задает такой режим уничтожения группы буферов, при котором все входящие в неё буфера будут также уничтожены. При явном уничтожении группы уничтожение входящих в неё буферов будет также считаться явным, при неявном неявным.
15.7Включение в группу буфера удаленных элементов нерегулярного доступа
| long insib_ ( | IndirectAccessGroupRef | *IndirectAccessGroupRefPtr, |
| *IndirectAccessGroupRefPtr | | ссылка на группу буферов. |
| BufferHeader | | заголовок включаемого буфера. |
Возвращается нулевое значение.
15.8Запуск загрузки буферов удаленных элементов заданной группы
long loadig_ (IndirectAccessGroupRef *IndirectAccessGroupRefPtr);
*IndirectAccessGroupRefPtr ссылка на группу буферов.
Возвращается нулевое значение.
15.9Ожидание завершения загрузки буферов удаленных элементов заданной группы
long waitig_ (IndirectAccessGroupRef *IndirectAccessGroupRefPtr);
*IndirectAccessGroupRefPtr ссылка на группу буферов.
Возвращается нулевое значение.
15.10Уничтожение группы буферов удаленных элементов нерегулярного доступа
long delig_ (IndirectAccessGroupRef *IndirectAccessGroupRefPtr);
*IndirectAccessGroupRefPtr ссылка на уничтожаемую группу буферов.
Группа буферов удалённых элементов может быть уничтожена функцией delig_ только в том случае, если она была создана в текущей подзадаче и в текущем программном блоке (или его подблоке) (см. п. 8 и п. 10).
Группа буферов может быть уничтожена также с помощью функции delobj_ (см.п.17.5).
Возвращается нулевое значение.
16ВВОД/ВЫВОД
16.1Аналоги библиотеки языка C
Перечисленные ниже функции предназначены для ввода/вывода переменных, каждая из которых в момент вывода имеет одно и то же значение во всех процессорах решающего поля или принимает его после ввода. Их (функций) реализация основана на выполнении соответствующей функции библиотеки языка C только одним процессором, называемым процессором ввода/вывода, с последующей рассылкой результатов выполнения, если таковые имеются, всем остальным процессорам решающего поля. Например, применение функции dvm_printf приведет к однократному выводу, осуществленному процессором ввода/вывода, а применение функции printf – к многократному, произведенному каждым процессором решающего поля. Определить, является ли текущий процессор процессором ввода/вывода, при необходимости можно с помощью функции tstio_, описанной в п.17.6.
Функции ввода/вывода стандартной библиотеки языка C (ANSI), отсутствующие в нижеприведенном списке функций-аналогов (т.е. не имеющие нежелательных эффектов многократного выполнения), могут использоваться программой пользователя без всяких ограничений.
16.1.1Функции ввода/вывода высокого уровня
ANSI:
| void | dvm_clearerr | (DVMFILE *StreamPtr); |
| int | dvm_fclose | (DVMFILE *StreamPtr); |
| int | dvm_feof | (DVMFILE *StreamPtr); |
| int | dvm_ferror | (DVMFILE *StreamPtr); |
| int | dvm_fflush | (DVMFILE *StreamPtr); |
| int | dvm_fgetc | (DVMFILE *StreamPtr); |
| int | dvm_fgetpos | (DVMFILE *StreamPtr, fpos_t *PosPtr); |
| char | *dvm_fgets | (char *StringPtr, int n, DVMFILE *StreamPtr); |
| DVMFILE | *dvm_fopen | (const char *FileNamePtr, const char *TypePtr); |
| int | dvm_fprintf | (DVMFILE *StreamPtr, const char *FormatPtr [,Argument,...]); |
| void | dvm_void_fprintf | (DVMFILE *StreamPtr, const char *FormatPtr [,Argument,...]); |
| int | dvm_fputc | (int c,DVMFILE *StreamPtr); |
| int | dvm_fputs | (const char *StringPtr, DVMFILE *StreamPtr); |
| int | dvm_fread | (void *BufferPtr, size_t Size, size_t Count, DVMFILE *StreamPtr); |
| DVMFILE | *dvm_freopen | (const char *FileNamePtr, const char *TypePtr, DVMFILE *StreamPtr); |
| int | dvm_fscanf | (DVMFILE *StreamPtr, const char *FormatPtr [,ArgumentPtr,...]); |
| int | dvm_fseek | (DVMFILE *StreamPtr, long Offset, int Origin); |
| int | dvm_fsetpos | (DVMFILE *StreamPtr, const fpos_t *PosPtr); |
| long | dvm_ftell | (DVMFILE *StreamPtr); |
| int | dvm_fwrite | (const void *BufferPtr, size_t Size, size_t Count, DVMFILE *StreamPtr); |
| int | dvm_getc | (DVM_FILE *StreamPtr); |
| int | dvm_getchar | (void); |
| char | *dvm_gets | (char *BufferPtr); |
| int | dvm_printf | (const char *FormatPtr, ... ); |
| void | dvm_void_printf | (const char *FormatPtr, ... ); |
| int | dvm_putc | (int c, DVMFILE *StreamPtr); |
| int | dvm_putchar | (int c); |
| int | dvm_puts | (char const *StringPtr); |
| void | dvm_rewind | (DVMFILE *StreamPtr); |
| int | dvm_scanf | (const char *FormatPtr, [,ArgumentPtr,...]); |
| void | dvm_setbuf | (DVMFILE *StreamPtr, char *BufferPtr); |
| int | dvm_setvbuf | (DVMFILE *StreamPtr, char *BufferPtr, |
| DVMFILE | *dvm_tmpfile | (void); |
| int | dvm_ungetc | (int c,DVMFILE *StreamPtr); |
| int | dvm_vfprintf | (DVMFILE *StreamPtr, const char *FormatPtr, |
| void | dvm_void_vfprintf | (DVMFILE *StreamPtr, const char *FormatPtr, |
| int | dvm_vprintf | (const char *FormatPtr, va_list ArgList); |
| void | dvm_void_vprintf | (const char *FormatPtr, va_list ArgList); |
BORLAND-C & MICROSOFT-C:
| int | dvm_fgetchar | (void); |
| int | dvm_fputchar | (int c); |
BORLAND-C:
| int | dvm_vfscanf | (DVMFILE *StreamPtr, const char FormatPtr, |
| int | dvm_vscanf | (const char *FormatPtr, va_list ArgList); |
В вышеперечисленных функциях для задания стандартных потоков ввода/вывода могут быть использованы следующие указатели:
| DVMFILE *DVMSTDIN | | стандартный ввод; |
| DVMFILE *DVMSTDOUT | | стандартный вывод; |
| DVMFILE *DVMSTDERR | | стандартный вывод сообщений об ошибках; |
| DVMFILE *DVMSTDAUX | | стандартный последовательный порт; |
| DVMFILE *DVMSTDPRN | | стандартное устройство печати. |
Замечание 1. Функции dvm_void_printf, dvm_void_fprintf, dvm_void_vprintf и dvm_void_vfprintf отличаются (в своей реализации) от функций dvm_printf, dvm_fprintf, dvm_vprintf и dvm_vfprintf тем, что процессор ввода/вывода не рассылает всем остальным процессорам значения, возвращаемые ему функциями printf, fprintf, vprintf и vfprintf, т.е. более быстрым выполнением.














