Hi Matt,
Good, I was going to reply the that the code looked and ran fine :)
For any doubts about the semantics of OpenCL I can only recommend reading
the spec, at least chapters 1, 2 and 3.

http://www.khronos.org/registry/cl/specs/opencl-1.0.43.pdf

Cheers,

David


2009/9/16 Matt Gattis <[email protected]>

> Apologize, my code seems to work... was using numpy's float64 so I should
> have been using double * in my opencl code.
>
>
> On Wed, Sep 16, 2009 at 7:16 PM, Matt Gattis <[email protected]> wrote:
>
>> Hi, I am having trouble with the basic usage of pyopencl.  What is the
>> GLOBAL_SIZE parameter to the kernel calls?  I can't seem to find a
>> description of this in the documentation.  Perhaps it would help if anybody
>> knows where a few example programs could be found, outside of the three that
>> are included with the source?
>> Here's my failed attempt to multiply two square matrices:
>>
>> import sys
>> import pyopencl as cl
>> from numpy import *
>>
>> N = int(sys.argv[1])
>> precision = int(sys.argv[2])
>>
>> m1 = random.rand(N,N).astype('float%s' % precision)
>> m2 = random.rand(N,N).astype('float%s' % precision)
>>
>> print "m1:\n",m1
>> print "m2:\n",m2
>>
>> ctx = cl.create_context_from_type(cl.device_type.ALL)
>> queue = cl.CommandQueue(ctx)
>>
>> mf = cl.mem_flags
>> a_buf = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=m1)
>> b_buf = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=m2)
>> dest_buf = cl.Buffer(ctx, mf.WRITE_ONLY, m2.nbytes)
>>
>> prg = cl.Program(ctx, """
>>
>>
>>
>> __kernel void multwo(__global float *a,
>>
>>
>>
>>                      __global float *b,
>>
>>
>>
>>                      __global float *c)
>>
>>
>>
>> {
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>   int row = get_global_id(1);
>>
>>
>>
>>   int col = get_global_id(0);
>>   float sum = 0.0f;
>>
>>
>>
>>   for (int i = 0; i < %d; i++) {
>>
>>
>>
>>      sum += a[row*%d+i] * b[i*%d+col];
>>   }
>>
>>
>>
>>   c[row*%d+col] = sum;
>>
>>
>>
>> }
>>
>>
>>
>> """%(N,N,N,N)).build()
>>
>> prg.multwo(queue, (N,N), a_buf, b_buf, dest_buf)
>>
>> product = zeros([N,N],dtype='float%s' % precision)
>> cl.enqueue_read_buffer(queue, dest_buf, product).wait()
>>
>> print product
>>
>>
>> I get a bogus result:
>>
>> [[  1.21239019e+002   9.03297802e-315   0.00000000e+000]
>>  [  0.00000000e+000   0.00000000e+000   0.00000000e+000]
>>  [  0.00000000e+000   0.00000000e+000   0.00000000e+000]]
>>
>
>
> _______________________________________________
> PyOpenCL mailing list
> [email protected]
> http://tiker.net/mailman/listinfo/pyopencl_tiker.net
>
>
_______________________________________________
PyOpenCL mailing list
[email protected]
http://tiker.net/mailman/listinfo/pyopencl_tiker.net

Reply via email to