Hi Matthew,

 > I am at a loss how I can use a custom kernel that operates on a
> component of a matrix.
> I can not seem to get a device pointer to the internal buffer in any
> obvious way.  (Maybe it's somewhere in the doc.s but I can't find it).
> I notice that you can do strange things like this, from the
> custom-kernels.cpp example.

OpenCL does not have the concept of a device pointer, it only provides 
device handles. This is where OpenCL differs by more than just a change 
of terminology from CUDA. You can, however, use the CUDA backend of 
ViennaCL if you prefer to work with pointer arithmetic.

>
> viennacl::ocl::enqueue(my_kernel_mul(vec1, vec2, result_mul,
> static_cast<cl_uint>(vec1.size())));
>
> In theory vec1 and vec2 should float * pointers to a device buffer,
> according to the type signature of my_kernel_mul().
> However vec1 and vec2 and result_mul  are all viennacl vectors. This
> pattern works for matrices as well for custom kernels.

What happens at the kernel call is that the OpenCL handle is extracted 
from the object. This is achieved by calling .handle() on the element to 
get the backend-agnostic ViennaCL memory handle, and fetching the OpenCL 
handle from it via .opencl_handle(). In short, to get the OpenCL handle 
from 'vec1', call
  vec1.handle().opencl_handle()

(use vec1.handle().cuda_handle() if you use the CUDA backend)



> Unfortunately I can not work on a sub-block of the matrix.  This doesn't
> work
> float *ptr = &(matrix(i,j)) ;
>
> In fact I can't even do this,
> float *ptr = matrix ;

Nope, OpenCL defines its own memory space for which you cannot perform 
any pointer arithmetic. Also, ViennaCL objects 'live' in main memory, 
whereas device memory is a separate memory domain, so the address 
operator will always return the address of the respective proxy objects 
in main memory.


> So I'm not really understanding the internals of how this works. I'm
> more familiar with CUDA where you can work with device pointers and
> pointer arithmetic.
> My kernel needs to fill in sublocks of the output matrix and so I need
> to pass in a pointer that has an offset.  Is there any mechanism for this?

I recommend to pass the base OpenCL handle to the kernel and work with 
explicit offsets from there (this is how ViennaCL deals with arbitrary 
submatrices with strides possibly different from 1). The alternative is 
to create a subbuffer with appropriate offsets directly via the OpenCL 
API and pass that to the kernel.


> My other problem with viennacl is that the zero padding and current API
> seems to force at least 3 copies to get  dense matrix data into and out
> of the device buffer into a flat float Host array with no zero padding.
> It's such a common use case I'm surprised that there isn't some more
> efficient method or function to support this.

You can create a matrix without padding from a linear memory buffer. To 
do so, copy your matrix data into a viennacl::vector v via
  viennacl::fast_copy(input_begin, input_end, v.begin());
with appropriate input iterators 'input_begin' and 'input_end'. Then 
wrap the copied data into the base type 'matrix_base' of a viennacl::matrix:

  viennacl::matrix_base<T> A(v.handle(),
                             M, 0, 1, M,
                             N, 0, 1, N);

for a matrix with M rows and N columns. The 'zeros' denote the row and 
column offsets, respectively, so you could also specify nonzero values 
for working on a submatrix (this is how viennacl::matrix_range<> and 
viennacl::matrix_slice<> work).

Why all this zero-padding by default? In most cases one wants to run 
FLOP-intensive operations on dense matrices on the GPU, so the overhead 
of the extra data conversion is often small compared to gains from the 
improved data layout (keep in mind that DRAM bandwidth is at least a 
factor of 2 better than PCI-Express bandwidth!).

Best regards,
Karli


------------------------------------------------------------------------------
Monitor Your Dynamic Infrastructure at Any Scale With Datadog!
Get real-time metrics from all of your servers, apps and tools
in one place.
SourceForge users - Click here to start your Free Trial of Datadog now!
http://pubads.g.doubleclick.net/gampad/clk?id=241902991&iu=/4140
_______________________________________________
ViennaCL-support mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/viennacl-support

Reply via email to