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

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

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

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

Сообщение Slavikk »

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

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

Сообщение Рождённый_в_СССР »

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, а то хотелось бы и там покопаться...
Аватара пользователя
Slavikk
постоялец
Сообщения: 208
Зарегистрирован: 15.01.2007 21:34:52
Откуда: Из лесов...
Контактная информация:

Сообщение Slavikk »

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

Сообщение shade »

Рождённый_в_СССР писал(а):попробуйте всё таки вывести на экран или сохранить в файл все что он там насчитал в матрице 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 нужно оптимизировать адресную арифметику...
Физик
новенький
Сообщения: 28
Зарегистрирован: 26.06.2006 12:42:33

Сообщение Физик »

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


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

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


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

Сообщение shade »

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

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 ?
Аватара пользователя
*vmr
постоялец
Сообщения: 168
Зарегистрирован: 08.01.2007 00:46:07
Откуда: Киев
Контактная информация:

Сообщение *vmr »

PEEPHOLE - подстановка вместо медленной инструкции ее более быстрого аналога (например битовый здвиг вместо умножения деления на степень двойки) - все три прохода этой оптимизации закодированиы в модуле popt386.pas
ASMCSE - common subexpression elimination
TAILREC - tail recursion recognition(???) - opttail.pas
trifon
постоялец
Сообщения: 135
Зарегистрирован: 24.12.2006 11:08:35

Сообщение trifon »

Все озабочены оптимизацией кода, и никаких сообщений на форуме содержащих 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-профайлера"
Matich
новенький
Сообщения: 50
Зарегистрирован: 25.07.2007 21:42:57

Сообщение Matich »

А что даёт -Os?
Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

Сообщение shade »

fpc -h писал(а): -Os Optimize for size rather than speed
Matich
новенький
Сообщения: 50
Зарегистрирован: 25.07.2007 21:42:57

Сообщение Matich »

-Og - тоже самое что и -Os.
Просто компилер ругается когда я ему пишу -Og, требует -Os.
Ответить