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

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

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

Сообщение volvo877 » 26.08.2007 14:06:34

Физик
Погугли на тему CodeGear, и Turbo Delphi, ладно? Потом расскажешь, что нарыл... И не надо говорить того, о чем не знаешь.
volvo877
незнакомец
 
Сообщения: 8
Зарегистрирован: 04.09.2005 14:34:53

Сообщение SovNarKom » 26.08.2007 14:43:10

Ожидал я холивара обычного C vs Pascal, а тут оба на - фортран...
Будет время - сравню генерируемый код.
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]

Сообщение Рождённый_в_СССР » 26.08.2007 15:33:55

а чего их сравнивать?
в классическом фортране же нет ни рекурсий ни ООП ни динамических элементов... как можно вообще учить в школе такой язык?
вообще я так помню фортран свалился к нам, вернее даже не к нам а к инженерам - как язык для математических расчётов... там была богатая мат. библиотека, которая требовала знания только основ программирования, но не как не алгоритмов... поэтому он широко использовался инженерами...
сейчас, например в моём предприятии уже лет 20 никто не считает на фортране... все инжеренеры давно используют ProEngenering... им это программирование в одно место не надо...

наверное по этим двум причинам фортран ушёл из курсов обучения... хотя соглашусь года в 70-80 фортран был популярен в России... и много людей обучались на нём... наверное именно то поколение и лечит вам про то, какой был фортран замечательным и какими высокими и чистыми были деревья
Последний раз редактировалось Рождённый_в_СССР 26.08.2007 16:03:13, всего редактировалось 1 раз.
Аватара пользователя
Рождённый_в_СССР
новенький
 
Сообщения: 65
Зарегистрирован: 08.08.2007 01:03:26
Откуда: Саратов

Сообщение SovNarKom » 26.08.2007 15:43:19

Рождённый_в_СССР
Да нельзя конечно... мне интерсно почему на конкретном примере FPC так здорово проигрывает...
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]

Сообщение Рождённый_в_СССР » 26.08.2007 16:04:36

пока это ещё не установленно, я же говорил, что вероятнее всего он халтурит, не вычисляя всё, а вычисляя только ту часть, которую потом нужно выводить

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

Сообщение SovNarKom » 26.08.2007 16:15:15

Рождённый_в_СССР
Вот я и хочу посмотреть, компилятор у меня есть... хотя лучше, Физик, выложи скомпиленую прогу.
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]

Сообщение shade » 26.08.2007 18:16:00

Вот ассемблерный листинг сгенерированый фортраном, кому интересно разбирайтесь
(g77 -O3 -S matmul.for)
Код: Выделить всё
   .file   "matmul.for"
   .local   a.0
   .comm   a.0,5120000,32
   .local   b.1
   .comm   b.1,5120000,32
   .local   c.2
   .comm   c.2,5120000,32
   .data
   .align 4
   .type   __g77_cilist_0.3,@object
   .size   __g77_cilist_0.3,20
__g77_cilist_0.3:
   .long   0
   .long   6
   .long   0
   .long   0
   .long   0
   .align 4
   .type   __g77_cilist_1.5,@object
   .size   __g77_cilist_1.5,20
__g77_cilist_1.5:
   .long   0
   .long   6
   .long   0
   .long   __g77_format_10.4
   .long   0
   .type   __g77_format_10.4,@object
   .size   __g77_format_10.4,11
__g77_format_10.4:
   .ascii   "(2X,2F16.6)"
   .align 4
   .type   __g77_cilist_2.6,@object
   .size   __g77_cilist_2.6,20
__g77_cilist_2.6:
   .long   0
   .long   6
   .long   0
   .long   0
   .long   0
   .section   .rodata
.LC2:
   .ascii   "N = "
.LC8:
   .ascii   " TIME CALCULATION: "
.LC10:
   .ascii   "  MFLOPS: "
.LC11:
   .section   .rodata.cst8,"aM",@progbits,8
   .align 8
.LC0:
   .long   0
   .long   1104052126
   .section   .rodata.cst4,"aM",@progbits,4
   .align 4
.LC3:
   .long   1
   .align 4
.LC4:
   .long   9
   .align 4
.LC5:
   .long   800
   .align 4
.LC6:
   .long   3
   .section   .rodata.cst8
   .align 8
