From: "tkrauss" <thomas.krauss@gmail.com>
Subject: GNAT compiler switches and optimization
Date: 20 Oct 2006 03:47:44 -0700
Date: 2006-10-20T03:47:44-07:00 [thread overview]
Message-ID: <1161341264.471057.252750@h48g2000cwc.googlegroups.com> (raw)
I'm a bit stuck trying to figure out how to coax more performance
out of some Ada code. I suspect there is something simple (like
compiler switches) but I'm missing it. As an example I'm using
a simple matrix multiply and comparing it to similar code in
Fortran. Unfortunately the Ada code takes 3-4 times as long.
I'm using GNAT (GPL 2006) and GFortran (4.2.0) and the following
compile options:
gnat make -O3 -gnatp tst_array
gfortran -O3 tst_array.f95
Running them on 800x800 matrices (on my 2GHz laptop)
for Ada: "tst_array 800" runs in 18 seconds
for Fortran "tst_array 800" runs in 6 seconds
(if I use the fortran "matmul" intrinsic the fortran time drops to
2.5 seconds)
Note, I tried reordering the loops, removing the random calls, etc.
none of which made huge changes. There is something killing
performance
and/or a switch or two that I'm missing, but I can't seem to find it.
Any
thoughts?
Here is the code:
-- tst_array.adb
with Ada.Numerics.Float_Random; use Ada.Numerics.Float_Random;
with Ada.Command_Line; use Ada.Command_Line;
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Calendar; use Ada.Calendar;
procedure tst_array is
package F_IO is new Ada.Text_IO.Float_IO(Float);
package D_IO is new Ada.Text_Io.Fixed_Io(Duration);
type Real_Matrix is array(Integer range <>,Integer range <>) of
Float;
type Matrix_Access is access Real_Matrix;
N : Positive;
G : Ada.Numerics.Float_Random.Generator;
A,B,C : Matrix_Access;
Start, Finish : Ada.Calendar.Time;
Sum : Float := 0.0;
begin
N := Positive'Value (Argument (1));
Start := Ada.Calendar.Clock;
A := new Real_Matrix(1..N, 1..N);
B := new Real_Matrix(1..N, 1..N);
C := new Real_Matrix(1..N, 1..N);
for I in A'range(1) loop
for J in A'range(2) loop
A(I,J) := Ada.Numerics.Float_Random.Random(G);
B(I,J) := Ada.Numerics.Float_Random.Random(G);
end loop;
end loop;
for I in A'range(1) loop
for J in A'range(2) loop
Sum := 0.0;
for R in A'range(2) loop
Sum := Sum + A(I,R)*B(R,J);
end loop;
C(I,J) := Sum;
end loop;
end loop;
Finish := Ada.Calendar.Clock;
F_IO.Put (C(1,1)); F_IO.Put (C(1,2)); New_Line;
F_IO.Put (C(2,1)); F_IO.Put (C(2,2)); New_Line;
Finish := Ada.Calendar.Clock;
Put ("Time: "); D_IO.Put(Finish-Start); New_Line;New_Line;
end tst_array;
-- tst_array.f95
program test_array
integer,parameter :: seed = 86456
integer :: N
integer :: numArgs
real, dimension(:,:), allocatable :: a, b, c
real, dimension(:,:), allocatable :: d, e, f
real :: sum
character*100 buffer
real :: begin, finish
integer :: I, J, R
call getarg(1,buffer)
read(buffer,*) N
call srand(seed)
begin = second()
allocate( a(N,N) )
allocate( b(N,N) )
allocate( c(N,N) )
forall (I = 1:N, J = 1:N)
a(i,j) = rand()
b(i,j) = rand()
end forall
!c = matmul(a, b)
do I = 1,N
do J = 1,N
sum = 0.0
do R = 1,N
sum = sum + A(I,R)*B(R,J)
end do
C(I,J) = sum
end do
end do
print *, c(1,1), c(1,2), c(2,1), c(2,2)
finish = second()
print *, 'Time: ', (finish-begin)
end program test_array
next reply other threads:[~2006-10-20 10:47 UTC|newest]
Thread overview: 68+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-10-20 10:47 tkrauss [this message]
2006-10-20 11:04 ` GNAT compiler switches and optimization Duncan Sands
2006-10-21 10:45 ` Stephen Leake
2006-10-20 11:42 ` Duncan Sands
2006-10-20 15:41 ` Martin Krischik
2006-10-20 12:09 ` Samuel Tardieu
2006-10-20 12:18 ` Samuel Tardieu
2006-10-20 12:12 ` Gautier
2006-10-20 12:35 ` Dmitry A. Kazakov
2006-10-20 15:53 ` Martin Krischik
2006-10-20 12:52 ` Gautier
2006-10-20 13:27 ` claude.simon
2006-10-20 15:38 ` Robert A Duff
2006-10-20 19:32 ` Gautier
2006-10-20 15:56 ` Jeffrey Creem
2006-10-20 16:30 ` Martin Krischik
2006-10-20 19:51 ` Gautier
2006-10-20 22:11 ` Jeffrey R. Carter
2006-10-20 23:52 ` Jeffrey Creem
2006-10-21 7:37 ` Gautier
2006-10-21 16:35 ` Jeffrey Creem
2006-10-21 17:04 ` Pascal Obry
2006-10-21 21:22 ` Jeffrey Creem
2006-10-22 3:03 ` Jeffrey Creem
2006-10-22 7:39 ` Jeffrey R. Carter
2006-10-22 11:48 ` tkrauss
2006-10-22 18:02 ` Georg Bauhaus
2006-10-22 18:24 ` Jeffrey Creem
2006-10-23 0:10 ` Georg Bauhaus
2006-10-22 20:20 ` Jeffrey R. Carter
2006-10-22 12:31 ` Gautier
2006-10-22 20:26 ` Jeffrey R. Carter
2006-10-22 21:22 ` Gautier
2006-10-22 18:01 ` tmoran
2006-10-22 20:54 ` Jeffrey R. Carter
2006-10-22 13:50 ` Alinabi
2006-10-22 15:41 ` Jeffrey Creem
2006-10-23 0:02 ` Alinabi
2006-10-23 5:28 ` Gautier
2006-10-23 16:32 ` Alinabi
2006-10-22 15:57 ` Jeffrey Creem
2006-10-22 19:32 ` Damien Carbonne
2006-10-22 20:00 ` Gautier
2006-10-22 20:51 ` Damien Carbonne
2006-10-23 2:15 ` Jeffrey Creem
2006-10-23 2:29 ` Jeffrey R. Carter
2006-10-23 1:31 ` Jeffrey Creem
2006-10-23 3:10 ` Jeffrey Creem
2006-10-23 7:31 ` Jeffrey R. Carter
2006-10-23 11:55 ` Jeffrey Creem
2006-10-23 19:52 ` Wiljan Derks
2006-10-23 20:25 ` Jeffrey R. Carter
2006-10-24 9:52 ` Dr. Adrian Wrigley
2006-10-24 11:50 ` Jeffrey Creem
2006-10-24 16:24 ` Jeffrey R. Carter
2006-10-25 3:50 ` Jeffrey Creem
2006-10-25 15:32 ` claude.simon
2006-10-24 19:21 ` Wiljan Derks
2006-10-23 12:33 ` Warner BRUNS
2006-10-23 12:40 ` Warner BRUNS
2006-10-23 13:52 ` Georg Bauhaus
2006-10-23 17:11 ` Warner BRUNS
2006-10-23 17:57 ` Dr. Adrian Wrigley
2006-10-23 15:02 ` Robert A Duff
2006-10-23 20:22 ` Jeffrey R. Carter
2006-10-21 18:28 ` tmoran
2006-10-23 6:28 ` Martin Krischik
2006-10-21 12:39 ` Dr. Adrian Wrigley
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox