I will try flvectors and unsafe references (they already use unsafe fixed/float arithmetic operations) in some of the internal states with significant loops - Chebyshev approximations (which are used by most of the special functions) and the differential equation solver - and see if it makes any difference.<br>
<br>Wanting the fl64vectors in scheme/flonum was due to my flawed mental model. I will use flvectors internally.<br><br>Thanks to you and Noel for helping.<br><br>Doug<br><br><div class="gmail_quote">On Mon, May 17, 2010 at 6:33 AM, Matthew Flatt <span dir="ltr">&lt;<a href="mailto:mflatt@cs.utah.edu">mflatt@cs.utah.edu</a>&gt;</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;"><div class="im">At Sun, 16 May 2010 21:22:09 -0600, Doug Williams wrote:<br>
&gt; I am updating the science collection to release shortly after the release of<br>
&gt; Racket. One thing I am doing is using the expanded set of unsafe operations<br>
&gt; where practical - I was only using the basic operations before. When I<br>
&gt; started using the original unsafe operations, I looked into using flvectors<br>
&gt; for some internal data structures, but they turned out to be less efficient<br>
&gt; at the time than regular vectors (that happen to contain floats).<br>
&gt;<br>
&gt; 1) Would we expect the flvector (or fl64vector) implementations to be more<br>
&gt; efficient now? Or, at sometime in the (near) future?<br>
<br>
</div>In the general case, a number has to be boxed every time that it is<br>
extracted from an flvector or f64vector. If the value is immediately<br>
consumed by flonum operation, then the value doesn&#39;t have to be boxed,<br>
and that&#39;s where performance improvements can kick in. Otherwise, if<br>
the number usually has to be boxed after extracting it from an<br>
flvector, then flvectors can be less efficient than plain vectors<br>
(which hold numbers that are already boxed).<br>
<div class="im"><br>
&gt; 2) I assume flvectors are 32-bit floats and fl64vectors are 64-bit floats.<br>
&gt; Is this correct? Is there any significant difference in efficiency of one<br>
&gt; over the other - particularly wrt unsafe operations?<br>
<br>
</div>Noel covered this one: both flvectors and f64vectors both store 64-bit<br>
floats, and the difference is an indirection on the array as a whole.<br>
<br>
For working with foreign libraries, f64vectors are usually better,<br>
while flvectors can be slightly more efficient when staying in Racket<br>
code with flonum-specific operations. Having both flvectors and<br>
f64vectors gives a programmer control over the trade off, though it is<br>
somewhat confusing.<br>
<div class="im"><br>
&gt; 3) Would it be possible for scheme/flonum to export fl64vectors as well as<br>
&gt; flvectors - instead of directly requiring scheme/foreign?<br>
<br>
</div>That would make sense if flvector and f64vector stored different kinds<br>
of values. Since f64vector is mainly for foreign interoperability,<br>
though, I think that it&#39;s best to keep it in the FFI libraries.<br>
<br>
Probably not relevant, but just in case: If you&#39;re using the latest, we<br>
didn&#39;t simply move `scheme/foreign&#39; to `racket/foreign&#39;. The<br>
`scheme/foreign&#39; library still exists, but it&#39;s a compatibility wrapper<br>
for the new organization, where `f64vector&#39; is provided by the safe<br>
library `ffi/vector&#39;.<br>
<br>
</blockquote></div><br>