опция оптимизации
Модератор: Модераторы
- Рождённый_в_СССР
- новенький
- Сообщения: 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, а то хотелось бы и там покопаться...
при компиляции проекта (основного файла) все модули, которые доступны для компиляции будут компилироваться с его ключами
Физик
это ещё не решение )
я только нашёл почему 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, а то хотелось бы и там покопаться...
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
Рождённый_в_СССР писал(а):попробуйте всё таки вывести на экран или сохранить в файл все что он там насчитал в матрице 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 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
Раз уж на то пошло, то может кто-нибудь объяснит что делают конкретные оции оптимизации:
fpc -i кроме всего прочего выдает поддерживаемые методики оптимизции. Так у меня FPC 2.3.1 для i386 выдает следующий список
REGVAR - "заставляет" FPC хранить часто используемые переменные в регистрах
STACKFRAME - удаляет фрейм стека
LOOPUNROLL - я так понимаю развертка небольших циклов.
UNCERTAIN - это описаный выше -Ou
А что делают остальные опции? PEEPHOLE, ASMCSE, TAILREC ?
fpc -i кроме всего прочего выдает поддерживаемые методики оптимизции. Так у меня FPC 2.3.1 для i386 выдает следующий список
Код: Выделить всё
Supported Optimizations:
REGVAR
UNCERTAIN
STACKFRAME
PEEPHOLE
ASMCSE
LOOPUNROLL
TAILRECREGVAR - "заставляет" FPC хранить часто используемые переменные в регистрах
STACKFRAME - удаляет фрейм стека
LOOPUNROLL - я так понимаю развертка небольших циклов.
UNCERTAIN - это описаный выше -Ou
А что делают остальные опции? PEEPHOLE, ASMCSE, TAILREC ?
- *vmr
- постоялец
- Сообщения: 168
- Зарегистрирован: 08.01.2007 00:46:07
- Откуда: Киев
- Контактная информация:
PEEPHOLE - подстановка вместо медленной инструкции ее более быстрого аналога (например битовый здвиг вместо умножения деления на степень двойки) - все три прохода этой оптимизации закодированиы в модуле popt386.pas
ASMCSE - common subexpression elimination
TAILREC - tail recursion recognition(???) - opttail.pas
ASMCSE - common subexpression elimination
TAILREC - tail recursion recognition(???) - opttail.pas
Все озабочены оптимизацией кода, и никаких сообщений на форуме содержащих gprof, по крайней мере я не нашёл, странно.
Хотя для данного случая gprof не подходит, для больших программ, с множеством вызовов функций, вещь очень нужная
компилировал с опцией -dDEBUG -dGDB -Op3 -CfSSE -pg
статья от ibm: "Ускорение кода при помощи GNU-профайлера"
Хотя для данного случая 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-профайлера"
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
