Karl,
Once again, after spending so much time previously before messaging this
list I have now solved the problem shortly afterwards. In your
documentation section 'User-Provided OpenCL Contexts' I got the idea to
pull all the relevant information from the viennacl objects I am passing to
the functions. This way I can setup the context with the previously
existing context. The relevant code looks like this:
// viennacl::matrix *vcl_A
viennacl::ocl::context ctx = vcl_A->handle().opencl_handle().context();
cl_context my_context =
vcl_A->handle().opencl_handle().context().handle().get();
cl_device_id my_device =
vcl_A->handle().opencl_handle().context().devices()[0].id();
cl_command_queue queue =
vcl_A->handle().opencl_handle().context().get_queue().handle().get();
viennacl::ocl::setup_context(0, my_context, my_device, queue);
Now I can still use the 'ctx' object as needed and the context for the
'enqueue' call is using the correct context.
Thanks for responding and for creating the documentation. I always seem to
find another useful nugget.
Charles
On Wed, Jul 26, 2017 at 10:10 AM, Karl Rupp <[email protected]> wrote:
> Hi Charles,
>
> can you point me to the code that exposes the problem? The OpenCL error
> indicates that the memory object passed in is not correct, so maybe there
> is indeed a second context in play that should not be there.
>
> Best regards,
> Karli
>
>
>
> On 07/26/2017 08:58 AM, Charles Determan wrote:
>
>> I have an interesting problem. In the context of developing additional
>> functionality for the gpuR package I want to have the option for users to
>> provide a custom OpenCL kernel that will compile and provide a function
>> that can immediately be used within R. I am quite close where I can
>> dynamically create the necessary C++ files, compile, and load the
>> function. This leads to my current problem.
>>
>> If I take a kernel that currently works within the package and use it to
>> create this custom function the following happens. I can get the
>> previously initialized matrices from the context index I pass (i.e. I can
>> print them). This made me believe that I can use my previously defined
>> contexts and objects. But when I get to the 'viennacl::ocl::enqueue' call
>> of the kernel function it throws the error which I thought I read meant the
>> contexts weren't matching but I'm not sure where the disconnect is.
>>
>> ViennaCL: Error -38 in function arg ( path/to/R/R-3.4.0/library/RVie
>> nnaCL/include/viennacl/ocl/kernel.hpp:239 )
>> Error in cpp_gpuMatrix_custom_igemm(igpuA@address, TRUE, igpuB@address,
>> :
>> ViennaCL: FATAL ERROR: CL_INVALID_MEM_OBJECT.
>> If you think that this is a bug in ViennaCL, please report it at
>> [email protected] <mailto:viennacl-support@lists
>> .sourceforge.net> and supply at least the following information:
>>
>> * Operating System
>> * Which OpenCL implementation (AMD, NVIDIA, etc.)
>> * ViennaCL version
>> Many thanks in advance!
>>
>>
>> Running with VIENNACL_DEBUG_ALL I get the following output:
>>
>> ViennaCL: Initializing context no. 0
>> ViennaCL: Initializing new ViennaCL context.
>> ViennaCL: Setting all devices for context...
>> ViennaCL: Getting platform...
>> ViennaCL: Querying devices available at current platform.
>> ViennaCL: Found 1 devices.
>> ViennaCL: Creating device object (CTOR with cl_device_id)
>> ViennaCL: Creating device object (Copy CTOR)
>> ViennaCL: Number of devices for context: 1
>> ViennaCL: Creating device object (Copy CTOR)
>> ViennaCL: Initialization of new ViennaCL context done.
>> ViennaCL: Creating device object (Copy CTOR)
>> ViennaCL: Creating device object (Copy CTOR)
>> ViennaCL: Adding new queue for device 0x2e2a00 to context 0x21847b40
>> ViennaCL: Context no. 0 initialized with 1 devices
>> ViennaCL: Device id: 0x2e2a00
>> ViennaCL: Creating device object (Copy CTOR)
>> ViennaCL: Adding program 'my_kernel' with source to context 0x21847b40
>> ViennaCL: Creating kernel object (full CTOR): iMatMult
>> ViennaCL: Stored program 'my_kernel' in context 0x21847b40
>> ViennaCL: There is/are 1 program(s)
>> ViennaCL: Getting program 'my_kernel' from context 0x21847b40
>> ViennaCL: There are 1 programs
>> ViennaCL: Setting global work size to 128 at index 0 for kernel iMatMult
>> ViennaCL: Setting global work size to 128 at index 1 for kernel iMatMult
>> ViennaCL: Setting local work size to 16 at index 0 for kernel iMatMult
>> ViennaCL: Setting local work size to 16 at index 1 for kernel iMatMult
>> ViennaCL: Setting int precision kernel argument 4 at pos 0 for kernel
>> iMatMult
>> ViennaCL: Setting int precision kernel argument 128 at pos 1 for kernel
>> iMatMult
>> ViennaCL: Setting int precision kernel argument 4 at pos 2 for kernel
>> iMatMult
>> ViennaCL: Setting int precision kernel argument 128 at pos 3 for kernel
>> iMatMult
>> ViennaCL: Setting generic kernel argument 0x1f59f720 at pos 4 for kernel
>> iMatMult
>>
>> I initially see that it is 'initializing context 0' when it was
>> previously initialized within the main 'gpuR' package. Perhaps this is
>> okay, provided it is initialized in the same way? Or perhaps I need to
>> find a way to carry the previous context between functions (e.g. an
>> external pointer).
>>
>> Any thoughts are appreciated,
>>
>> Charles
>>
>>
>> ------------------------------------------------------------
>> ------------------
>> Check out the vibrant tech community on one of the world's most
>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>>
>>
>>
>> _______________________________________________
>> ViennaCL-support mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/viennacl-support
>>
>>
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
ViennaCL-support mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/viennacl-support