Results 1 to 4 of 4

Thread: clSetKernelArg set NULL __global buffer pointer ( Unclear )

  1. #1
    Junior Member
    Join Date
    Jan 2012
    Posts
    2

    clSetKernelArg set NULL __global buffer pointer ( Unclear )

    According to the documentation on clSetKernelArg

    on arg_value

    "A NULL value can also be specified if the argument is a buffer object in which case a NULL value will be used as the value for the argument declared as a pointer to __global or __constant memory in the kernel"

    So is possible to pass a NULL __global pointer to a kernel

    On this situation arg_size, assuming that the word "argument" mean "kernel argument" like on all document, I assume

    clSetKernelArg(kernel, n , sizeof(cl_mem), NULL) OK
    clSetKernelArg(kernel, n , 0, NULL) WRONG
    clSetKernelArg(kernel, n , sizeof(cl_mem), &zero_buffer) ??

    When i follow to read reaching Errors section i see

    CL_INVALID_ARG_VALUE if arg_value specified is NULL for an argument that is not declared with the __local qualifier or vice-versa

    This mean

    clSetKernelArg(kernel, n , sizeof(cl_mem), NULL) WRONG
    clSetKernelArg(kernel, n , 0, NULL) WRONG
    clSetKernelArg(kernel, n , sizeof(cl_mem), &zero_buffer) ??


    CL_INVALID_MEM_OBJECT for an argument declared to be a memory object when the specified arg_value is not a valid memory object

    clSetKernelArg(kernel, n , sizeof(cl_mem), NULL) WRONG
    clSetKernelArg(kernel, n , 0, NULL) WRONG
    clSetKernelArg(kernel, n , sizeof(cl_mem), &zero_buffer) WRONG?

    Is Null a valid memory object ? For Nvidia the answer is YES and the third call work, for AMD the answer is NO, no one of this call work and there is no way to set a pointer kernel argument to NULL

  2. #2
    Senior Member
    Join Date
    May 2010
    Location
    Toronto, Canada
    Posts
    845

    Re: clSetKernelArg set NULL __global buffer pointer ( Unclea

    What revision of the OpenCL specification are you looking at? The most recent published revision of the OpenCL 1.1. specification is #44 and this is what it says:

    If the argument is a buffer object, the arg_value pointer can be
    NULL or point to a NULL value in which case a NULL value will be used as the value for the argument declared as a pointer to __global or __constant memory in the kernel.
    In other words, both of these options are valid and will set the kernel argument to NULL.

    Code :
    cl_mem null_mem_object = NULL;
    clSetKernelArg(kernel, n , sizeof(cl_mem), NULL);
    clSetKernelArg(kernel, n, sizeof(cl_mem), &null_mem_object);

    If there's a vendor that is not honoring the specification it is best to contact their customer representatives directly.
    Disclaimer: Employee of Qualcomm Canada. Any opinions expressed here are personal and do not necessarily reflect the views of my employer. LinkedIn profile.

  3. #3
    Junior Member
    Join Date
    Jan 2012
    Posts
    2

    Re: clSetKernelArg set NULL __global buffer pointer ( Unclea

    I follow the OpenCL documentation 1.1 Revision 44 Online Manual

    The name of this vendor is AMD. But i do not think the mistake is from AMD. AMD that followed the documentation, i think the documentation is contradictory Infact after reading the statement you have reported there is also

    CL_INVALID_MEM_OBJECT for an argument declared to be a memory object when the specified arg_value is not a valid memory object.

    This statement say that

    clSetKernelArg (kernel, n , sizeof(cl_mem), &null_mem_object); should return CL_INVALID_MEM_OBJECT if null is an invalid cl_mem object ( Is unclear if null is considered a valid or invalid memobject) (and infact is what AMD does)

    Anyway the following statement has not interpretation

    "CL_INVALID_ARG_VALUE if arg_value specified is NULL for an argument that is not declared with the __local qualifier or vice-versa".

    say that

    clSetKernelArg(kernel, n, sizeof(cl_mem), NULL) should return CL_INVALID_ARG_VALUE


    Following your documentation there is no way to declare a null cl_mem object null pointer ( or may be one if null is a valid mem object ), and this is what AMD follow

  4. #4
    Senior Member
    Join Date
    May 2010
    Location
    Toronto, Canada
    Posts
    845

    Re: clSetKernelArg set NULL __global buffer pointer ( Unclea

    I'm afraid we must be looking at a different revision of the specification. I got mine a few days ago from http://www.khronos.org/registry/cl/specs/opencl-1.1.pdf.

    This version reads:

    If the argument is a buffer object, the arg_value pointer can be NULL or point to a NULL value in which case a NULL value will be used as the value for the argument declared as a pointer to __global or __constant memory in the kernel. If the argument is declared with the __local qualifier, the arg_value entry must be NULL.

    [...]

    If the argument is declared to be a pointer of a built-in scalar or vector type, or a user defined structure type in the global or constant address space, the memory object specified as argument value must be a buffer object (or NULL).

    [...]

    clSetKernelArg returns CL_SUCCESS if the function was executed successfully. Otherwise, it returns one of the following errors:

    * CL_INVALID_ARG_VALUE if arg_value specified is not a valid value.
    * CL_INVALID_MEM_OBJECT for an argument declared to be a memory object when the specified arg_value is not a valid memory object.
    I hope this is clear.
    Disclaimer: Employee of Qualcomm Canada. Any opinions expressed here are personal and do not necessarily reflect the views of my employer. LinkedIn profile.

Similar Threads

  1. Replies: 1
    Last Post: 09-30-2011, 07:40 AM
  2. Replies: 1
    Last Post: 04-21-2010, 12:16 PM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
Proudly hosted by Digital Ocean