Hello,
I'm Having some difficulties with compressed_matrix multiplication.
Essentially I am copying three buffers, the CSR conversion of an Apache Mahout
SparseMatrix, into two compressed_matrices performing matrix multiplication. I
am doing this in scala and Java using javacpp.
For example, I have a 5 x 10 matrix of ~20% non-zero values which in CSR format
looks like this:
NNz: 12
Row Pointer: [0, 1, 4, 6, 9, 12, ]
Col Pointer: [9, 0, 8, 7, 2, 9, 0, 8, 9, 0, 3, 5, ]
element Pointer: [0.4065367203992265, 0.04957158909682802, 0.5205586068847993,
0.3708618354358446, 0.6963900565931678, 0.8330915529787706,
0.32839112750638844, 0.7856168903297948, 0.4265801782090245,
0.14733066454561583, 0.9501663495824946, 0.9710498974366047, ]
Multiplied by a similarly Sparse 10 x 5 compressed_matrix
I use a CompressedMatrix wrapper which essentially wraps the
viennacl:: compressed_matrix (vcl_size_t rows, vcl_size_t cols, vcl_size_t
nonzeros=0, viennacl::context ctx=viennacl::context())
constructor as well as the
compressed_matrix (matrix_expression< const compressed_matrix, const
compressed_matrix, op_prod > const &proxy).
I have a helper function, toVclCompressedMatrix(..) which essentially does the
CSR conversion from a Mahout src matrix, calls the constructor and uses
viennacl::compressed_matrix::set(...) to set the buffers:
val ompA = toVclCompressedMatrix(src = mxA, ompCtx)
val ompB = toVclCompressedMatrix(src = mxB, ompCtx)
and then create a new viennacl::compressed_matrix from the
viennacl::linalg::prod of the 2 matrices i.e.:
val ompC = new CompressedMatrix(prod(ompA, ompB))
The context in the above case is either the Host or OpenMP (I know that there
is some special casting of the row_jumpers and col_idxs that needs to be done
in the OpenCL version)
The Matrix multiplication completes without error on small Matrices eg. < 300 x
300
but seems to overwrite the resulting buffers on larger Matrices.
My real problem, though is getting the memory back out of the resulting `ompC`
compresed_matrix so that i can write it back to a mahout SparseMatrix.
currently I am using:
void viennacl::backend::memory_copy (mem_handle const & src_buffer,
mem_handle & dst_buffer,
vcl_size_t src_offset,
vcl_size_t dst_offset,
vcl_size_t bytes_to_copy
)
on ompC.handel1, ompC.handel2 and ompC.handel source handels
to copy into pre-allocated row_jumper, col_index and element buffers (of size
ompC.size1() + 1, ompC.nnz and ompC.nnz, respectivly).
I am getting nonsensical values back that one would expect from memory errors.
eg:
the Matrix geometry of the result: ompC.size1(), and omp.size2() are correct
and ompC.nnz is a reasonable value.
It is possible that I have mis-allocated some of the memory on my side, but I
am pretty sure that most of the Buffers are allocated correctly (usually
JavaCPP does a pretty good job of this).
I guess, long story short, my question is am i using the correct method of
copying the memory out of a compressed_matrix? is there something glaringly
incorrect that i am doing here? Should I be using
viennacl::backend::memory_copy or is there a different method that i should be
using?
Thanks very much,
Andy
------------------------------------------------------------------------------
What NetFlow Analyzer can do for you? Monitors network bandwidth and traffic
patterns at an interface-level. Reveals which users, apps, and protocols are
consuming the most bandwidth. Provides multi-vendor support for NetFlow,
J-Flow, sFlow and other flows. Make informed decisions using capacity planning
reports.http://sdm.link/zohodev2dev
_______________________________________________
ViennaCL-devel mailing list
ViennaCL-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/viennacl-devel