.LC7:
   .long   0
   .long   1093567616
   .section   .rodata.cst4
   .align 4
.LC9:
   .long   5
   .text
   .p2align 2,,3
.globl MAIN__
   .type   MAIN__,@function
MAIN__:
   pushl   %ebp
   movl   %esp, %ebp
   pushl   %edi
   pushl   %esi
   pushl   %ebx
   subl   $12876, %esp
   movl   $1, %edi
   movl   $799, %esi
   fld1
.L12:
   pushl   %edi
   leal   6400(,%edi,8), %eax
   fildl   (%esp)
   leal   b.1-6408(%eax), %edx
   movl   $1, %ebx
   movl   $799, %ecx
   addl   $4, %esp
   addl   $a.0-6408, %eax
   .p2align 2,,3
.L11:
.L10:
   fstl   (%eax)
   fld   %st(1)
   pushl   %ebx
   fidivl   (%esp)
   fstpl   (%edx)
   addl   $4, %esp
   addl   $6400, %edx
   addl   $6400, %eax
   incl   %ebx
   decl   %ecx
   jns   .L11
   fstp   %st(0)
   incl   %edi
   decl   %esi
   jns   .L12
   fstp   %st(0)
   subl   $12, %esp
   pushl   $__g77_cilist_0.3
   call   s_wsle
   pushl   $4
   pushl   $.LC2
   pushl   $.LC3
   pushl   $.LC4
   call   do_lio
   addl   $32, %esp
   pushl   $4
   pushl   $.LC5
   pushl   $.LC3
   pushl   $.LC6
   call   do_lio
   call   e_wsle
   call   dsecnd_
   fstpl   -12832(%ebp)
   movl   $1, %edi
   addl   $16, %esp
   movl   $799, -12844(%ebp)
   fldz
   movl   $c.2-6400, -12860(%ebp)
   movl   $a.0-6400, -12864(%ebp)
.L34:
   movl   -12864(%ebp), %ecx
   movl   $799, %esi
   addl   $6400, %ecx
   leal   -6424(%ebp), %ebx
   .p2align 2,,3
.L21:
   movl   (%ecx), %eax
   movl   4(%ecx), %edx
   movl   %eax, (%ebx)
   movl   %edx, 4(%ebx)
   addl   $6400, %ecx
   addl   $8, %ebx
   decl   %esi
   jns   .L21
   movl   -12860(%ebp), %edx
   addl   $6400, %edx
   movl   $799, -12848(%ebp)
   fld   %st(0)
   leal   800(%edi), %esi
   movl   $b.1-8, -12856(%ebp)
   movl   %edx, -12876(%ebp)
.L33:
   movl   -12876(%ebp), %eax
   movl   $0, (%eax)
   movl   $0, 4(%eax)
   movl   -12856(%ebp), %ebx
   movl   $799, %ecx
   movl   %esi, -12852(%ebp)
   fld   %st(0)
   leal   -6424(%ebp), %edx
   leal   8(%ebx), %eax
   .p2align 2,,3
.L31:
.L30:
   fldl   (%eax)
   fmull   (%edx)
   addl   $8, %eax
   addl   $8, %edx
   decl   %ecx
   faddp   %st, %st(1)
   jns   .L31
