Thanks a ton for the worked out example!<br><br>I had a similar problem with gfortran, and it only appeared with large array sizes (bigger than 4000x4000 as I recall).  "ulimit" was no help, I assume there's a memory constraint built in somewhere.  (as an aside, I once ran into a similar problem with perl - the release on linux would only allow 200MB array sizes, but the version available on a sun machine would allow GB of array sizes)<br>
<br><div class="gmail_quote">On Fri, Nov 21, 2008 at 6:36 AM, Bill Broadley <span dir="ltr"><<a href="mailto:bill@cse.ucdavis.edu">bill@cse.ucdavis.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Fortran isn't one of my better languages, but I did manage to tweak your code<br>
into something that I believe works the same and is openMP friendly.<br>
<br>
I put a copy at:<br>
    <a href="http://cse.ucdavis.edu/bill/OMPdemo.f" target="_blank">http://cse.ucdavis.edu/bill/OMPdemo.f</a><br>
<br>
When I used the pathscale compiler on your code it said:<br>
"told.f", line 27: Warning: Referenced scalar variable OLD_V is SHARED by default<br>
"told.f", line 29: Warning: Referenced scalar variable DV is SHARED by default<br>
"told.f", line 31: Warning: Referenced scalar variable CONVERGED is SHARED by<br>
default<br>
<br>
I rewrote your code to get rid of those, I didn't know some of the constants<br>
you mentioned dy and Ly.  So I just wrote my own initialization.  I skipped<br>
the boundary conditions by just restricting the start and end of the loops.<br>
<br>
Your code seemed to be interpolating between the current iteration (i-1 and<br>
j-1) and the last iteration (i+1 and j+1).  Not sure if that was intentional<br>
or not.  In any case I just processed the array v into v2, then if it didn't<br>
converge I processed the v2 array back into v.  To make each loop independent<br>
I made converge a 1D array which stored the sum of that row's error.  Then<br>
after each array was processed I walked the 1-d array to see if we had<br>
converged.  I exit when all pixels are below the convergence value.<br>
<br>
It scales rather well on a dual socket barcelona (amd quad core), my version<br>
iterates a 1000x1000 array with a range of values from 0-200 over 1214<br>
iterations to within a convergence of 0.02.<br>
<br>
CPUs time Scaling<br>
=================<br>
1    54.51<br>
2    27.75 1.96 faster<br>
4    14.14 3.85 faster<br>
8     7.75 7.03 faster<br>
<br>
Hopefully my code is doing what you intended.<br>
<br>
Alas, with gfortran (4.3.1 or 4.3.2), I get a segmentation fault as soon as I<br>
run.  Same if I compile with -g and run it under the debugger.  I'm probably<br>
doing something stupid.<br>
<br>
</blockquote></div><br><br clear="all"><br>-- <br>- - - - - - -   - - - - - - -   - - - - - - - <br>Nathan Moore<br>Assistant Professor, Physics<br>Winona State University<br>AIM: nmoorewsu <br>- - - - - - -   - - - - - - -   - - - - - - -<br>