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 GTX

i 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

Reply via email to