Компилятор
Fortran DVM |
Документация |
- дата последнего обновления 17.11.09 -
Оглавление
5 Компиляция программы в режиме отладки
Данное руководство содержит инструкции по использованию компилятора Fortran DVM(FDVM) и является частью общего руководства пользователя DVM‑системы.
В руководстве приняты следующие условные обозначения для описания синтаксических конструкций.
::= по определению
| альтернатива
[x] необязательный элемент
y-list список элементов y [ , y ] ...
Язык Fortran DVM (FDVM) является расширением языка Фортран 95 для параллельного программирования в модели DVM. Расширение оформлено в виде специальных комментариев (директив), которые аннотируют последовательную программу на языке Фортран 95.
Компилятор транслирует исходную программу на языке FDVM в следующие выходные программы.
Параллельная программа на языке Фортран 95 с вызовами функций системы поддержки параллельного выполнения (Lib-DVM). Эта программа может выполняться в псевдопараллельном режиме на одном процессоре (рабочей станции) и в параллельном режиме на многопроцессорной ЭВМ.
Последовательная программа на языке Фортран 95 с вызовами функций сбора информации для отладки и оценки производительности. Программа выполняется на одном процессоре в последовательном режиме.
Вызов компилятора осуществляется следующей командной строкой:
dvm fdv [ <опции> ] <имя-файла>
где:
<опции> |
- |
указания о режимах компиляции. Если какое-либо указание отсутствует, то для него действует значение по умолчанию. Если две опции противоречат друг другу, то преимущество получает последняя из указанных в командной строке опций; |
<имя-файла> |
- |
имя файла (без расширения), который содержит текст исходной программы на языке FDVM. Файл должен иметь расширение .fdv. Поиск входного файла производится только в текущей директории. |
Ниже перечислены опции компилятора, жирным шрифтом выделены ключевые символы, а курсивом – параметры опций.
-o file |
Поместить выходную программу в файл file; |
-s |
Генерировать последовательную выходную программу; |
-p |
Генерировать параллельную выходную программу; |
-v |
Выдать сообщения о вызовах фаз компилятора, а также номер версии компилятора; |
-w |
Выдать все предупреждающие сообщения; |
-Idir |
Добавить директорию dir в список директорий, где осуществляется поиск include файлов. |
-ffo |
Использовать свободную форму записи для выходной фортран-программы. |
-f90 |
Используется свободная форма записи фортран-программы во входном файле. |
-r8 |
При генерации выходного кода, считать размер вещественного по умолчанию равным 8 байтам. |
-i8 |
При генерации выходного кода, считать размер целого по умолчанию равным 8 байтам. |
-bindk |
Задает соответствие типов данных в компиляторах с языков Фортран и Си; |
-ubufn |
Увеличить размер буфера для генератора выходного кода до n Мбайт. Рекомендуется использовать для больших по объему программ. |
-uf |
Устанавливается режим, при котором генератор выходного кода вызывается поочередно для каждой программной единицы. Рекомендуется использовать для больших по объему программ. |
-bufiosize |
Установить размер буфера, используемого при выводе распределенного массива, равным size; |
-dleveld[:fr-list] |
Генерировать дополнительный код для отладки программы; |
-elevele[:fr-list] |
Генерировать дополнительный код для анализа производительности программы. |
-dbifl |
Задает уровень оптимизации кода для отладки программы; l равно 1 или 2; отладка производится только в «крайних» витках циклов. |
Выходной файл. Имя выходного файла, в котором компилятор размещает сгенерированную программу, указывается с помощью опции
-o file
где file представляет собой имя файла. Если опция не указана, то по умолчанию, выходной файл получает имя <имя-файла>.f. Выходной файл записывается в текущую директорию.
Тип генерируемой программы. Тип генерируемой программы задается следующими опциями:
-s | - | последовательная программа |
–p |
- |
параллельная программа |
По умолчанию генерируется параллельная программа.
Форма записи фортран-программы. Если во входном файле используется свободная форма записи фортран-программы, требуется задание опции -f90. Для задания свободной формы записи выходной фортран-программы следует указать опцию –ffo, по умолчанию генерируется фортран-программа в фиксированной форме записи.
Директории для include-файлов. Если в исходной программе имеются операторы INCLUDE и не все include-файлы размещены в текущей директории, то необходимо указать опцию
-Idir
где dir - это имя директории. Поиск include-файла начинается с директорий, указанных в командной строке в том порядке, как они там перечислены. Затем поиск производится в текущей директории.
Дополнительная информация. Для идентификации версии компилятора и выполнения фаз компиляции необходимо указать опцию
-v
а для получения всех предупреждающих сообщений задать опцию
-w
Соответствие типов данных. Соответствие типов данных в компиляторах с языков Си и Фортран для ЭВМ, на которой будет выполняться сгенерированная программа, указывается с помощью опции
-bindk
где k - это целое число, которое указывает номер таблицы соответствия.
|
k = 0: |
|
|||
|
Фортран |
Си |
Размер (в байтах) |
||
|
integer |
long |
4 |
||
|
real |
float |
4 |
||
|
double precision |
double |
8 |
||
|
character |
char |
1 |
||
|
logical |
long |
4 |
||
|
k = 1: |
|
|||
|
Фортран |
Си |
Размер (в байтах) |
||
|
integer |
int |
4 |
||
|
real |
float |
4 |
||
|
double precision |
double |
8 |
||
|
character |
char |
1 |
||
|
logical |
int |
4 |
||
|
integer*8 |
long |
8 |
||
Соответствие типов определяется стандартными компиляторами с языков Си и Фортран для объектной ЭВМ. По умолчанию, считается k = 0.
Для программ на языке FDVM предусмотрены два способа отладки:
функциональная отладка, целью которой является достижение правильности функционального выполнения программы;
отладка эффективности, целью которой является достижение требуемого уровня эффективности параллельного выполнения программы.
Для каждого способа определено несколько уровней отладки.
Уровни функциональной отладки. Уровень функциональной отладки – это целое число от 0 до 4, оно определяет события в программе, о которых сообщается отладчику:
0 - нет событий,
1 - модификация распределенных массивов,
2 - модификация и использование распределенных массивов,
3 - модификация всех переменных,
4 - модификация и использование всех переменных.
Уровни отладки эффективности. Уровень отладки эффективности - это целое число от 0 до 4, которое определяет, какие участки программы рассматриваются в качестве интервалов выполнения программы. Для каждого такого интервала можно получить характеристики эффективности.
0 |
- |
нет интервалов, |
1 |
- |
параллельные циклы и охватывающие их последовательные циклы, |
2 |
- |
последовательности операторов, указанные в программе посредством директив INTERVAL и END INTERVAL, |
3 |
- |
объединение подмножеств 1 и 2, |
4 |
- |
все циклы и интервалы, заданные с помощью директив INTERVAL и END INTERVAL. |
Последовательность операторов можно объявить интервалом с помощью директив:
CDVM$ INTERVAL [<целочисленное-выражение>]
<последовательность-операторов>
CDVM$ END INTERVAL
Каждый интервал операторов должен удовлетворять условиям блока операторов:
выполнение интервала всегда начинается с первого оператора,
выполнение интервала всегда заканчивается последним оператором.
Другими словами запрещены передачи управления извне внутрь интервала, и изнутри интервала - на оператор вне интервала.
Фрагменты программы. Программу можно разделить на отдельные отлаживаемые фрагменты. Каждый фрагмент определяется директивами
CDVM$ DEBUG <номер-фрагмента> [( <параметр> )]
<фрагмент-операторов>
CDVM$ END DEBUG <номер-фрагмента>
<номер-фрагмента> |
::= |
<целое-положительное-число> |
<параметр> |
::= |
D = levele |
|
| |
E = leveld |
|
| |
D = leveld , E = levele |
где:
параметр D указывает максимально возможный уровень функциональной отладки,
параметр E указывает максимально возможный уровень отладки эффективности,
leveld – целое число от 0 до 4,
levele – целое число от 0 до 4.
Фрагмент операторов должен удовлетворять условиям блока операторов.
Допускается вложенность фрагментов. Пусть f1 обозначает множество операторов охватывающего фрагмента, l1 – заданный в директиве DEBUG уровень отладки для данного фрагмента, а f2 и l2 - множество операторов и уровень отладки вложенного фрагмента. Тогда для множества операторов f1 – f2 максимально допустимым является уровень l1, а для множества f2 максимально допустимым является уровень l2.
Вся программа считается по умолчанию фрагментом с номером 0 и максимально допустимыми уровнями отладки D = 4 , E = 4.
Пусть задана следующая структура фрагментов программной единицы:
SUBROUTINE SUB(…)
S1
CDVM$ DEBUG 1 (D = 4 , E = 1)
S2
CDVM$ DEBUG 2 (D = 1 , E = 3)
S3
CDVM$ END DEBUG 2
S4
CDVM$ END DEBUG 1
S5
END
Эта структура определяет следующие максимально допустимые уровни отладки:
|
Множество операторов |
Уровень отладки |
|
{ S1, S5 } |
D = 4 , E = 4 |
|
{ S2, S4 } |
D = 3 , E = 1 |
|
{ S3 } |
D = 1 , E = 3 |
Уровни отладки в опциях компилятора.
Уровень отладки для всей программы определяется опциями
-dleveld - для функциональной отладки,
-elevele - для отладки эффективности.
По умолчанию действуют опции –d0 и –e0.
Уровень отладки для отдельных фрагментов определяется опциями:
-dleveld [:fr-list]
-elevele [:fr-list]
где
fr ::= Lfr [ - Hfr ]
Lfr ::= <номер-фрагмента>
Hfr ::= <номер-фрагмента>
Требуется, чтобы Lfr£Hfr.
fr-list – это список, где каждый элемент списка представляет собой либо номер отдельного фрагмента, либо непрерывный диапазон номеров фрагментов. Пусть в директиве DEBUG определен для некоторого фрагмента уровень отладки равный m. Если для этого фрагмента в опциях компилятора задан уровень l, то фрагмент будет включен в отладку с уровнем min( m , l ).
Пусть при компиляции программы указаны следующие опции отладки
-d2:1-2 -e2
Для подпрограммы SUB будут установлены следующие уровни отладки:
|
Множество операторов |
Уровень функциональной отладки |
Уровень отладки эффективности |
|
{ S1, S5 } |
0 |
2 |
|
{ S2, S4 } |
2 |
1 |
|
{ S3 } |
1 |
2 |
Подробнее об отладке программы см. «Отладка DVM–программ. Руководство по использованию» и «Отладка эффективности DVM-программ. Руководство по использованию».
Трассировка выполнения функций Lib-DVM. «Включить» и «отключить» сбор трассы обращений к Lib-DVM можно с помощью директив отладки
CDVM$ TRACE ON
CDVM$ TRACE OFF
Оптимизация отладки. Опция -dbifl задает уровень оптимизации кода для отладки программы; l равно 1 или 2. Отладка будет производиться только в «крайних» витках циклов, кроме того, при l=2 с целью ускорения отладки генерируются два тела для параллельных циклов. Рекомендуется использовать опцию при отладке больших программ.
Если компилятор обнаруживает в исходной программе ошибку, то он выдает сообщение следующего вида
<тип-сообщения> <номер-сообщения> on line <номер-строки> of <имя-файла> : <текст‑сообщения>
где:
<тип-сообщения> |
- Warning |
предупреждающее сообщение, не препятствующее генерации выходной программы. |
|
- Error |
ошибка, при которой невозможна генерация программы. |
<номер-строки> |
- целое число, которое указывает номер строки в файле <имя-файла>, при анализе которой обнаружена ошибка. |
|
<текст-сообщения> |
-текст сообщения на английском языке. |
Ниже приведены номера ошибок, тексты сообщений и пояснения к ним.
000 |
Compiler
bug |
001 |
Unknown option
option
is ignored |
002 |
Invalid option
argument arg
is
ignored |
003 |
No source file specified |
004 |
Illegal
command line format |
005 |
Can't
open file filename |
006 |
Can't
open file filename
for write |
007 |
Null
program |
008 |
Missing final end statement or
unclosed construct |
009 |
Illegal
continuation card ignored |
010 |
Unclassifiable statement |
011 |
Non digit
in statement number field |
012 |
Unbalanced quotes;
closing quote supplied |
013 |
Unbalanced parentheses, statement skipped |
014 |
Syntax
error |
015 |
Comment too long.
Truncated to 160 characters |
016 |
Inconsistent declaration of identifier identifier |
017 |
Inconsistent constant declaration identifier |
018 |
Inconsistent array
declaration of identifier identifier |
019 |
Inconsistent function identifier |
020 |
Inconsistent procedure identifier |
021 |
Inconsistent subroutine identifier |
022 |
Inconsistent program
declaration identifier |
023 |
Inconsistent common
declaration identifier |
024 |
Function has the
same name as a common block identifier |
025 |
Common block has the
same name as a function identifier |
026 |
Inconsistent operands to boolean operation |
027 |
Inconsistent operands to arithmetic operation |
028 |
Non-logical
expression in IF statement |
029 |
Statement order
error: declaration after DATA or function statement |
030 |
Declaration among executables |
031 |
ELSEIF
out of place |
032 |
ELSE out
of place |
033 |
Misplaced
PROGRAM statement |
034 |
Misplaced
SUBROUTINE statement |
035 |
Misplaced
ENTRY statement |
036 |
Statement cannot be
reached |
037 |
IMPLICIT
item must be single letter |
038 |
Label out of range |
039 |
Label
already that of a format |
040 |
Label
label already
defined |
041 |
Non
character entity identifier
has length specification |
042 |
No
dimensions in DIMENSION statement |
043 |
Too many
dimensions |
044 |
can't
subscript identifier |
045 |
can't
take substring of identifier |
046 |
No
backward DO loops |
047 |
Symbolic
constant not allowed as DO variable |
048 |
Must go
to assigned variable |
049 |
Missing
DVM directive prefix |
050 |
Explicit shape
specification is required |
051 |
Distribution format list is omitted Нет списка форматов распределения в директиве DISTRIBUTE. |
052 |
Unexpected END statement read Нарушена структура фортран-программы. |
053 |
Illegal use of
PROCESSORS name identifier |
054 |
A distributee may
not have the ALIGN attribute: identifier |
055 |
Distribution format
BLOCK(n) is not permitted in FDVM |
056 |
Illegal
shadow width specification |
057 |
An alignee may not
have the DISTRIBUTE attribute: identifier |
058 |
The
alignee identifier
isn't an array |
059 |
'identifier'
hasn't the DYNAMIC
attribute |
060 |
'identifier'
hasn't the ALIGN
attribute |
061 |
The
align-target identifier
isn't declared as array |
062 |
The align-dummy
identifier isn't a scalar
integer variable |
063 |
Illegal combination
of attributes |
064 |
'identifier'
has the DISTRIBUTE
and ALIGN attribute |
065 |
No shape
specification |
066 |
'identifier'
isn't array |
067 |
'identifier'
is not processor array |
068 |
'identifier'
is not remote group
name |
069 |
'identifier'
is not declared as
reduction group |
070 |
Illegal reduction
operation name |
071 |
Illegal use of task
array name identifier |
072 |
'identifier'
isn't
distributed array |
073 |
Multiple declaration
of identifier 'identifier'
|
074 |
'identifier'
isn't
declared as group |
075 |
No
dimensions in TASK directive |
076 |
Illegal
rank of 'identifier' |
077 |
'identifier'
is not task array |
078 |
Illegal interval number |
079 |
Template
'identifier'
is in COMMON |
080 |
Template may not be
a dummy argument: identifier |
081 |
ENTRY among
specification statements |
082 |
Duplicate
aligning of the array 'identifier' |
083 |
POINTER
'identifier'
is not integer
variable |
084 |
POINTER may not have
SAVE attribute: identifier |
085 |
POINTER
'identifier'
is not distributed
object |
086 |
Object
'identifier'
has neither TEMPLATE
nor PROCESSORS attribute |
087 |
Illegal shape
specification in DIMENSION attribute |
088 |
Length of
shadow-edge-list is not equal to the rank of array
'identifier' |
089 |
attribute
attribute
appears more than once in the combined-directive |
090 |
The number of BLOCK/GENBLOCK
elements of dist-format-list is greater than the rank of PROCESSORS
'identifier' |
091 |
Missing HEAP
declaration |
092 |
Alignment tree root
'identifier'
is not distributed |
093 |
PAUSE statement is
not permitted in FDVM |
094 |
Illegal statement in
the range of parallel loop |
095 |
Only a value of
ALLOCATE function or other POINTER may be assigned to a POINTER |
096 |
Nested PARALLEL
directives are not permitted |
097 |
PARALLEL directive
must be followed by DO statement |
098 |
The directive is
inside the range of PARALLEL loop |
099 |
Misplaced
REMOTE_ACCESS directive |
100 |
Nested TASK_REGION
are not permitted |
101 |
Statement is outside
of on-block |
102 |
No matching
TASK_REGION |
103 |
Misplaced directive |
104 |
Nested ON-blocks are
not permitted |
105 |
ON directive is
outside of the task region |
106 |
No matching ON
directive |
107 |
Parallel-task-loop
directive is outside of the task region |
108 |
Missing END
TASK_REGION directive |
109 |
Missing END ON
directive |
110 |
Rank of array
identifier
is not equal to the
length of the dist‑format-list |
111 |
Saved object may not
have the DYNAMIC attribute: identifier |
112 |
Object in COMMON
may not have the DYNAMIC attribute:
identifier |
113 |
'identifier'
hasn't the DYNAMIC
attribute |
114 |
'identifier'
does not appear in
DISTRIBUTE/INHERIT directive |
116 |
Template
'identifier'
appears as an
alignee |
117 |
Dummy argument
'identifier'
is aligned with
local array |
118 |
Aligned array
'identifier'
is in COMMON but
align-target is not |
119 |
Aligned array
'identifier'
has SAVE attribute
but align-target has not |
120 |
'identifier'
does not appear in
ALIGN and INHERIT directive |
121 |
'identifier'
is a duplicate dummy
argument |
122 |
Descriptor array
error |
123 |
Rank of pointer
identifier
is not equal to the
length of the dist‑format-list |
124 |
Array
'identifier' may not be
allocated |
125 |
Array
'identifier' may not be
aligned |
126 |
Illegal
aligning of 'identifier' |
127 |
Distributed object
'identifier'
is not array |
128 |
Rank of aligned
array identifier
isn't equal to the
length of align-source-list |
129 |
GEN_BLOCK and
WGT_BLOCK in format-list |
130 |
Wrong
align-subscript expression |
132 |
Rank of align-target
'identifier'
isn't
equal to the length of align-subscript-list |
133 |
More one occurenсe
of do-variable
'identifier'
in iteration-align-subscript-list |
134 |
More one occurence
of align-dummy
'identifier'
in align subscript
list |
135 |
More one
occurence of a do-variable in do-variable-use expression |
136 |
More one
occurence of an align-dummy in align-subscript expression |
137 |
Illegal
group name use: 'identifier' |
138 |
Illegal
POINTER reference: 'identifier' |
139 |
Owner-computes rule |
140 |
Wrong
number of subscripts specified for identifier |
141 |
Illegal
type of 'identifier' |
142 |
Low shadow width of
'identifier'
is greater than the corresponding one specified in SHADOW directive |
143 |
High shadow width of
'identifier'
is greater than the corresponding one specified in SHADOW directive |
144 |
Low shadow width of
'identifier'
is greater than
1 |
145 |
High shadow width of
'identifier'
is greater than 1 |
146 |
NEW_VALUE directive
must be followed by REDISTRIBUTE or REALIGN directive |
147 |
Illegal operand list
of MAXLOC/MINLOC |
148 |
'identifier'
is distributed array |
149 |
Wrong
operand of MAXLOC/MINLOC:
identifier |
150 |
Ilegal clause |
151 |
Wrong
reduction variable 'identifier' |
152 |
Wrong type of
reduction variable 'identifier' |
153 |
Double NEW clause |
154 |
Double REDUCTION
clause |
155 |
Double SHADOW_RENEW
clause |
156 |
Double REMOTE_ACCESS
clause |
157 |
Double ACROSS clause |
158 |
Length of
do-variable list in PARALLEL directive is greater than the number of
nested DO statements |
159 |
Illegal
do-variable-list in PARALLEL directive |
160 |
Wrong
iteration-align-subscript in PARALLEL |
161 |
Rank of array
'identifier'
isn't
equal to the length of iteration-align-subscript-list |
162 |
Assumed-size array:
identifier |
163 |
Reverse is not supported |
164 |
Wrong
regular subscript expression |
165 |
Length of
remote-subscript-list is not equal to the rank of remote variable |
166 |
HEAP
limit is exceeded |
167 |
Illegal
template reference: 'identifier' |
168 |
Illegal
variable in new-clause: identifier |
169 |
ENTRY of program
unit distributed arrays are in |
170 |
Name
'identifier'
too long, truncated to 29 |
171 |
No subscripts:
identifier |
172 |
POINTER
'identifier' in
left part of assign statement has DISTRIBUTE or ALIGN attribute |
173 |
Pointers are of different rank |
174 |
Pointers are of different type |
175 |
Wrong number of subscripts
specified for 'identifier' |
176 |
'identifier'
hasn't PROCESSORS/TASK attribute |
177 |
Associated actual
arguments must be aligned |
178 |
Illegal type of
do-variable 'identifier' |
179 |
Wrong
dependence length of distributed array 'identifier' |
180 |
Wrong
dependence length list of distributed array 'identifier' |
181 |
Illegal fragment number |
182 |
Unmatched directive |
183 |
Buffer
limit is exceeded |
184 |
Illegal I/O
statement in the range of parallel loop |
185 |
Illegal
elements in control list |
186 |
END= and ERR=
specifiers are illegal in FDVM |
187 |
IOSTAT= specifier is
illegal in I/O of distributed array |
189 |
Invalid
format specification |
190 |
Illegal I/O list |
191 |
I/O of distributed
array controlled by format specification or NAMELIST is not supported in
FDVM |
192 |
Illegal I/O
list item: identifier |
193 |
Array
shape declaration error:
identifier |
194 |
Can't calculate
array length:
identifier |
195 |
Can’t
find the corresponding MAP directive |
196 |
Incorrect call of
ALLOCATE function |
197 |
Can’t
use pointers in HPF1 |
222 |
Can’t
find a descriptor for POINTER |
250 |
Illegal nesting
INDEPENDENT directive |
251 |
More one occurrеnce
of do-variable
'identifier'
in subscript
list |
252 |
More one occurrеnce
of a do-variable
in subscript expression |
254 |
No target for
independent loop |
255 |
Reduction statement
inside the range of INDEPENDENT loop, 'identifier'
is reduction variable |
262 |
Wrong argument list
of ALLOCATE function call |
263 |
Shape specification
is not permitted |
264 |
Illegal array in
SHADOW_COMPUTE
clause:
identifier |
288 |
Non-logical
expression in FORALL statement |
292 |
Rank of array 'identifier'
is not equal the length of Число индексов массива в операторе ALLOCATE не равно рангу массива по описанию. |
293 |
No allocaton
specifications for
identifier |
294 |
Can't
calulate structure size:
identifier |
295 |
Assumed-shape or
deffered-shape array: identifier |
296 |
Double CONSISTENT
clause |
297 |
Both arrays are not
distributed |
298 |
Double STAGE clause |
299 |
PARALLEL loop is not
one-dimensional
loop |
300 |
Invalid source file
identifier |
301 |
Double
INDIRECT_ACCESS clause |
302 |
Length of
indirect-subscript-list is not equal to the rank of
|
303 |
Illegal debug
parameter |
304 |
Internal procedures
cannot contain procedures |
308 |
Unknown module
identifier |
309 |
Unknown identifier
identifier |
311 |
Can't
take component of identifier |
312 |
Illegal distributee:
identifier |
318 |
Inconsistent struct
declaration of identifier %s |
319 |
Undefined type
identifier |
330 |
No blank after label
|
331 |
Inconsistent module
declaration identifier |
334 |
Output file has the
same name as source file |
335 |
Illegal distributed
array reference:
identifier |
336 |
DISTRIBUTE or ALIGN attribute of component name dictates POINTER attribute Если компонент производного типа не является указателем на массив, он не может иметь ни атрибут DISTRIBUTE, ни атрибут ALIGN. |
337 |
Only a distribute-directive of kind DISTRIBUTE:: is permitted in a derived type definition Для описания компонентов производного типа можно использовать только директиву DISTRIBUTE вида: DISTRIBUTE:: список-идентификаторов |
338 |
Only a ALIGN-directive of kind ALIGN:: is permitted in a derived type definition Для описания компонентов производного типа можно использовать только директиву ALIGN вида: ALIGN:: список-идентификаторов |