<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"Andale Mono";
        panose-1:2 11 5 9 0 0 0 0 0 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0cm;
        margin-right:0cm;
        margin-bottom:0cm;
        margin-left:36.0pt;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.E-MailFormatvorlage19
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.E-MailFormatvorlage20
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 2.0cm 70.85pt;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:997223255;
        mso-list-type:hybrid;
        mso-list-template-ids:-1640622284 191514858 67567619 67567621 67567617 67567619 67567621 67567617 67567619 67567621;}
@list l0:level1
        {mso-level-start-at:0;
        mso-level-number-format:bullet;
        mso-level-text:-;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Calibri",sans-serif;
        mso-fareast-font-family:Calibri;}
@list l0:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level3
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l0:level4
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level6
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l0:level7
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level9
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l1
        {mso-list-id:2086367765;
        mso-list-template-ids:-1434187298;}
@list l1:level1
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:36.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l1:level2
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:72.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l1:level3
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:108.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l1:level4
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:144.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l1:level5
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:180.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l1:level6
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:216.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l1:level7
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:252.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l1:level8
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:288.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l1:level9
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:324.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
--></style></head><body lang=DE-CH link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span lang=DE style='mso-fareast-language:EN-US'>Hans<o:p></o:p></span></p><p class=MsoNormal><span lang=DE style='mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'>I did the following:<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'>PROCEDURE Trees* ();<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'>                VAR i : LONGINT;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'>                BEGIN<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'>                               IF Kernel.heapLim - Kernel.heapOrg - Kernel.allocated > 160000 THEN<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'>                                               tInitarr();<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'>                                               NEW(tree); <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'>                                               (* here the rest of Trees *)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'>                               END;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'>                               tree := NIL; Oberon.Collect(0) (* tell the GC to start after Hennessy terminated *)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'>                END Trees;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'>With these modifications you can take whatever random number generator you wanna use.<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'>DIV 65535 (wrong) or DIV 65536 (corresponds to the C original) or any other.<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'>br<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'>Joerg<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'><o:p> </o:p></span></p><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal><b><span style='font-size:12.0pt;color:black'>Von: </span></b><span style='font-size:12.0pt;color:black'>Oberon <oberon-bounces@lists.inf.ethz.ch> im Auftrag von Jörg <joerg.straube@iaeth.ch><br><b>Antworten an: </b>ETH Oberon and related systems <oberon@lists.inf.ethz.ch><br><b>Datum: </b>Freitag, 10. April 2020 um 12:45<br><b>An: </b>ETH Oberon and related systems <oberon@lists.inf.ethz.ch><br><b>Betreff: </b>Re: [Oberon] ... MOD 65536<o:p></o:p></span></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><p class=MsoNormal><span lang=DE style='mso-fareast-language:EN-US'>Hans</span><o:p></o:p></p><p class=MsoNormal><span lang=DE style='mso-fareast-language:EN-US'> </span><o:p></o:p></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'>Indeed, first I thought the culprit is the random number generator.</span><o:p></o:p></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'>The treesort algorithm in the Hennessy benchmark uses two things that can go wrong:</span><o:p></o:p></p><ul style='margin-top:0cm' type=disc><li class=MsoListParagraph style='margin-left:0cm;mso-list:l0 level1 lfo3'><span lang=EN-US style='mso-fareast-language:EN-US'>First, it uses the recursive procedure Insert and Checktree.</span><o:p></o:p></li><li class=MsoListParagraph style='margin-left:0cm;mso-list:l0 level1 lfo3'><span lang=EN-US style='mso-fareast-language:EN-US'>Second, it allocates a node on the heap for the tree structure.</span><o:p></o:p></li></ul><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'> </span><o:p></o:p></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'>So, either the stack underflows (because of the recursion is too deep) or the heap overflows or both.</span><o:p></o:p></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'> </span><o:p></o:p></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'>Let’s look at the stack: the recursion depth of Insert varies depending on the values generated by Rand(). I played a little with different start values of seed and found the recursion depth varies between 20 and 27. Nothing to be worried about. Stack underflow is not going to happen.</span><o:p></o:p></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'> </span><o:p></o:p></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'>Let’s look at the heap: How many times CreateNode is called, depends on the values generated by Rand(). Generally a “node” uses 12 bytes, but the smallest allocation granularity on the heap is 32 bytes </span><span lang=EN-US style='font-family:Wingdings;mso-fareast-language:EN-US'>à</span><span lang=EN-US style='mso-fareast-language:EN-US'> every call to CreateNode needs 32 bytes on the heap.</span><o:p></o:p></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'> </span><o:p></o:p></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'>With DIV 65535 in the random number generator, CreateNode is - by luck - only called 767 times = 24.5 kB. As Time() repeats Trees() 10 times, we’ll need overall 245 kB of heap space. Trees() terminates happily.</span><o:p></o:p></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'>With DIV 65536, CreateNode is called 4999 times = 160 kB. After 2 iterations in Time(), the available heap is exhausted.</span><o:p></o:p></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'> </span><o:p></o:p></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'>One remark, even if you use DIV 65535 you can’t call Hennessy.Do several times, as the garbage collector can not do it’s job. Reason for this is that “tree” is not set to NIL. If you want to improve Trees a little, put “tree := NIL” at the end of Trees(). But this does not help in case of DIV 65536.</span><o:p></o:p></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'> </span><o:p></o:p></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'>br</span><o:p></o:p></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'>Jörg</span><o:p></o:p></p><p class=MsoNormal><span lang=EN-US style='mso-fareast-language:EN-US'> </span><o:p></o:p></p><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal><b><span style='font-size:12.0pt;color:black'>Von: </span></b><span style='font-size:12.0pt;color:black'>Oberon <oberon-bounces@lists.inf.ethz.ch> im Auftrag von Hans Klaver <hklaver@dds.nl><br><b>Antworten an: </b>ETH Oberon and related systems <oberon@lists.inf.ethz.ch><br><b>Datum: </b>Freitag, 10. April 2020 um 01:18<br><b>An: </b>ETH Oberon and related systems <oberon@lists.inf.ethz.ch><br><b>Betreff: </b>Re: [Oberon] ... MOD 65536</span><o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal>Jörg, you wrote:<o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><p class=MsoNormal>Just take the well-proven random generator.<br>Below I inserted my version in Oberon-07<o:p></o:p></p></blockquote></div><div><p class=MsoNormal> <o:p></o:p></p></div><p class=MsoNormal>Thanks for the suggestion.<o:p></o:p></p><div><p class=MsoNormal> <o:p></o:p></p><div><p class=MsoNormal>The Lehmer-Schrage RN generator from the Reiser-Wirth book (with your prime number modification of the a constant!) has been in my Oberon-07 library for some time already (see <a href="https://github.com/hansklav/Oberon-07/blob/master/Random.Mod">https://github.com/hansklav/Oberon-07/blob/master/Random.Mod</a>).<o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal>But in the case of the Hennessy benchmarks I would regard it as a form of 'cheating' to use another function than the one that is part of the benchmark, because the most pure comparisons are only possible if the same list of random numbers is used in each implementation, even if the random function is not perfect.<o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal>Now I suspect the crash of the Oberon System V5 described by me is caused by some external code used by Peter de Wachter's RISC emulator, because only now I noticed that the following error message is shown on the command line where I started the emulator: <o:p></o:p></p></div><div><p class=MsoNormal><span style='font-family:"Andale Mono";color:#F2F2F2;background:black'>Assertion failed: (data && data_ptr < data_len), function clipboard_data_write, file src/sdl-clipboard.c, line 78.</span><o:p></o:p></p><div><p class=MsoNormal style='background:black'><span style='font-family:"Andale Mono";color:#F2F2F2'>Abort trap: 6</span><o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal>Maybe it is even specific to the macOS version of SDL2 (I use the RISC emulator under macOS).<o:p></o:p></p></div><div><p class=MsoNormal>I have never used the clipboard function of the RISC emulator.<o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal>Again: the OBNC Oberon-07 compiler has no problem with the Rand function as it should be, and OBNC also uses the SDL2 library for certain functionality, but probably not this particular function.<o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal>--<o:p></o:p></p></div><div><p class=MsoNormal>Hans Klaver<o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div></div></div><p class=MsoNormal>-- Oberon@lists.inf.ethz.ch mailing list for ETH Oberon and related systems https://lists.inf.ethz.ch/mailman/listinfo/oberon <o:p></o:p></p><p class=MsoNormal>-- Oberon@lists.inf.ethz.ch mailing list for ETH Oberon and related systems https://lists.inf.ethz.ch/mailman/listinfo/oberon <o:p></o:p></p></div></body></html>