Научная литература
booksshare.net -> Добавить материал -> Математика -> Боглаев Ю.П. -> "Вычислительная математика и программирование " -> 41

Вычислительная математика и программирование - Боглаев Ю.П.

Боглаев Ю.П. Вычислительная математика и программирование — Высшая школа, 1990. — 546 c.
ISBN 5-06-00623-9
Скачать (прямая ссылка): vychmatiprog1990.djvu
Предыдущая << 1 .. 35 36 37 38 39 40 < 41 > 42 43 44 45 46 47 .. 168 >> Следующая

А= 1 В = 2 с=б+г Т>=\-Х
119
DO 1 1 = 1,100; DO 1 1 = 1,100
All)=X(I)+COS (X(l)); T=X(I)
B(I)=X(I)+SIN (X(l)); All)=T+COS (T)
1 CONTINUE; 1 B(I)=T+SIN(T)
в четыре раза сокращает время на вычисление адреса переменной Х(1).
Однако этот пример может привести и к отрицательному эффекту: если вычисления производятся на ЭВМ с векторным процессором (так проявляется оптимизация без учета архитектуры ЭВМ), то левый цикл, как правило, будет предпочтительнее правого.
В дальнейшем рекомендации по преобразованию программ относятся к ЭВМ традиционной архитектуры с последовательным выполнением команд.
3.4.7. Улучшение структуры циклов. 1) Объединение циклов сокращает время на управление операторами цикла и необходимый объем памяти. Приведем два примера объединения.
Первый пример объединенные циклы
DO 1 1=1,100; DO 1 1=1,100
1 A(I)= 1.; All) = 1.
DO 2 J = 1,100; B(I)=X(I)
2 B(J)=X(J); 1 CONTINUE
\
Второй пример
DO 1 1 = 1,100; DO 1 1=1,100
1 A(l)= 1.; -4 A$=1V,
DO 2 J = 1,150; 1 B(I)=X(I)
B(J)=X(J); DO 2 J= 101,150
2 CONTINUE; 2 B(J)=X(J)
2) Развертка цикла сокращает время на организацию цикла. Например, развертка левого цикла в правый сокращает вдвое число операций приращения управляющей переменной и контроля на завершение:
DO 1 1=1,100; DO 1 1=1,99,2
A(I)=1.; All) = 1.
1 CONTINUE; 1 A(I + l)=l.
Но при этом увеличивается необходимый объем памяти.
3) Вывод из цикла неизменяемых выражений производится, если эти выражения постоянны внутри цикла. Например, замена
DO 1 1=1,1000; S = R*T
A(I)=X(I)+R*T; DO 1 1 = 1,1000
1 CONTINUE; 1 A(I)=X(I)+S
сокращает время выполнения цикла на время, необходимое для выполнения 1000 умножений.
\
120
V,
4) Разбиение цикла противоположно объединению. Разбиение целесообразно делать, если внутри цикла есть условный оператор с проверяемым условием, которое не изменяется в цикле. Например,
Условный оператор 1Р выполняется 100 раз, хотя можно преобразовать программу так, что он будет выполняться только один раз
IF (A.GT.O.) GO ТО 1 GO ТО 3
1 DO 2 1 = 1,100
2 X(I) = Y(l)
GO TO 5
3 DO 4 1=1,100
4 X(I) = 0.
5 CONTINUE
Время выполнения этого фрагмента уменьшается за счет увеличения необходимой памяти.
5) Правильное вложение циклов может увеличить быстродействие программы за счет уменьшения числа операций инициирования цикла. В следующем примере
левый внутренний цикл инициируется 100 раз, а в правом—10 раз.
Наконец, следует придерживаться простого правила: короткие циклы применять нецелесообразно, так как затраты на их организацию сравнимы с выполнением операторов цикла.
3.4.8. Ускорение на передачах управления. Различные операторы передачи управления:
безусловный оператор СО ТО, логический оператор 1?, арифметический оператор Ш
— отличаются по своему быстродействию. Выше приведен список в порядке убывания быстродействия. Однако для некоторых ЭВМ последние два оператора меняются местами. Кроме того, для некоторых ЭВМ в условных операторах перехода сравнение с нулем выполняется значительно быстрее, чем с другим выражением. Это связано с использованием какой-либо быстрой команды. Поэтому оператор
DO 1 1=1,100
IF (A.GT.O.) X(I) = Y(I)
X(I)=0.
CONTINUE
DO 1 1=1,100; DO 1 J = 1,10; A(I,J) = 0.;
DO 1 1 = 1,10 DO 1 J= 1,100 1 A(J,I)=0.
121
IF (I.GT.J) X=l.
будет выполняться медленнее следующего оператора
IF (I —J.GT.O) X=l.
Ускорение на передаче управления можно получить, разбивая логическое выражение на составляющие, в том случае, когда результат логического выражения может быть уже известен, но оно продолжает вычисляться. Например, оператор
IF (A.GT.B.OR.C.LT.D) GO ТО 1
разложенный на два оператора
IF (А.6т.В) GO ТО 1 IF (C.LT.D) GO ТО 1
в том случ&е* когда А>В, не требует выполнения второго оператора.
3.4.9. Ускорение передачи аргументов в функции-подпрограммы и подпрограммы. Фортран содержит два основных способа обмена информацией между подпрограммами: через COMMON-блоки и через аргументы. Ниже приведены два указанных варианта:
COMMON /BLOCK/А,В,С,D; DATA А,В,С/0.,1.,2./
DATA А,В,С/0.,1.,2./; CALL S(A,B,C,X)
CALL S(X); Y = SIN(X)
Y = SIN (X);
В зависимости от трансляции эти два способа передачи могут сильно отличаться по затратам времени и требуемой памяти. Как правило,’ первый способ предпочтительнее второго, поэтому целесообразно минимизировать число элементов в списке аргументов, размещая часть аргументов в COMMON-блоки.
Причина преимущества передачи аргументов в первом варианте заключается в том, что в вызывающей программе сначала накапливаются требуемые аргументы для замены формальных параметров (так же как и COMMON-переменных), но затем необходимо выполнить дополнительную работу, чтобы построить таблицу адресов аргументов и указатель на эту таблицу. В вызываемой программе таблица восстанавливается для определения места аргументов.
3.4.10. Оптимизация ввода—вывода. Обратим внимание на следующие аспекты ввода—вывода, которые повышают эффективность этих операций.
1) Простота списков ввода—вывода. Каждый элемент списка требует обращения к программе ввода—вывода библиотеки фортрана, которая, в свою очередь, вызывает системные программы. Поэтому, например, вывод на печать с помощью операторов
Предыдущая << 1 .. 35 36 37 38 39 40 < 41 > 42 43 44 45 46 47 .. 168 >> Следующая

Реклама

c1c0fc952cf0704ad12d6af2ad3bf47e03017fed

Есть, чем поделиться? Отправьте
материал
нам
Авторские права © 2009 BooksShare.
Все права защищены.
Rambler's Top100

c1c0fc952cf0704ad12d6af2ad3bf47e03017fed