.L32:
   movl   -12852(%ebp), %edx
   movl   $c.2-6408, %ecx
   fstpl   (%ecx,%edx,8)
   addl   $800, %esi
   addl   $6400, -12876(%ebp)
   addl   $6400, -12856(%ebp)
   decl   -12848(%ebp)
   jns   .L33
   fstp   %st(0)
   addl   $8, -12860(%ebp)
   addl   $8, -12864(%ebp)
   incl   %edi
   decl   -12844(%ebp)
   jns   .L34
   fstp   %st(0)
   call   dsecnd_
   fsubl   -12832(%ebp)
   subl   $12, %esp
   fstl   -12832(%ebp)
   fldl   .LC0
   fxch   %st(1)
   fmull   .LC7
   fdivrp   %st, %st(1)
   pushl   $__g77_cilist_1.5
   fstpl   -12840(%ebp)
   call   s_wsfe
   addl   $12, %esp
   pushl   $8
   pushl   $c.2
   pushl   $.LC3
   call   do_fio
   addl   $12, %esp
   pushl   $8
   pushl   $c.2+5113600
   pushl   $.LC3
   call   do_fio
   addl   $12, %esp
   pushl   $8
   pushl   $c.2+6392
   pushl   $.LC3
   call   do_fio
   addl   $12, %esp
   pushl   $8
   pushl   $c.2+5119992
   pushl   $.LC3
   call   do_fio
   call   e_wsfe
   movl   $__g77_cilist_2.6, (%esp)
   call   s_wsle
   pushl   $19
   pushl   $.LC8
   pushl   $.LC3
   pushl   $.LC4
   call   do_lio
   addl   $32, %esp
   pushl   $8
   leal   -12832(%ebp), %esi
   pushl   %esi
   pushl   $.LC3
   pushl   $.LC9
   call   do_lio
   pushl   $10
   pushl   $.LC10
   pushl   $.LC3
   pushl   $.LC4
   call   do_lio
   addl   $32, %esp
   pushl   $8
   leal   -12840(%ebp), %ebx
   pushl   %ebx
   pushl   $.LC3
   pushl   $.LC9
   call   do_lio
   call   e_wsle
   popl   %eax
   popl   %edx
   pushl   $0
   pushl   $.LC11
   call   s_stop
.Lfe1:
   .size   MAIN__,.Lfe1-MAIN__
   .p2align 2,,3
.globl dsecnd_
   .type   dsecnd_,@function
dsecnd_:
   pushl   %ebp
   movl   %esp, %ebp
   leal   -16(%ebp), %edx
   subl   $36, %esp
   pushl   %edx
   call   G77_etime_0
   fstps   -4(%ebp)
   flds   -4(%ebp)
   addl   $16, %esp
   leave
   ret
.Lfe2:
   .size   dsecnd_,.Lfe2-dsecnd_
   .section   .note.GNU-stack,"",@progbits
   .ident   "GCC: (GNU) 3.2.3 20030502 (Red Hat Linux 3.2.3-47.fc4)"
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение shade » 26.08.2007 18:47:51

Инетесно, заменил
Код: Выделить всё
DO 2 I = 1,N
DO L = 1,N
ROW(L) = A(I,L)
END DO
DO 2 J = 1,N
C(I,J) =0.0d0
DO 3 K = 1,N
3 C(I,J) = C(I,J) + ROW(K)*B(K,J)
2 CONTINUE

на
Код: Выделить всё
      DO 2 I = 1,N
      DO 2 J = 1,N
      C(I,J) =0.0d0
      DO 3 K = 1,N
  3   C(I,J) = C(I,J) + A(I,K)*B(K,J)
  2   CONTINUE

(убрал ROW(L) = A(I, L) и т.с.) и фортран справился с задачей хуже fpc, в 2 раза :lol:
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение Физик » 26.08.2007 19:30:54

volvo877 писал(а):И не надо говорить того, о чем не знаешь.


А Вы что ли знаете

Turbo Pascal Version 8.0
Borland International
Физик
новенький
 
Сообщения: 28
Зарегистрирован: 26.06.2006 12:42:33

Сообщение alexs » 26.08.2007 19:43:17

Физик
насчёт паскаля вы не правы
проблемы у Borland не с паскалем а с маркетолагами - причём очен большие. после того, как они легли под MS - начались брожения
они даже разделились - выделили подразделения по разработке языков, а сами занялись чёрт знает чем
в итоге по последним финансовым сводкам - головная компания, тобиш сам борланд с разработками уровня предприятия - сидит мягко говоря в ... - с убытками
а КодеГир - в прибыли хорошей - вот и думай тут...
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Физик » 26.08.2007 19:50:26

shade писал(а):Инетесно, заменил
Код: Выделить всё
DO 2 I = 1,N
DO L = 1,N
ROW(L) = A(I,L)
END DO
DO 2 J = 1,N
C(I,J) =0.0d0
DO 3 K = 1,N
3 C(I,J) = C(I,J) + ROW(K)*B(K,J)
2 CONTINUE

на
Код: Выделить всё
      DO 2 I = 1,N
      DO 2 J = 1,N
      C(I,J) =0.0d0
      DO 3 K = 1,N
  3   C(I,J) = C(I,J) + A(I,K)*B(K,J)
  2   CONTINUE

