Hi Dirk,
Sorry, I guess I missed the latter part of your question. Actually this is
probably related to a bug I notice earlier. I believe that it has been
fixed in the latest git version.
Check to see if the cosine and sine components are swapped in
{pycuda}/pycuda/cuda/pycuda-complex-impl.hpp
It should look like:
static complex<_Tp> expT(const complex<_Tp>& z) {
  _Tp expx = ::exp(z._M_re);
  _Tp s, c;
  ::sincos(z._M_im, &s, &c);
  return complex<_Tp>(expx * c, expx * s);
}
Good luck,
Craig


>
> Message: 3
> Date: Fri, 21 Feb 2014 12:47:26 +0100
> From: Dirk Boonzajer Flaes <[email protected]>
> To: <[email protected]>
> Subject: Re: [PyCUDA] PyCUDA Digest, Vol 68, Issue 4
> Message-ID: <[email protected]>
> Content-Type: text/plain; charset="utf-8"; Format="flowed"
>
> Dear Craig,
>
>   If this would be the problem would be, the second two tests would
> return false also.
>
> Take a look at the last part of the code:
>
>      ....
>       # .. but the imaginary part and the real part are just swapped
>       print "Imag and real swapped 1: " ,
>       np.all(g_random_complex.get().imag - random_complex.real < 1e-12)
>       print "Imag and real swapped 2: " ,
>       np.all(g_random_complex.get().real - random_complex.imag < 1e-12)
>
> This would return false if the treshold were the problem, however it
> returns true.
>
> I found out that
>
> np.exp(1j*x) = cumath.exp(1j*(pi/2-x)) for all x.
>
> So I suspect that this is a bug in cuda. Am I right?
>
> regards,
>
> Dirk
>
> On 20-02-14 21:38, Craig Stringham wrote:
> > The GPU uses single precision by default, so you need to use a higher
> > threshold 1e-7 works.
> > Craig
> >
> >
> > On Thu, Feb 20, 2014 at 10:00 AM, <[email protected]
> > <mailto:[email protected]>> wrote:
> >
> >     Send PyCUDA mailing list submissions to
> >     [email protected] <mailto:[email protected]>
> >
> >     To subscribe or unsubscribe via the World Wide Web, visit
> >     http://lists.tiker.net/listinfo/pycuda
> >     or, via email, send a message with subject or body 'help' to
> >     [email protected] <mailto:[email protected]>
> >
> >     You can reach the person managing the list at
> >     [email protected] <mailto:[email protected]>
> >
> >     When replying, please edit your Subject line so it is more specific
> >     than "Re: Contents of PyCUDA digest..."
> >
> >
> >     Today's Topics:
> >
> >        1. strange behaviour of cumath.exp (Dirk Boonzajer Flaes)
> >
> >
> >
> ----------------------------------------------------------------------
> >
> >     Message: 1
> >     Date: Thu, 20 Feb 2014 17:31:36 +0100
> >     From: Dirk Boonzajer Flaes <[email protected]
> >     <mailto:[email protected]>>
> >     To: <[email protected] <mailto:[email protected]>>
> >     Subject: [PyCUDA] strange behaviour of cumath.exp
> >     Message-ID: <[email protected] <mailto:[email protected]>>
> >     Content-Type: text/plain; charset="iso-8859-1"; Format="flowed"
> >
> >     Hi All!
> >
> >     I am quite new to GPU programming, but I found some strange
> >     behaviour in
> >     the cumath.exp function. Maybe it is well known, but to me it
> >     seems that
> >     the real and imaginary part are swapped. Consider the following code:
> >
> >
> >          import pycuda.gpuarray as gpuarray
> >          import pycuda.autoinit
> >          import pycuda.cumath as cumath
> >          import numpy as np
> >
> >          # create some random numbers in the complex plane
> >          random_reals = np.random.rand(100,100)
> >          random_complex = np.exp(1j*random_reals)
> >
> >          # use the same random numbers, but compute the complex numbers
> on
> >     the GPU
> >          g_random_reals = gpuarray.to_gpu(random_reals)
> >          g_random_complex = cumath.exp(1.j*g_random_reals)
> >
> >          # it seems that the two arrays are not equal
> >          print "Equal: " , np.all(g_random_complex.get().real -
> >     random_complex.real < 1e-12)
> >
> >          # .. but the imaginary part and the real part are just swapped
> >          print "Imag and real swapped 1: " ,
> >     np.all(g_random_complex.get().imag - random_complex.real < 1e-12)
> >          print "Imag and real swapped 2: " ,
> >     np.all(g_random_complex.get().real - random_complex.imag < 1e-12)
> >
> >     prints
> >
> >     Equal:  False
> >     Imag and real swapped 1:  True
> >     Imag and real swapped 2:  True
> >
> >
> >
> >
> >     Is this indeed a bug? Or am I just missing something?
> >
> >     regards,
> >
> >     Dirk
> >     -------------- next part --------------
> >     An HTML attachment was scrubbed...
> >     URL:
> >     <
> http://lists.tiker.net/pipermail/pycuda/attachments/20140220/958e5bb3/attachment-0001.html
> >
> >
> >     ------------------------------
> >
> >     Subject: Digest Footer
> >
> >     _______________________________________________
> >     PyCUDA mailing list
> >     [email protected] <mailto:[email protected]>
> >     http://lists.tiker.net/listinfo/pycuda
> >
> >
> >     ------------------------------
> >
> >     End of PyCUDA Digest, Vol 68, Issue 4
> >     *************************************
> >
> >
>
> -------------- next part --------------
> An HTML attachment was scrubbed...
> URL: <
> http://lists.tiker.net/pipermail/pycuda/attachments/20140221/671ff18d/attachment-0001.html
> >
>
> ------------------------------
>
> Subject: Digest Footer
>
> _______________________________________________
> PyCUDA mailing list
> [email protected]
> http://lists.tiker.net/listinfo/pycuda
>
>
> ------------------------------
>
> End of PyCUDA Digest, Vol 68, Issue 5
> *************************************
>
_______________________________________________
PyCUDA mailing list
[email protected]
http://lists.tiker.net/listinfo/pycuda

Reply via email to