Dear Алексей, On Fri, 08 Jul 2011 10:33:04 +0400, Алексей Гурин wrote:
06 июля 2011, 07:17 от Алексей Гурин:When i try to pass double precision argument in this code ########################## import pycuda.autoinit import pycuda.driver as drv import numpy as np from pycuda.compiler import SourceModule mod = SourceModule(""" __global__ void someFunc(double *array,double var,int N) { int i = blockIdx.x*blockDim.x + threadIdx.x; if (i < N) { array[i] = var; } } """,arch="sm_13") (snip) ########################## i get incorrect output [ 2.12204896e-310 2.12204896e-310 2.12204896e-310 ..., 2.12204896e-310 2.12204896e-310 2.12204896e-310] when expected [ 10. 10. 10. ..., 10. 10. 10.] i tried this on pycuda 2011.1.1 and pycuda 2011.1.2 on GeForce GTXi solved it somehow. When i pass arguments of different sizes like double = 8 bytes, int = 4 bytes and pointer to double = 4 bytes, size in bytes of all args before double must be a multiple of 8 for example: double*,double,int - incorrect result double*,int,double - correct double*,int,int,double - incorrect if i put all 8 byte arguments before 4 byte ones it also works correctly
What kind of system are you on? (OS, Bitness, ...) What seems to be the case is that Python's struct module and nvcc disagree about alignment on your system. That's nasty. Unfortunately, I can't seem to provoke a similar bug on my 64-bit Linux system.
Andreas _______________________________________________ PyCUDA mailing list [email protected] http://lists.tiker.net/listinfo/pycuda
