benchmark on rewrited pde1.frt
- From: "humptydumpty" <ouatubi@xxxxxxxxx>
- Date: 8 Aug 2006 22:56:13 -0700
Benchmarks for example exposed in pde1.frt(rectangular domenium) by
Kryshna Myneni (kForth), on PIV 3GHz:
| Integer version | Floating point version
iForth 2.02 | 0.043 seconds | 0.053 seconds
gforth-fast | 0.120 seconds | 0.432 seconds
(cygwin)
thanks to Marcel Hendrix for bench on iForth! :)
Math algorithm is the same as in pde1.frt but i used another
implementation.
to view results i used:
$gforth-fast -e "include i2lap.fs init iter print bye"
i2lap.plot$gnuplot
gnuplot> set cntrparam levels auto 10
gnuplot> set contour surface
gnuplot> splot "i2lap.plot" matrix
the sources for integer and fp version are below (inside DO..LOOP/+LOOP
is better to use I instead of R@, but initially i tried to make it
compatible with a forth that has no I). Word .benchmark used for
timing must be rewriten to use words from forth implementation one have
(i used gforth :)
Explanations of sources:
i tried to have just a little calculation of adresses
of element of matrix ( x*nr.of.rows + y ), so i used
just a linear array. it is no need to access a random
element of matrix, only i need adresses of constant
offset to access elements matrixes, i think is not
necesary a matrix model ( i have a little picture
about that inside sources).
to have not to check inside a double loop if a domain
cell is from boundary or not, i set a ranges of
subdomains to fit to DO .. LOOP structure -> the word
INIT-ADDR.SUBDOM. i think is a more flexible model
than matrix model, it allows to set boundaries inside
the domenium of calculus, to iterate multiple times
through the same subdomenium and with little
modifications to alter the direction of iterations
through subdomenium.
Integer version:
\ START OF CODE - i2lap.fs
\ LAPLACE PROBLEM DIV(GRAD(V))=0
\ using integers, gauss-seidel iteration
0 CONSTANT V0
50000 CONSTANT V1
100000 CONSTANT V2
V0 2* V1 + V2 + 2/ 2/ CONSTANT VM
64 CONSTANT #X \ NR. ROWS
64 CONSTANT #Y \ NR. COLS
( N
---
0 1 2 3 4 5
-------------
6 | 7 8 9 10| 11
| 12 |13 14 15 16| 17 |
W| 18 |19 20 21 22| 23 |E
| 24 |25 26 27 28| 29 |
-------------
30 31 32 33 34 35
---
S
)
#X #Y * CONSTANT #MEM
#MEM CELLS CONSTANT BACK-OFFS
CREATE MEM BACK-OFFS 2* ALLOT
MEM BACK-OFFS + CONSTANT BACK-MEM
\ DEF. ADRESSES OF SUBDOMENIUMS
#X 2 - CONSTANT #SUBDOM \ NR SUBDOMENIUMS
CREATE SUBDOM #SUBDOM 2* CELLS ALLOT
: IDX>OFFS CELLS ;
\ --- INIT
: INIT-ADDR.SUBDOM
#SUBDOM 0
DO
R@ 1+ #Y * [ #Y 1- ] LITERAL + IDX>OFFS MEM +
R@ 1+ #Y * 1+ IDX>OFFS MEM +
R@ 2* CELLS SUBDOM + 2!
LOOP
;
\ INIT DOMENIUM
: INIT-DOM BACK-MEM MEM
DO
VM R@ !
CELL +LOOP
;
\ DEF BOUNDARIES
: INIT-NORTH MEM DUP
#Y IDX>OFFS + SWAP
DO
V0 ( VAL) R@ ( ADDR) !
CELL +LOOP
;
: INIT-SOUTH #X 1- #Y * IDX>OFFS MEM + DUP
#Y IDX>OFFS + SWAP
DO
V1 ( VAL) R@ ( ADDR) !
CELL +LOOP
;
: INIT-WEST #X 0
DO
V0 ( VAL) R@ #Y * IDX>OFFS MEM + ( ADDR) !
LOOP
;
: INIT-EAST #X 0
DO
V2 ( VAL) R@ #Y * [ #Y 1- ] LITERAL + IDX>OFFS MEM + ( ADDR)!
LOOP
;
: INIT INIT-ADDR.SUBDOM INIT-DOM INIT-NORTH INIT-SOUTH INIT-EAST
INIT-WEST ;
\ ITER ON CELL OF DOMENIUM
: CELL-ITER ( ADDR -- )
>R
R@ [ #Y IDX>OFFS ] LITERAL - @
R@ [ #Y IDX>OFFS ] LITERAL + @ +
R@ [ 1 IDX>OFFS ] LITERAL - @ +
R@ [ 1 IDX>OFFS ] LITERAL + @ +
2/ 2/
R> !
;
\ ITER ON SUBDOMENIUM
: SUBDOM-ITER ( ADDR-HI ADDR-LO -- )
DO R@ CELL-ITER CELL +LOOP
;
\ ITER ON DOMENIUM
: DOM-ITER ( -- )
SUBDOM DUP [ #SUBDOM 2* CELLS ] LITERAL + SWAP
DO
R@ 2@
SUBDOM-ITER
2 CELLS +LOOP
;
: COPY>BACK MEM BACK-MEM BACK-OFFS MOVE ;
: CONVERGED? ( T|F -- T'|F') BACK-MEM MEM
DO
R@ DUP @ SWAP BACK-OFFS + @
= 0=
IF DROP 0 LEAVE THEN
CELL +LOOP
;
\ MANY ITERATIONS :)
: ITER BEGIN COPY>BACK DOM-ITER -1 CONVERGED? UNTIL ;
: PRINT-LINE ( #LINE -- )
#Y * IDX>OFFS MEM + DUP
#Y IDX>OFFS + SWAP
DO
R@ @ .
CELL +LOOP ;
: PRINT ( -- )
#X 0 DO R@ PRINT-LINE CR LOOP ;
: .benchmark
CR ." Start .. " utime init iter utime d- dabs d>s 1000 / . ."
ms elapsed." ;
\ .benchmark
\ END OF CODE
Floating point version:
\ START OF CODE - f2lap.fs
\ LAPLACE PROBLEM DIV(GRAD(V))=0
\ using floats, gauss-seidel iteration
1E-3 FCONSTANT ERROR
0E0 FCONSTANT V0
50E0 FCONSTANT V1
100E0 FCONSTANT V2
V0 FDUP F+ V1 F+ V2 F+ 4E0 F/ FCONSTANT VM
64 CONSTANT #X \ NR. ROWS
64 CONSTANT #Y \ NR. COLS
( N
---
0 1 2 3 4 5
-------------
6 | 7 8 9 10| 11
| 12 |13 14 15 16| 17 |
W| 18 |19 20 21 22| 23 |E
| 24 |25 26 27 28| 29 |
-------------
30 31 32 33 34 35
---
S
)
#X #Y * CONSTANT #MEM
#MEM FLOATS CONSTANT BACK-OFFS
CREATE MEM BACK-OFFS 2* ALLOT
MEM BACK-OFFS + CONSTANT BACK-MEM
\ DEF. ADRESSES OF SUBDOMENIUMS
#X 2 - CONSTANT #SUBDOM \ NR SUBDOMENIUMS
CREATE SUBDOM #SUBDOM 2* CELLS ALLOT
: IDX>OFFS FLOATS ;
\ --- INIT
: INIT-ADDR.SUBDOM
#SUBDOM 0
DO
R@ 1+ #Y * [ #Y 1- ] LITERAL + IDX>OFFS MEM +
R@ 1+ #Y * 1+ IDX>OFFS MEM +
R@ 2* CELLS SUBDOM + 2!
LOOP
;
\ INIT DOMENIUM
: INIT-DOM BACK-MEM MEM
DO
VM R@ F!
FLOAT +LOOP
;
\ DEF BOUNDARIES
: INIT-NORTH MEM DUP
#Y IDX>OFFS + SWAP
DO
V0 ( VAL) R@ ( ADDR) F!
FLOAT +LOOP
;
: INIT-SOUTH #X 1- #Y * IDX>OFFS MEM + DUP
#Y IDX>OFFS + SWAP
DO
V1 ( VAL) R@ ( ADDR) F!
FLOAT +LOOP
;
: INIT-WEST #X 0
DO
R@ #Y * IDX>OFFS MEM + ( ADDR) V0 F!
LOOP
;
: INIT-EAST #X 0
DO
R@ #Y * [ #Y 1- ] LITERAL + IDX>OFFS MEM + ( ADDR) V2 F!
LOOP
;
: INIT INIT-ADDR.SUBDOM INIT-DOM INIT-NORTH INIT-SOUTH INIT-EAST
INIT-WEST ;
\ INIT
\ ITER ON CELL OF DOMENIUM
: CELL-ITER ( ADDR -- )
>R
R@ [ #Y IDX>OFFS ] LITERAL - F@
R@ [ #Y IDX>OFFS ] LITERAL + F@ F+
R@ [ 1 IDX>OFFS ] LITERAL - F@ F+
R@ [ 1 IDX>OFFS ] LITERAL + F@ F+
0.25E0 F*
R> F!
;
\ ITER ON SUBDOMENIUM
: SUBDOM-ITER ( ADDR-HI ADDR-LO -- )
DO R@ CELL-ITER FLOAT +LOOP
;
\ ITER ON DOMENIUM
: DOM-ITER ( -- )
SUBDOM DUP [ #SUBDOM 2* CELLS ] LITERAL + SWAP
DO
R@ 2@
SUBDOM-ITER
2 CELLS +LOOP
;
: COPY>BACK MEM BACK-MEM BACK-OFFS MOVE ;
: CONVERGED? ( T|F -- T'|F') BACK-MEM MEM
DO
R@ DUP F@ BACK-OFFS + F@
F- FABS ERROR F>
IF DROP 0 LEAVE THEN
FLOAT +LOOP
;
\ MANY ITERATIONS :)
: ITER BEGIN COPY>BACK DOM-ITER -1 CONVERGED? UNTIL ;
\ ITER
: PRINT-LINE ( #LINE -- )
#Y * IDX>OFFS MEM + DUP
#Y IDX>OFFS + SWAP
DO
R@ F@ F.
FLOAT +LOOP ;
: PRINT ( -- )
#X 0 DO R@ PRINT-LINE CR LOOP ;
: .benchmark
CR ." Start .. " utime init iter utime d- dabs d>s 1000 / . ."
ms elapsed." ;
\ .benchmark
\ END OF CODE
have a nice day!
humpty d.
.
- Follow-Ups:
- Re: benchmark on rewrited pde1.frt
- From: George Hubert
- Re: benchmark on rewrited pde1.frt
- Prev by Date: Re: Project proposal -- Forth project organiser
- Next by Date: Re: Project proposal -- Forth project organiser
- Previous by thread: Re: What is Forth?
- Next by thread: Re: benchmark on rewrited pde1.frt
- Index(es):
Relevant Pages
|