Hi Per,

Though this may be bit off topic with regards to implementation. This paper
actually implemented a neural netwtork on a GPU (using CUBLAS i believe)
http://www.iiit.net/techreports/2008_109.pdf .

thanks
Siddharth

On Mon, May 11, 2009 at 2:21 AM, Andreas Klöckner
<[email protected]>wrote:

> You're a bit confused about whether you're passing in a *pointer* to an
> array
> or the actual array data. The C struct says pointer to, your packing code
> says
> inlined array.
>
> I'd suggest checking out numpy record arrays.
>
> Andreas
>
> On Sonntag 10 Mai 2009, Per B. Sederberg wrote:
> > Hi Folks:
> >
> > I'm working on simulating a simple neural network model on the GPU.
> > In my case, I should see benefits from performing many simulations of
> > the simple model at once across threads instead of parallelizing
> > individual simulations because the neural network is so small.
> >
> > I'd like to pass a struct with arrays containing parameters and
> > initialization information for the neural network and also a place to
> > put results.  This is only to keep the code clean (otherwise I'll be
> > passing in handfuls of parameters to the kernel.)  I have had full
> > success passing in separate parameters, but have failed to pass the
> > struct, getting launch failed errors at various stages of the process
> > (sometimes when allocating memory and sometimes with trying to read it
> > off the device.)
> >
> > I've included a simplified example below.  I realize the class to
> > handle talking to the C struct is a bit crazy, but if it worked I
> > could clean it up into a more general class.
> >
> > Is there any clue as to what is wrong or is there a better way to
> > accomplish what I'm trying to do?  I'm pretty new to pycuda and cuda,
> > so I won't be offended at all if you give me drastically different
> > suggestions of what to do or if you point out a ridiculous error that
> > I'm making ;)
> >
> > Thanks,
> > Per
> >
> > PS-> I'm using a git clone of pycuda from about a week ago and version
> > 2.1 of CUDA libs on a GTX285.
> >
> > struct_test.py (also attached, but in case no attachments are allowed):
> > ------------------
> >
> > import pycuda.driver as cuda
> > import pycuda.autoinit
> > from pycuda.compiler import SourceModule
> >
> > import numpy as np
> >
> > mod = SourceModule(
> >     """
> >
> > struct results
> > {
> >   unsigned int n;
> >   float *A;
> >   float *B;
> > };
> >
> > __global__ void struct_test(results *res)
> > {
> >   unsigned int i;
> >   for (i=0; i<res->n; i++)
> >   {
> >     res->A[i] = res->B[i] + 1;
> >   }
> > }
> >
> >     """)
> >
> >
> > cu_struct = mod.get_function("struct_test")
> >
> > class Results(object):
> >     def __init__(self, n=10):
> >         self._cptr = None
> >         self.n = np.uint32(n)
> >         self.A = np.zeros(self.n,dtype=np.float32)
> >         self.B = np.ones(self.n,dtype=np.float32)
> >     def send_to_gpu(self):
> >         if self._cptr is None:
> >             self._cptr = cuda.mem_alloc(self.nbytes())
> >         cuda.memcpy_htod(self._cptr, self.pack())
> >     def get_from_gpu(self):
> >         if not self._cptr is None:
> >             tempstr = np.array([' ']*self.nbytes())
> >             cuda.memcpy_dtoh(tempstr,self._cptr)
> >             ind = np.array([0,self.n.nbytes])
> >             self.n = np.fromstring(tempstr[ind[0]:ind[1]],
> >
> > dtype=self.n.dtype).reshape(self.n.shape) ind[0] += self.n.nbytes
> >             ind[1] += self.A.nbytes
> >             self.A = np.fromstring(tempstr[ind[0]:ind[1]],
> >
> > dtype=self.A.dtype).reshape(self.A.dtype) ind[0] += self.A.nbytes
> >             ind[1] += self.B.nbytes
> >             self.B = np.fromstring(tempstr[ind[0]:ind[1]],
> >
> > dtype=self.B.dtype).reshape(self.B.dtype) def pack(self):
> >         return self.n.tostring() + self.A.tostring() + self.B.tostring()
> >     def nbytes(self):
> >         return self.n.nbytes + self.A.nbytes + self.B.nbytes
> >
> > res = Results(10)
> > res.send_to_gpu()
> > cu_struct(res._cptr, block=(1,1,1))
> > res.get_from_gpu()
> >
> > print res.A
> > print res.B
> > print res.n
>
>
>
> _______________________________________________
> PyCuda mailing list
> [email protected]
> http://tiker.net/mailman/listinfo/pycuda_tiker.net
>
>
_______________________________________________
PyCuda mailing list
[email protected]
http://tiker.net/mailman/listinfo/pycuda_tiker.net

Reply via email to