(убрал ROW(L) = A(I, L) и т.с.) и фортран справился с задачей хуже fpc, в 2 раза :lol:


Проверил не в 2 а в 1.46.

Но мы всё таки сравниваем компиляторы, а не программистов, поэтому тексты программ для FPC и Фортрана для должны быть максимально идентичны.
Физик
новенький
 
Сообщения: 28
Зарегистрирован: 26.06.2006 12:42:33

Сообщение Физик » 26.08.2007 19:53:14

Рождённый_в_СССР писал(а):не вычисляя всё, а вычисляя только ту часть, которую потом нужно выводить


А такое бывает? Я сильно сомневаюсь....
Физик
новенький
 
Сообщения: 28
Зарегистрирован: 26.06.2006 12:42:33

Сообщение ev » 26.08.2007 20:42:37

Я бы так не сказал, а вот действительно мощная контора Borland почему то прекратила поддержку Паскаля.

легко рассуждать не зная истории ;)
а если покопаться почему это произошло, кто купил акции, кто переманил верхушку - станет все сразу явно
и сразу понятно стоновится откуда вдруг появился Turbo Delphi

А такое бывает? Я сильно сомневаюсь....

я уже вроде говорил (и не только я)
подобные подтасовки уже случались и были обнародованы в различных местах
ev
долгожитель
 
Сообщения: 1772
Зарегистрирован: 27.04.2005 23:19:06
Откуда: Москва

Сообщение Рождённый_в_СССР » 27.08.2007 03:44:09

млин... господа... он вообще не MMX не SSE не использует... да что такое... понять чего там конкретно написанно - не могу так как GNU AT&T не понимаю :oops: по идее мы его должны легко обогнать...

проверьте три вещи:

1) попробуйте всё таки вывести на экран или сохранить в файл все что он там насчитал в матрице c , соответственно не внося изменений в хронологию снимания времени ) т.е. снимайте его тока на этом цикле - тогда это самое простое )
2) добавьте в Паскаль код
а. Uses MMX
б. {$mmx+} перед циклом
в. {$mmx-} emms; после цикла

отдельным (можно и совместным) c этим эксперементом попробуйте добавить в опции FPC перед -O3 опцию -CfSSE3 (мона и -CfSSE2)

3) а вот факт, что FPC обогнал фортран в 2 раза, если
Код: Выделить всё
DO 2 I = 1,N
      DO 2 J = 1,N
      C(I,J) =0.0d0
      DO 3 K = 1,N
  3   C(I,J) = C(I,J) + A(I,K)*B(K,J)
  2   CONTINUE

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


рассмотрим формулы:
Код: Выделить всё
  C(I,J) = C(I,J) + ROW(K)*B(K,J) -> с[j,i]:=c[j,i]+col[k]*b[k,i]
  а не как ни
   c[i,j] := c[i,j] + a[i,k]*col[k];


смотрим код который выдаётся старой программой в самом критическом участке (через опцию -al):
Код: Выделить всё
# [39] for k := 1 to n do s:=s+col[k]*a[i,k];
        movw    U_P$PROGRAM_N,%si
        movw    $1,U_P$PROGRAM_K
        cmpw    U_P$PROGRAM_K,%si
        jl      .L69
        decw    U_P$PROGRAM_K
        .balign 4
.L70:
        incw    U_P$PROGRAM_K
        movswl  U_P$PROGRAM_K,%eax
        imull   $16000,%eax,%edx
        movswl  U_P$PROGRAM_I,%edi
        movsd   U_P$PROGRAM_COL-8(,%eax,8),%xmm0
        mulsd   U_P$PROGRAM_A-16008(%edx,%edi,8),%xmm0
        movswl  U_P$PROGRAM_J,%eax
        imull   $16000,%eax
        movswl  U_P$PROGRAM_I,%edx
        addsd   U_P$PROGRAM_C-16008(%eax,%edx,8),%xmm0
        movswl  U_P$PROGRAM_J,%eax
        imull   $16000,%eax
        movswl  U_P$PROGRAM_I,%edx
        movsd   %xmm0,U_P$PROGRAM_C-16008(%eax,%edx,8)
        cmpw    U_P$PROGRAM_K,%si
        jg      .L70 

