[racket] OpenCL module macro errors

From: Jay McCarthy (jay.mccarthy at gmail.com)
Date: Mon Aug 26 08:28:19 EDT 2013

Yup

On Mon, Aug 26, 2013 at 2:34 AM, Tobias Hammer <tobias.hammer at dlr.de> wrote:
> I guess you should replace it in the function body too
>
> diff --git a/opencl/c/syntax.rkt b/opencl/c/syntax.rkt
> index 909b2c8..3848e1b 100644
> --- a/opencl/c/syntax.rkt
> +++ b/opencl/c/syntax.rkt
> @@ -216,13 +216,13 @@
>             (define (id:selector arg_id ... _param_type)
>               (case (hash-ref id-selector-map _param_type #f)
>                 [(_vtype)
> -                (local [(define len (id:length _arg_type ... _param_type))]
> +                (local [(define len (id:length arg_id ... _param_type))]
>                    (if (zero? len)
>                        _vtype-default
> -                      (id:_vtype _arg_type ... _param_type len)))]
> +                      (id:_vtype arg_id ... _param_type len)))]
>                 ...
>                 [(_ftype)
> -                (id:_ftype _arg_type ... _param_type)]
> +                (id:_ftype arg_id ... _param_type)]
>                 ...
>                 [else
>                  (error 'id:selector "Invalid parameter: ~e" _param_type)]))
>
>
>
> On Sun, 25 Aug 2013 04:02:54 +0200, Dane Larsen <dane at larsendt.com> wrote:
>
>> Hmm. I think I almost have it, but there's one error I can't seem to track
>> down.
>>
>> Switching from _arg_type to arg_id seems to have almost worked, but now
>> I'm stuck. When I try to run my context sharing test program
>> (https://github.com/larsendt/cl-gl-context-sharing/) I get the following:
>>
>> vector-length: contract violation
>>    expected: vector?
>>    given: #<ctype>
>>    context...:
>>  /home/dane/chematox/local/racket-5.90.0.6/collects/ffi/unsafe.rkt:27:27:
>> vector->cblock
>>     /home/dane/git/opencl/opencl/c/syntax.rkt:160:13
>>     /home/dane/git/opencl/opencl/c/syntax.rkt:216:11:
>> clGetGLContextInfoKHR:generic
>>     /home/dane/git/opencl/opencl/sinemesh/sinemesh-gl.rkt:30:6
>>     /home/dane/git/opencl/opencl/sinemesh/sinemesh-gl.rkt:18:2
>>
>> /home/dane/chematox/local/racket-5.90.0.6/collects/racket/private/class-internal.rkt:4070:0:
>> continue-make-object
>>
>> /home/dane/chematox/local/racket-5.90.0.6/collects/racket/private/class-internal.rkt:4051:0:
>> do-make-object
>>     /home/dane/git/opencl/opencl/sinemesh/sinemesh-gl.rkt: [running body]
>>
>> It looks like the error is happening in the definition of _vector, which
>> calls vector->cblock. I assumed that would be in the conversion of the input
>> 'properties' vector
>> (https://github.com/larsendt/cl-gl-context-sharing/blob/master/sinemesh-gl.rkt#L46),
>> but that's definitely a vector, not a ctype. There aren't any other inputs
>> being passed to _vector, so I honestly have no idea what's causing it.
>>
>> I put up my fork of the opencl module with the changes at
>> https://github.com/larsendt/opencl/. The definition of clGetGLContextInfoKHR
>> lives at
>> https://github.com/larsendt/opencl/blob/master/opencl/c/9-7.rkt#L19.
>>
>> Thanks for the help so far. I'm still getting my bearings in macro-world,
>> and it's definitely showing today.
>>
>> Dane
>>
>>
>> On 08/23/2013 09:29 AM, Jay McCarthy wrote:
>>>
>>> Hi Dane,
>>>
>>> Thanks for working on this.
>>>
>>> If you look at line 106 of the definition of define-opencl-info, it
>>> uses the _arg_type as the name of the selector's arguments. I think
>>> you could safely replace that with arg_id, if not, then you would want
>>> to create new ids with generate-temporaries, but try arg_id first.
>>>
>>> Since this looks like a simple change, try it on your end and we can
>>> just include it in the pull request/patch you send me.
>>>
>>> Jay
>>>
>>>
>>> On Thu, Aug 22, 2013 at 7:54 PM, Dane Larsen <dane at larsendt.com> wrote:
>>>>
>>>> Hi all,
>>>>
>>>> I'm a little new to Racket (and Lispy languages in general). I'm working
>>>> on
>>>> extending the OpenCL module to add support for OpenGL context sharing.
>>>>
>>>> My questions are somewhat specific to the OpenCL module, but hopefully I
>>>> can
>>>> provide enough context to minimize that.
>>>>
>>>> Right now I'm working on clGetGLContextInfoKHR in, and it's been a bit
>>>> more
>>>> challenging than I anticipated. It's a CL extension function, so
>>>> get-ffi-obj
>>>> fails to find it. This hasn't been a huge problem. I ended up creating
>>>> an
>>>> alternate version of define-opencl (
>>>> https://github.com/jeapostrophe/opencl/blob/master/opencl/c/lib.rkt#L17)
>>>> which I've called define-opencl-extension. Rather than calling
>>>> get-ffi-obj,
>>>> it calls clGetExtensionFunctionAddress. That part works great.
>>>>
>>>> The big problem that I'm having right now is with define-opencl-info (
>>>>
>>>> https://github.com/jeapostrophe/opencl/blob/master/opencl/c/syntax.rkt#L18),
>>>> which essentially provides a convenient interface for the clGet*Info
>>>> functions (which all have similar arguments). clGetGLContextInfoKHR
>>>> follows
>>>> that pattern with one exception. It's primary input argument takes a
>>>> vector
>>>> of values, rather than a single value.
>>>>
>>>> A call to define-opencl-info looks like this:
>>>> https://github.com/jeapostrophe/opencl/blob/master/opencl/c/5-3.rkt#L76
>>>>
>>>> I thought I had the correct syntax by essentially replacing line 79 with
>>>> the
>>>> following:
>>>>
>>>> (args [properties : (_vector i _cl_context_properties)
>>>> _cl_context_properties_vector/c])
>>>>
>>>> (I've also replaced the other types and argument names and whatnot, but
>>>> that
>>>> all seems to work).
>>>> Anyway, with the (_vector ...) call, I get the following error:
>>>>
>>>> ; c/9-7.rkt:26:22: define: not an identifier, identifier with default,
>>>> or
>>>> ;   keyword for procedure argument
>>>> ;   at: (_vector i _cl_context_properties)
>>>> ;   in: (define (clGetGLContextInfoKHR:generic (_vector i
>>>> ;     _cl_context_properties) _cl_gl_context_info) (case (hash-ref
>>>> ;     id-selector-map _cl_gl_context_info #f) ((_cl_device_id*) (local
>>>> ((define
>>>> ;     len (clGetGLContextInfoKHR:length (_vector i
>>>> _cl_context_properties)...
>>>> ; [,bt for context]
>>>>
>>>> I'm not sure what that error is referring to, or how to fix it.
>>>> Here's the backtrack, but it's not terribly helpful (that I can see,
>>>> anyway):
>>>>
>>>> ; c/9-7.rkt:26:22: define: not an identifier, identifier with default,
>>>> or
>>>> keyword for procedure argument
>>>> ;   at: (_vector i _cl_context_properties)
>>>> ;   in: (define (clGetGLContextInfoKHR:generic (_vector i
>>>> _cl_context_properties) _cl_gl_context_info) (case (hash-ref
>>>> id-selector-map
>>>> _cl_gl_context_info #f) ((_cl_device_id*) (local ((define len
>>>> (clGetGLContextInfoKHR:length (_vector i _cl_context_properties)...
>>>> ;   context...:
>>>> ;
>>>>
>>>> /home/dane/encrypted/work/chematox/local/racket-5.90.0.6/collects/racket/private/norm-define.rkt:46:33:
>>>> simple-proto
>>>> ;
>>>>
>>>> /home/dane/encrypted/work/chematox/local/racket-5.90.0.6/collects/racket/private/norm-define.rkt:134:33:
>>>> general-proto
>>>> ;    try-next
>>>> ;
>>>>
>>>> /home/dane/encrypted/work/chematox/local/racket-5.90.0.6/collects/racket/private/kw.rkt:804:2
>>>> ;
>>>>
>>>> /home/dane/encrypted/work/chematox/local/racket-5.90.0.6/collects/racket/private/modbeg.rkt:46:4
>>>> ;
>>>>
>>>> /home/dane/encrypted/work/chematox/local/racket-5.90.0.6/share/pkgs/xrepl-lib/xrepl/xrepl.rkt:1346:0
>>>> ;    standard-module-name-resolver
>>>> ;
>>>>
>>>> /home/dane/encrypted/work/chematox/local/racket-5.90.0.6/share/pkgs/xrepl-lib/xrepl/xrepl.rkt:1346:0
>>>> ;    standard-module-name-resolver
>>>> ;
>>>>
>>>> /home/dane/encrypted/work/chematox/local/racket-5.90.0.6/share/pkgs/xrepl-lib/xrepl/xrepl.rkt:1346:0
>>>> ;    standard-module-name-resolver
>>>> ;
>>>>
>>>> /home/dane/encrypted/work/chematox/local/racket-5.90.0.6/share/pkgs/xrepl-lib/xrepl/xrepl.rkt:1346:0
>>>> ;
>>>>
>>>> /home/dane/encrypted/work/chematox/local/racket-5.90.0.6/collects/racket/private/misc.rkt:87:7
>>>>
>>>> In addition, when I replace the (_vector ...) stuff with a plain old
>>>> _cl_context_properties, everything works fine (but the contract fails
>>>> when I
>>>> actually try to call clGetGLContextInfoKHR, as expected).
>>>>
>>>> What am I doing wrong? It looks like (_vector i _cl_context_properties)
>>>> is
>>>> just as much of a ctype as _cl_context_properties, so why does it fail
>>>> when
>>>> I make it a vector?
>>>>
>>>> Thanks a ton,
>>>> Dane Larsen
>>>>
>>>> ____________________
>>>>    Racket Users list:
>>>>    http://lists.racket-lang.org/users
>>>>
>>>
>>>
>>>
>>
>> ____________________
>>   Racket Users list:
>>   http://lists.racket-lang.org/users
>
>
>
> --
> ---------------------------------------------------------
> Tobias Hammer
> DLR / Robotics and Mechatronics Center (RMC)
> Muenchner Str. 20, D-82234 Wessling
> Tel.: 08153/28-1487
> Mail: tobias.hammer at dlr.de



-- 
Jay McCarthy <jay at cs.byu.edu>
Assistant Professor / Brigham Young University
http://faculty.cs.byu.edu/~jay

"The glory of God is Intelligence" - D&C 93

Posted on the users mailing list.