Received from Hugh Owens on Sun, Feb 12, 2012 at 05:41:40PM EST: > Hello, > > I recently began a project using PyCUDA and I'm encountering some > strange behavior that I cannot figure out the source of. Before I > continue, I will preface this with a big disclaimer: I'm not a > particularly good C/C++ programmer, and it's possible the heart of > matter is just that. That said, my problem is as follows: > > Floats returned from the GPU are just... not the values they should > be. This problem arose in the process of writing a much more > complicated routine, but I've been able to duplicate it in the minimal > example below. > > > import numpy as np > import pycuda.driver as drv > import pycuda.autoinit > from pycuda.compiler import SourceModule > > > mod = SourceModule( > """ > __global__ void min_example(float *a, float b) > { > const int i = threadIdx.x; > a[i] = b; > } > """ > ) > > example = mod.get_function("min_example") > aa = np.ones(512) > example(drv.InOut(aa),np.float32(1.0),block = (512,1,1)) > print aa[0] #Prints 0.0078125. What? > > In the case shown, rather than 1.0, the array contains "0.0078125" > after running the kernel. Oddly enough, for b = 2.0, the output is > actually correct, or correct enough, "2.00000047684". For 3.0, I get > something like 32, for 4.0, "512.000123024", and for 5.0, 2048ish. > Now, I do see a pattern here, but what's causing it is really beyond > me. Any help would be tremendously appreciated. > > Thanks, > > Hugh Owens
In your code above, aa contains double precision floats while your kernel operates on single precision floats. Try making the following change: aa = np.ones(512, dtype=np.float32) L.G. _______________________________________________ PyCUDA mailing list PyCUDA@tiker.net http://lists.tiker.net/listinfo/pycuda