More intelligent would be to utilize the inference code automatically compute which variables have limited scope and can be allocated on the stack
On Monday, July 28, 2014, Stefan Karpinski <[email protected]> wrote: > Local variables often don't really have an address. You have to emulate > something like a C volatile variable. It's possible but not trivial. > > > On Mon, Jul 28, 2014 at 2:13 PM, Ivar Nesje <[email protected] > <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote: > >> Can someone remind me why we can't give the address of a Float64 on the >> stack to such a function? >> >> Ivar >> >> kl. 19:04:30 UTC+2 mandag 28. juli 2014 skrev Kevin Squire følgende: >>> >>> That wouldn't be thread safe, which isn't a worry right now, but might >>> be in the near future. >>> >>> >>> On Mon, Jul 28, 2014 at 10:02 AM, Simon Kornblith <[email protected]> >>> wrote: >>> >>>> Presumably we could use the same global or let-scoped array rather than >>>> allocating a new array on each call. >>>> >>>> >>>> On Monday, July 28, 2014 11:39:44 AM UTC-4, Simon Byrne wrote: >>>>> >>>>> Yes, I would agree: as Elliot mentioned, you might get some gain by >>>>> only doing the range-reduction once. >>>>> >>>>> Looking at the source of openlibm/src/s_sincos.c, it seems that's what >>>>> it does, as well as calculating z = x*x and w= z*z once... >>>>> >>>>> Is there a more efficient way to get return reference values than >>>>> using arrays? >>>>> >>>>> >>>>> On Monday, 28 July 2014 16:29:05 UTC+1, Stuart Brorson wrote: >>>>>> >>>>>> Yup, you certainly don't want to use CORDIC. My e-mail is just a >>>>>> historical note. >>>>>> >>>>>> The standard (fdlibm) implementation of sin & cos involves >>>>>> summing a polynomial with 6 or 8 coefficients (after folding down to >>>>>> the first quadrant). Here's the kernel: >>>>>> >>>>>> http://www.netlib.org/fdlibm/k_sin.c >>>>>> >>>>>> This impl seems pretty quick, IMO. I'd wager that >>>>>> there's probably not much room for improvement over the existing, >>>>>> separate implementations. >>>>>> >>>>>> Stuart >>>>>> >>>>>> >>>>>> On Mon, 28 Jul 2014, Stefan Karpinski wrote: >>>>>> >>>>>> > This CORDIC explanation seems quite plausible. However, it seems >>>>>> like we >>>>>> > probably don't want to use this algorithm, which means that we're >>>>>> not at >>>>>> > this point able to get any kind of speedup for sincos(x) relative >>>>>> to >>>>>> > sin(x), cos(x). >>>>>> > >>>>>> > >>>>>> > On Mon, Jul 28, 2014 at 10:13 AM, Stuart Brorson <[email protected]> >>>>>> wrote: >>>>>> > >>>>>> >> A bell rang in the back of my head as I was on my way to work this >>>>>> >> morning. I was thinking about sincos again, and remembered >>>>>> something >>>>>> >> about CORDIC algorithms from the distant past. These are add and >>>>>> >> shift algorithms used to compute certain trig and other elementary >>>>>> >> functions. They were very popular for scientific calculators back >>>>>> when >>>>>> >> hand-held calculators were new since they are easily implementable >>>>>> in >>>>>> >> hardware, and don't require floating point multiply. A couple of >>>>>> >> references: >>>>>> >> >>>>>> >> http://en.wikipedia.org/wiki/CORDIC >>>>>> >> http://ww1.microchip.com/downloads/en/AppNotes/01061A.pdf >>>>>> >> >>>>>> >> It appears that a common CORDIC computation will product sin & cos >>>>>> >> together. I'll bet dollars to doughnuts (without actually >>>>>> knowing) >>>>>> >> that the x87 assembly instruction mentioned below was doing a >>>>>> CORDIC >>>>>> >> computation, and it made sense to return both sin & cos since >>>>>> >> they were computed together. >>>>>> >> >>>>>> >> The paper by Jeannerod & JourdanLu refer to CORDIC methods, but is >>>>>> >> apparently an extension, as far as I can tell. >>>>>> >> >>>>>> >> Stuart >>>>>> >> >>>>>> >> >>>>>> >> >>>>>> >> >>>>>> >> On Mon, 28 Jul 2014, Simon Byrne wrote: >>>>>> >> >>>>>> >> I've often wondered this myself. As I understand it, the purpose >>>>>> of the >>>>>> >>> sincos function was to call the FSINCOS assembly instruction for >>>>>> x87 FPU. >>>>>> >>> On modern processors however, it is generally acknowledged that >>>>>> calling a >>>>>> >>> well-written math library compiled to use SSE instructions is >>>>>> typically >>>>>> >>> faster (and can be more accurate) than using x87 trig >>>>>> instructions. See >>>>>> >>> this discussion: >>>>>> >>> http://stackoverflow.com/questions/12485190/calling- >>>>>> >>> fsincos-instruction-in-llvm-slower-than-calling-libc-sin-cos-functions >>>>>> >>>>>> >>> >>>>>> >>> Calling sincos using Isaiah's method seems to be about 9 times >>>>>> slower than >>>>>> >>> calling the sin and cos separately: >>>>>> >>> https://gist.github.com/734dcacde1f107397b3b.git >>>>>> >>> though a lot of this seems to be due to the overhead in creating >>>>>> and >>>>>> >>> destroying the arrays for return values. >>>>>> >>> >>>>>> >>> >>>>>> >>> On Monday, 28 July 2014 13:34:53 UTC+1, Kevin Squire wrote: >>>>>> >>> >>>>>> >>>> >>>>>> >>>> This paper seems relevant, though possibly only for 32-bit: >>>>>> >>>> >>>>>> >>>> >>>>>> >>>> http://hal.archives-ouvertes.fr/docs/00/67/23/27/PDF/ >>>>>> >>>> Jeannerod-JourdanLu.pdf >>>>>> >>>> >>>>>> >>>> Cheers, >>>>>> >>>> Kevin >>>>>> >>>> >>>>>> >>>> On Monday, July 28, 2014, Stuart Brorson <[email protected] >>>>>> <javascript:>> >>>>>> >>>> >>>>>> >>>> wrote: >>>>>> >>>> >>>>>> >>>> On Sun, 27 Jul 2014, Viral Shah wrote: >>>>>> >>>>> >>>>>> >>>>> Is sincos a standard libm function? >>>>>> >>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>> Out of curiosity I looked into sincos since I had never heard >>>>>> of it. >>>>>> >>>>> A quick check shows there's no sincos in fdlibm >>>>>> >>>>> (on netlib). However, a little Googling reveals an old Sun >>>>>> math >>>>>> >>>>> library libsunmath seems to implement it. >>>>>> >>>>> >>>>>> >>>>> I did find a couple of libm variants which implemented sincos. >>>>>> >>>>> However, they simply called sin & cos separately. As Stephan >>>>>> says >>>>>> >>>>> upthread, no performance improvement. >>>>>> >>>>> >>>>>> >>>>> As far as I know, sin & cos are usually computed using mod to >>>>>> fold >>>>>> >>>>> the input x down to the first quadrant, and then using a power >>>>>> series >>>>>> >>>>> (needs only 6 or 8 terms IIRC) to compute the function. >>>>>> Perhaps >>>>>> >>>>> libsunmath computed e.g. cos first, and then did sin = sqrt(1 - >>>>>> >>>>> cos^2)? Taking the sqrt seems non-performant compared to >>>>>> evaluating a >>>>>> >>>>> short power series, but maybe they had a reason? Another >>>>>> thought: sin >>>>>> >>>>> and cos are reflections of each other (over the line x = pi/4) >>>>>> in the >>>>>> >>>>> first quadrant. Perhaps there some other clever way to get sin >>>>>> from >>>>>> >>>>> cos? I couldn't think if any in the short time I spent >>>>>> considering >>>>>> >>>>> it. >>>>>> >>>>> >>>>>> >>>>> Stuart >>>>>> >>>>> >>>>>> >>>>> >>>>>> >>>>> On Sun, 27 Jul 2014, Viral Shah wrote: >>>>>> >>>>> >>>>>> >>>>> Is sincos a standard libm function? >>>>>> >>>>> >>>>>> >>>>>> >>>>>> >>>>>> Also, I wonder if creating the one entry array is too >>>>>> expensive, and if >>>>>> >>>>>> we >>>>>> >>>>>> should just call sin and cos separately. The vectorized >>>>>> version may be >>>>>> >>>>>> able >>>>>> >>>>>> to benefit from calling sincos directly. >>>>>> >>>>>> >>>>>> >>>>>> -viral >>>>>> >>>>>> >>>>>> >>>>>> On Monday, July 28, 2014 1:02:06 AM UTC+5:30, Isaiah wrote: >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>>> It doesn't appear to be wrapped, but you can call it yourself >>>>>> like >>>>>> >>>>>>> this: >>>>>> >>>>>>> >>>>>> >>>>>>> julia> sincos(x) = begin psin = Cdouble[0]; pcos = >>>>>> Cdouble[0]; >>>>>> >>>>>>> ccall(:sincos, Void, (Cdouble, Ptr{Cdouble}, Ptr{Cdouble}), >>>>>> x, psin, >>>>>> >>>>>>> pcos); >>>>>> >>>>>>> (psin[1], pcos[1]); end >>>>>> >>>>>>> sincos (generic function with 1 method) >>>>>> >>>>>>> >>>>>> >>>>>>> julia> sincos(pi) >>>>>> >>>>>>> (1.2246467991473532e-16,-1.0) >>>>>> >>>>>>> >>>>>> >>>>>>> Feel free to open an issue or pull request if you think it >>>>>> should be >>>>>> >>>>>>> exported - might have just been an oversight. >>>>>> >>>>>>> >>>>>> >>>>>>> >>>>>> >>>>>>> On Sun, Jul 27, 2014 at 3:25 PM, Ken B <[email protected]> >>>>>> >>>>>> >>>>>>> wrote: >>>>>> >>>>>>> >>>>>> >>>>>>> Hi, >>>>>> >>>>>>> >>>>>> >>>>>>>> >>>>>> >>>>>>>> I want to calculated sine and cosine together of the same >>>>>> angle. I >>>>>> >>>>>>>> saw >>>>>> >>>>>>>> this function is implemented in openlibm, but is it >>>>>> available in >>>>>> >>>>>>>> julia >>>>>> >>>>>>>> and >>>>>> >>>>>>>> how? >>>>>> >>>>>>>> >>>>>> >>>>>>>> >>>>>> >>>>>>>> https://github.com/JuliaLang/openlibm/blob/ >>>>>> >>>>>>>> 18f475de56ec7b478b9220a5f28eb9a23cb51d96/src/s_sincos.c >>>>>> >>>>>>>> >>>>>> >>>>>>>> Thanks! >>>>>> >>>>>>>> Ken >>>>>> >>>>>>>> >>>>>> >>>>>>>> >>>>>> >>>>>>>> >>>>>> >>>>>>> >>>>>> >>>>>>> >>>>>> > >>>>>> >>>>> >>> >