и определённо видим тут лишние места... в частности неверная работа с строками и стобцами... вернее неэффективная - так как всё время приходится пересчитывать смещения...
после небольшой модификации по аналогии с фортрановской прогой имеем:
Код: Выделить всё
# [39] for k := 1 to n do s:=s+col[k]*rol[k];
        movw    U_P$PROGRAM_N,%dx
        movw    $1,U_P$PROGRAM_K
        cmpw    U_P$PROGRAM_K,%dx
        jl      .L76
        decw    U_P$PROGRAM_K
        .balign 4
.L77:
        incw    U_P$PROGRAM_K
        movswl  U_P$PROGRAM_K,%eax
        movl    %eax,%ecx
        movsd   U_P$PROGRAM_COL-8(,%eax,8),%xmm0
        mulsd   U_P$PROGRAM_ROL-8(,%ecx,8),%xmm0
        addsd   U_P$PROGRAM_S,%xmm0
        movsd   %xmm0,U_P$PROGRAM_S
        cmpw    U_P$PROGRAM_K,%dx
        jg      .L77
.L76:             

как видим не пересчитывается... а самое главное - проще кода быть не может ) даже мне не понимающему AT&T отсюда всё понятно что происходит, хотя конечно хотелось бы регистров побольше насовать - но это отдельная проблема...

программа:
Код: Выделить всё
uses Dos;
var
i,j,k,l,n : integer;
a,b,c : array [1..2000,1..2000] of double;
col,rol : array [1..2000] of double;
op,mf,s : double;
tim1,tim2,tim : real;

function second :real;
var
h1,m1,s1,ds1 : word;
begin
GetTime(h1,m1,s1,ds1);
second := h1*3600+m1*60+s1+0.01*ds1;
end;

begin
n := 2000;
op := (2.0*n-1)*n*n;

for i:=1 to n do
for j:=1 to n do
begin
a[i,j]:=i;
b[i,j]:=1.0/j;
c[i,j]:=0;
end;

writeln(' N = ', n);
tim1 := second;

for j:= 1 to n do
begin
     for l := 1 to n do col[l]:=a[j,L];
     for i := 1 to n do
         begin
              for l := 1 to n do rol[l]:=b[L,i];
              s:=0;
              for k := 1 to n do s:=s+col[k]*rol[k];
              c[j,i]:=s;
         end;
end;

tim2:= second;
tim := tim2 -tim1;
mf := op/(tim*1000000.0);
writeln( c[1,1],c[1,n]);
writeln( c[n,1],c[n,n]);

writeln(' TIME CALCULATION: ', tim:6:3,' MFLOPS: ', MF);

end.

ключи:
1) fpc -CfSSE2 -O2 1.pas
2) fpc -O3 1.pas

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

Сообщение Физик » 27.08.2007 06:55:47

Рождённый_в_СССР писал(а):программа:
Код:

uses Dos;
var
i,j,k,l,n : integer;
a,b,c : array [1..2000,1..2000] of double;
col,rol : array [1..2000] of double;
op,mf,s : double;
tim1,tim2,tim : real;

function second :real;
var
h1,m1,s1,ds1 : word;
begin
GetTime(h1,m1,s1,ds1);
second := h1*3600+m1*60+s1+0.01*ds1;
end;

begin
n := 2000;
op := (2.0*n-1)*n*n;

for i:=1 to n do
for j:=1 to n do
begin
a[i,j]:=i;
b[i,j]:=1.0/j;
c[i,j]:=0;
end;

writeln(' N = ', n);
tim1 := second;

for j:= 1 to n do
begin
for l := 1 to n do col[l]:=a[j,L];
for i := 1 to n do
begin
for l := 1 to n do rol[l]:=b[L,i];
s:=0;
for k := 1 to n do s:=s+col[k]*rol[k];
c[j,i]:=s;
end;
end;

tim2:= second;
tim := tim2 -tim1;
mf := op/(tim*1000000.0);
writeln( c[1,1],c[1,n]);
writeln( c[n,1],c[n,n]);

writeln(' TIME CALCULATION: ', tim:6:3,' MFLOPS: ', MF);

end.


ключи:
1) fpc -CfSSE2 -O2 1.pas
2) fpc -O3 1.pas


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

Пред.След.

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

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

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

Рейтинг@Mail.ru