Физик
Погугли на тему CodeGear, и Turbo Delphi, ладно? Потом расскажешь, что нарыл... И не надо говорить того, о чем не знаешь.
Модератор: Модераторы
.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)"
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
volvo877 писал(а):И не надо говорить того, о чем не знаешь.
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 раза
Рождённый_в_СССР писал(а):не вычисляя всё, а вычисляя только ту часть, которую потом нужно выводить
Я бы так не сказал, а вот действительно мощная контора Borland почему то прекратила поддержку Паскаля.
А такое бывает? Я сильно сомневаюсь....
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
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];
# [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:
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.
Рождённый_в_СССР писал(а):программа:
Код:
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
Вернуться в Free Pascal Compiler
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10