benchmark on rewrited pde1.frt



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
: 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
: 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.

.



Relevant Pages

  • partial differential equation solved using integers
    ... \ 2D PROBLEM DIV)=0, RECTANGULAR DOMENIUM ... CREATE MEM #MEM CELLS ALLOT ... CREATE SUBDOM #SUBDOM 2* CELLS ALLOT ... CELLS +LOOP; ...
    (comp.lang.forth)
  • Problems Defining Object Variable in For Each Loop
    ... Normally I would build the loop as follows: ... For each cell in Worksheet ... expecting to see the same sheet name. ...
    (microsoft.public.excel.programming)
  • RE: User List Box - List from Hidden range - VBA worng
    ... In your for loop, ... range is only 1 column wide this will be a single cell). ... Basic Editor type the word on it's own in lower case on a line and hit enter. ... in the array reference - and an array starts with element 0. ...
    (microsoft.public.excel.programming)
  • Re: Problem with Do Loop and If
    ... No loop required. ... > reaches the first blank cell. ... >> Sub testIt1() ... >> Excel, PowerPoint, and VBA add-ins, tutorials ...
    (microsoft.public.excel.programming)
  • Re: VBA: For Count, when count changes from cell to cell
    ... reporting Macro being unavailable. ... Dim LastRowOfData As Long ... Dim LC As Integer ' Loop Counter ... means that you can refer to it in a cell just like a built-in Excel function. ...
    (microsoft.public.excel.misc)