The random generator is in both cases the Mersenne Twister (routine mt19937 from the authors' site). And I had forgot the Fortran program. Anyway you are right: the pseudorandom generator takes the most time in the program. But here is another example, this time both in Pascal and in Fortran:
------------------------------------------------ program matrix; uses GPC, SysUtils;
const size = 30;
type tMatrix = array[0..size, 0..size] of longint;
VAR
time1, time2 : longCard; dummy, j, big, cpu1, cpu2 : integer;
procedure mkmatrix( rows, cols : integer; var mx : tMatrix); var R, C : integer; count : longint; begin Dec(rows); Dec(cols); count := 1; for R := 0 to rows do begin for C := 0 to cols do begin mx[R, C] := count; Inc(count); end; end; End;
procedure mmult(rows, cols : integer; m1, m2 : tMatrix; var mm : tMatrix ); var i, j, k : integer; val: longint; begin Dec(rows); Dec(cols); For i := 0 To rows do begin For j := 0 To cols do begin val := 0; For k := 0 To cols do begin Inc(val, m1[i, k] * m2[k, j]); end; mm[i, j] := val; end; end; End;
var NUM, I : integer; M1, M2, MM : tMatrix;
begin
writeln ('# MATRIX MULTIPLICATION: GPC'); time1 := GetMicroSecondTime;
if ParamCount = 0 then NUM := 1 else NUM := StrToInt(ParamStr(1));
if NUM < 1 then NUM := 1;
mkmatrix(size, size, M1); mkmatrix(size, size, M2);
for I := 0 To NUM do begin mmult(size, size, M1, M2, MM); end; WriteLn( IntToStr(MM[0, 0]) + ' ' + IntToStr(MM[2, 3]) + ' ' + IntToStr(MM[3, 2]) + ' ' + IntToStr(MM[4, 4]));
dummy := 0;
time2 := GetMicroSecondTime; writeln('GPC: elapsed time: ', ( (time2-time1) * 0.000001):7:2, ' seconds, ' );
end.
------------------------------------------------
program perfor2for
integer i character*20 argum integer size parameter ( size = 30 ) integer m1 ( 0:size, 0:size), m2 ( 0:size, 0:size), & mm ( 0:size, 0:size), mx ( 0:size, 0:size ) real etime real elapsed(2) real total
write (*,*) '# MATRIX MULTIPLICATION: IFORT'
call getarg ( 1, argum ) read ( argum, * ) num write (*,*) '# size = ', size
if ( num .le. 1 ) num =1
call mkmatrix ( size, size, m1 ) call mkmatrix ( size, size, m2 )
write (*,*)'------------------------------------------------------'
write (*,*) m1 (0,0), ' ', m1(2,3), ' ', m1(3,2), ' ', m1(4,4) write (*,*) m2 (0,0), ' ', m2(2,3), ' ', m2(3,2), ' ', m2(4,4)
write (*,*)'------------------------------------------------------'
do i = 1, num call mmult ( size, size, m1, m2, mm ) enddo
write (*,*) mm (0,0), ' ', mm(2,3), ' ', mm(3,2), ' ', mm(4,4)
total = etime ( elapsed ) print *, 'Elapsed time =', total, ' secondi '! , ' user=', elapsed(1), ' system=', elapsed(2)
stop end
subroutine mkmatrix ( rows, cols, mx ); integer r, c, rows, cols include 'size.h' integer mx ( 0:size, 0:size ), count
rows = rows - 1 cols = cols - 1 count = 1
write (*,*) '# rows = ', rows, ' cols = ', cols
do r = 0, rows do c = 0, cols mx ( r, c ) = count count = count + 1 enddo enddo
return end
subroutine mmult ( rows, cols, m1, m2, mm )
integer r, c, rows, cols, i, j, k include 'size.h' integer m1( 0:size, 0:size ), m2( 0:size, 0:size ), mm ( 0:size, 0:size ), count, val
rows = rows - 1 cols = cols - 1
do i = 0, rows do j = 0, cols val = 0 do k = 0, cols val = val + m1(i,k)*m2(k, j) enddo mm(i, j) = val enddo enddo
return end
------------------------------------------------------------------
here the difference is marked. Perhaps by exhanging columns with rows one can make Pascal execution faster. I will try. Thanks, best regards
Silvio a Beccara