Sumant,<br><br>I think this has something to do with the initial contents<br>(time (type-of (make-foreign-array 'double-float :dimensions '(1024 1024))))<br>Evaluation took:<br>  0.001 seconds of real time<br>  0.000000 seconds of total run time (0.000000 user, 0.000000 system)<br>

  0.00% CPU<br>  341,884 processor cycles<br>  0 bytes consed<br>  <br>MATRIX-DOUBLE-FLOAT<br>Seems pretty snappy.  Generally, I'm not too happy with the idea of setting values from a list, at least for large lists.  I tried to find an alternate way to do this, but I also wanted to mimic the arguments to make-array, so that's why it's in there.   I presume that your test is contrived and that you wouldn't really make a list of 1 million elements and then load it into a foreign array.  Can you try a problem where you're not using :initial-contents?  If you don't like to make an array with indeterminate contents, try this:<br>

<br>(time (type-of (map-grid :source '* :source-dims '(1024 1024) :destination-specification '((foreign-array 1024 1024) double-float))))<br>Evaluation took:<br>  2.487 seconds of real time<br>  2.490000 seconds of total run time (2.490000 user, 0.000000 system)<br>

  [ Run times consist of 0.220 seconds GC time, and 2.270 seconds non-GC time. ]<br>  100.12% CPU<br>  5,292,435,364 processor cycles<br>  268,462,848 bytes consed<br>  <br>MATRIX-DOUBLE-FLOAT<br><br>(By the way, all make-foreign-array does is call make-grid,  i.e., it's less "direct" than make-grid.) <br>

<br>Liam<br><br><div class="gmail_quote">On Wed, Apr 27, 2011 at 9:31 AM, Sumant Oemrawsingh <span dir="ltr"><<a href="mailto:soemraws@xs4all.nl">soemraws@xs4all.nl</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

Hi,<br>
<br>
I ran into a problem making foreign arrays. I have a two lists of<br>
lists of floats called *data-50* and *data-1024*, which are to be used<br>
as the initial contents of a matrix (first is 50x50, second<br>
1024x1024). I do the following:<br>
<br>
CL-USER> (time (type-of (make-grid '((array) single-float) :initial-contents *data-50*)))<br>
Evaluation took:<br>
  0.000 seconds of real time<br>
  0.000000 seconds of total run time (0.000000 user, 0.000000 system)<br>
  100.00% CPU<br>
  228,096 processor cycles<br>
  27,744 bytes consed<br>
<br>
(SIMPLE-ARRAY SINGLE-FLOAT (50 50))<br>
CL-USER> (time (type-of (make-grid '((foreign-array) single-float) :initial-contents *data-50*)))<br>
Evaluation took:<br>
  0.036 seconds of real time<br>
  0.026995 seconds of total run time (0.026995 user, 0.000000 system)<br>
  75.00% CPU<br>
  79,104,003 processor cycles<br>
  294,688 bytes consed<br>
<br>
MATRIX-SINGLE-FLOAT<br>
<br>
<br>
With a 50x50 array, everything works out fine. However, when moving to<br>
the 1024x1024 data:<br>
<br>
<br>
CL-USER> (time (type-of (make-grid '((array) single-float) :initial-contents *data-1024*)))<br>
Evaluation took:<br>
  0.036 seconds of real time<br>
  0.035995 seconds of total run time (0.034995 user, 0.001000 system)<br>
  100.00% CPU<br>
  80,301,650 processor cycles<br>
  4,194,320 bytes consed<br>
<br>
(SIMPLE-ARRAY SINGLE-FLOAT (1024 1024))<br>
CL-USER> (time (type-of (make-grid '((foreign-array) single-float) :initial-contents *data-1024*)))<br>
Evaluation took:<br>
  686.167 seconds of real time<br>
  683.878034 seconds of total run time (683.608075 user, 0.269959 system)<br>
  [ Run times consist of 0.196 seconds GC time, and 683.683 seconds non-GC time. ]<br>
  99.67% CPU<br>
  3 forms interpreted<br>
  1,502,208,488,440 processor cycles<br>
  59,838,352 bytes consed<br>
<br>
  before it was aborted by a non-local transfer of control.<br>
<br>
; Evaluation aborted on NIL.<br>
<br>
<br>
After over 10 minutes of intensive work, I gave up and aborted. When<br>
using make-foreign-array directly, instead of make-grid, I get the<br>
same problem. I would understand that foreign arrays take a bit more<br>
time to make; in the *data-50* example, about an order of magnitude<br>
more bytes were consed to make the foreign array (and needing more<br>
processor cycles).<br>
<br>
While this is not very thorough, I would expect there to be some<br>
linear relation between the array size and the time it<br>
takes. E.g. 50x50 foreign array takes less than a 0.1 second, so I<br>
would expect 1024x1024 to take less than 42.0 seconds. While that is<br>
still a long time for a normal-sized array, clearly, this is not the<br>
case. I can run some more tests later to find out where the problem<br>
lies. Or is this a known bug or limitation for foreign arrays and<br>
sbcl? Or am I just doing something wrong here?<br>
<br>
Thanks,<br>
Sumant<br>
<font color="#888888"><br>
--<br>
Sumant Oemrawsingh<br>
<br>
_______________________________________________<br>
GSLL-devel mailing list<br>
<a href="mailto:GSLL-devel@common-lisp.net">GSLL-devel@common-lisp.net</a><br>
<a href="http://common-lisp.net/cgi-bin/mailman/listinfo/gsll-devel" target="_blank">http://common-lisp.net/cgi-bin/mailman/listinfo/gsll-devel</a><br>
</font></blockquote></div><br>