опция оптимизации

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Сообщение Slavikk » 27.08.2007 10:06:37

Глупый конечно вопрос. Но как я понял опции оптимизации действуют только для данного юнита.

А как их выставить глобально для всех юнитов в проекте? Только не ручками?
Аватара пользователя
Slavikk
постоялец
 
Сообщения: 208
Зарегистрирован: 15.01.2007 22:34:52
Откуда: Из лесов...

Сообщение Рождённый_в_СССР » 27.08.2007 12:50:30

Slavikk
при компиляции проекта (основного файла) все модули, которые доступны для компиляции будут компилироваться с его ключами

Физик
это ещё не решение )

я только нашёл почему FPC отстаёт... разобраться в коде, который выдаёт фортран у меня не получилось - потому что там просто каша... похожая на дизассимблированный lzw-архив какого нить jpg рисунка )
вот например:
.comm a.0,5120000,32
каким образом оно выделяет под матрицу 2000*2000*8 байт стока мало памяти и всё равботает я понять никак не могу...

но оставим извращения...
вы главное отталкивайтесь от этого варанта!
для идельного кода FPC не хватает 2 вещи, обе в моей программе лежат в строчках
1) самое значимое - for l := 1 to n do rol[l]:=b[L,i];
2) менее актуальное - for l := 1 to n do col[l]:=a[j,L];

их нада передлать... по поводу того, какие проблемы у FPC (отталкиваемся от моего кода):

1) при обращении к b[L,i] и a[j,L] FPC упорно генерирует код, который путём умножения L*16000 и j*16000 находит смещение... это не корректно!
решения:
a) заставить его считать это через shl - либо как-то через компиляцию, либо через ассемблерную вставку...
б) составить вектор заранее, в котором в зависиости от s[k] будет записанны все значения k*16000 и обращаться @b+s[L]+j, @a+s[j]+L

2) менее существенная проблема:
во время исполнения в цикле нужно читать содержимое j (для b[L,j]) и i для (a[j,L]) перед началом самого цикла в регистр, а потом его использовать весь цикл по L...
помойму эта проблема решается только на уровне встроенного ассемблера... но не знаю на сколько она даст прирост в скоросте (вроде не должна сильно много)

вот так судя по генерируемому коду я нашёл проблемы FPC на этом примере... к сажалению из за бесструктурного кода я не могу положить под скальпель g77, а то хотелось бы и там покопаться...
Аватара пользователя
Рождённый_в_СССР
новенький
 
Сообщения: 65
Зарегистрирован: 08.08.2007 01:03:26
Откуда: Саратов

Сообщение Slavikk » 27.08.2007 14:32:37

Спасибо
Аватара пользователя
Slavikk
постоялец
 
Сообщения: 208
Зарегистрирован: 15.01.2007 22:34:52
Откуда: Из лесов...

Сообщение shade » 27.08.2007 17:47:33

Рождённый_в_СССР писал(а):попробуйте всё таки вывести на экран или сохранить в файл все что он там насчитал в матрице c , соответственно не внося изменений в хронологию снимания времени ) т.е. снимайте его тока на этом цикле - тогда это самое простое )

Насколько я понял, все вычисляется правильно и полностью в обоих примерах.

Рождённый_в_СССР писал(а):и видим что в паскалевской программе (приведённой, господином Физиком) вообще напутана последовательность i,j,k,l... т.е. последовательность в которой они появляются (в циклах) и то, как они указанны... посмотрите сами так сказать...
соответствие по циклам (порядку появления) тако

Насколько я понял из анализа ассемблерного листинга - в фортране двуменый массив храниться столбцами, а не строками - отсюда и путаница с индексами - но там все верно (я уверен)

На исходных примерах мне понятно почему фортран опережает fpc: потому что фортран производит более короткий код за счет хранения большего числа переменных в регистрах (fpc тут сильно уступает несмотря на -Ooregvar aka -Or), а конкретно цикл по K выглядит так
Код: Выделить всё
.L30:
   fldl   (%eax)
   fmull   (%edx)
   addl   $8, %eax
   addl   $8, %edx
   decl   %ecx
   faddp   %st, %st(1)
   jns   .L31

Соответвующий код на FPC в два, а то и в 3 раза длинее, т.к. на каждой итерации вычислять адрес толи c[i,j] толи a[i,k] или b[k,j] (честно говоря сильно не вникал) - a фотран, вообще c[i,j] в этом цикле харнит в регистре st(0), а указатели на row[k] и b[k,j] в регистрахъ eax, edx - от сюда прирост в скорости.

Если убрать кеширование строки (это такая хитрая оптимизация - аналог транспонирования - цель таже обрадовать кеш последовательным чтением)
Код: Выделить всё
DO L = 1,N
ROW(L) = A(I,L)
END DO

то фортран проигрывает, видимо на пробуксовки кеша, несмотря на более эффективную адресную арифметику -- врочем я не анализировал ассемблерный листинг второго варианта...

Так что в FPC нужно оптимизировать адресную арифметику...
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение Физик » 27.08.2007 18:58:35

shade писал(а):в фортране двуменый массив храниться столбцами, а не строками


Совершенно верно

shade писал(а):Так что в FPC нужно оптимизировать адресную арифметику...


вот и задача для программистов появилась
Физик
новенький
 
Сообщения: 28
Зарегистрирован: 26.06.2006 12:42:33

Сообщение shade » 27.08.2007 23:02:13

Раз уж на то пошло, то может кто-нибудь объяснит что делают конкретные оции оптимизации:

fpc -i кроме всего прочего выдает поддерживаемые методики оптимизции. Так у меня FPC 2.3.1 для i386 выдает следующий список
Код: Выделить всё
Supported Optimizations:
  REGVAR
  UNCERTAIN
  STACKFRAME
  PEEPHOLE
  ASMCSE
  LOOPUNROLL
  TAILREC

REGVAR - "заставляет" FPC хранить часто используемые переменные в регистрах
STACKFRAME - удаляет фрейм стека
LOOPUNROLL - я так понимаю развертка небольших циклов.
UNCERTAIN - это описаный выше -Ou

А что делают остальные опции? PEEPHOLE, ASMCSE, TAILREC ?
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение *vmr » 27.08.2007 23:54:38

PEEPHOLE - подстановка вместо медленной инструкции ее более быстрого аналога (например битовый здвиг вместо умножения деления на степень двойки) - все три прохода этой оптимизации закодированиы в модуле popt386.pas
ASMCSE - common subexpression elimination
TAILREC - tail recursion recognition(???) - opttail.pas
Аватара пользователя
*vmr
постоялец
 
Сообщения: 168
Зарегистрирован: 08.01.2007 01:46:07
Откуда: Киев

Сообщение trifon » 01.09.2007 14:55:27

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

компилировал с опцией -dDEBUG -dGDB -Op3 -CfSSE -pg
Код: Выделить всё
index % time    self  children    called     name
              279.30    0.00       1/1           _start [2]
[1]    100.0  279.30    0.00       1         main [1]
                0.00    0.00       2/2           P$PROGRAM_SECOND$$DOUBLE [3]
-----------------------------------------------
                                                 <spontaneous>
[2]    100.0    0.00  279.30                 _start [2]
              279.30    0.00       1/1           main [1]
-----------------------------------------------
                0.00    0.00       2/2           main [1]
[3]      0.0    0.00    0.00       2         P$PROGRAM_SECOND$$DOUBLE [3]


статья от ibm: "Ускорение кода при помощи GNU-профайлера"
trifon
постоялец
 
Сообщения: 135
Зарегистрирован: 24.12.2006 12:08:35

Сообщение Matich » 01.09.2007 23:02:13

А что даёт -Os?
Matich
новенький
 
Сообщения: 50
Зарегистрирован: 25.07.2007 21:42:57

Сообщение shade » 02.09.2007 11:38:10

fpc -h писал(а): -Os Optimize for size rather than speed
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение Matich » 02.09.2007 22:03:52

-Og - тоже самое что и -Os.
Просто компилер ругается когда я ему пишу -Og, требует -Os.
Matich
новенький
 
Сообщения: 50
Зарегистрирован: 25.07.2007 21:42:57

Пред.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru
cron