From: Charles D. <cde...@gm...> - 2018-06-12 20:58:11
|
Greetings, I have discovered something rather odd. If I run an minimal example (as shown in eigen-with-viennacl.cpp) all runs fine where I pass a compressed_matrix directly to the copy e.g. Eigen::SparseMatrix<float, Eigen::RowMajor> spAm; ... code to fill spAm; viennacl::matrix<float> A = viennacl::compressed_matrix(K, M) viennacl::copy(spAm, A); However, if my compressed_matrix is wrapped up in a std::shared_ptr (C++11) I don't seem to be able to copy even when dereferencing. std::shared_ptr<viennacl::compressed_matrix<T> > shptr = std::make_shared<viennacl::compressed_matrix<float> >(viennacl::compressed_matrix<T>(K,M)); viennacl::copy(spAm, *shptr); Strangely, this results in a series of memory errors, the top relevant ones are here 0x00000000701CF5F6 (0x0000000018C5A670 0x000000001502E060 0x00000000043EB20B 0x00000000043EB230), _ZN8viennacl7backend13memory_createERNS0_10mem_handleEyRKNS_7contextEPKv() + 0x1C6 bytes(s) 0x00000000701C00C0 (0x0000000000000000 0x0000000004627FD0 0x0000000000000010 0x0000000000000004), _ZN8viennacl6detail9copy_implINS_5tools27const_sparse_matrix_adapterIdjEEdLj1EEEvRKT_RNS_17compressed_matrixIT0_XT1_EEEy() + 0x3A0 bytes(s) 0x00000000701BD721 (0x00000000043EB350 0x0000000004627FD0 0x0000000004530620 0x0000000007474070), _ZN8viennacl4copyIdLi1ELj1EEEvRKN5Eigen12SparseMatrixIT_XT0_EiEERNS_17compressed_matrixIS3_XT1_EEE() + 0x321 bytes(s) which following some c++filt we get the following viennacl::backend::memory_create(viennacl::backend::mem_handle&, unsigned long long, viennacl::context const&, void const*) void viennacl::detail::copy_impl<viennacl::tools::const_sparse_matrix_adapter<float, unsigned int>, float, 1u>(viennacl::tools::const_sparse_matrix_adapter<float, unsigned int> const&, viennacl::compressed_matrix<float, 1u>&, unsigned long long) void viennacl::copy<float, 1, 1u>(Eigen::SparseMatrix<float, 1, int> const&, viennacl::compressed_matrix<float, 1u>&) Any insight as to why this would be would be appreciated. Regards, Charles |
From: Karl R. <ru...@iu...> - 2018-06-15 19:11:59
|
Hi, > I have discovered something rather odd. > > If I run an minimal example (as shown in eigen-with-viennacl.cpp) all > runs fine where I pass a compressed_matrix directly to the copy e.g. > > Eigen::SparseMatrix<float, Eigen::RowMajor> spAm; > > ... code to fill spAm; > > viennacl::matrix<float> A = viennacl::compressed_matrix(K, M) I assume you mean viennacl::compressed_matrix<float> A = viennacl::compressed_matrix<float>(K, M); here? This may result in an unnecessary temporary object, so I'd recommend > viennacl::copy(spAm, A); > > > However, if my compressed_matrix is wrapped up in a std::shared_ptr > (C++11) I don't seem to be able to copy even when dereferencing. > > std::shared_ptr<viennacl::compressed_matrix<T> > shptr = > std::make_shared<viennacl::compressed_matrix<float> > >(viennacl::compressed_matrix<T>(K,M)); > > viennacl::copy(spAm, *shptr); T == float? > > Strangely, this results in a series of memory errors, the top relevant > ones are here > > 0x00000000701CF5F6 (0x0000000018C5A670 0x000000001502E060 > 0x00000000043EB20B 0x00000000043EB230), > _ZN8viennacl7backend13memory_createERNS0_10mem_handleEyRKNS_7contextEPKv() > + 0x1C6 bytes(s) > 0x00000000701C00C0 (0x0000000000000000 0x0000000004627FD0 > 0x0000000000000010 0x0000000000000004), > _ZN8viennacl6detail9copy_implINS_5tools27const_sparse_matrix_adapterIdjEEdLj1EEEvRKT_RNS_17compressed_matrixIT0_XT1_EEEy() > + 0x3A0 bytes(s) > 0x00000000701BD721 (0x00000000043EB350 0x0000000004627FD0 > 0x0000000004530620 0x0000000007474070), > _ZN8viennacl4copyIdLi1ELj1EEEvRKN5Eigen12SparseMatrixIT_XT0_EiEERNS_17compressed_matrixIS3_XT1_EEE() > + 0x321 bytes(s) > > > which following some c++filt we get the following > > viennacl::backend::memory_create(viennacl::backend::mem_handle&, > unsigned long long, viennacl::context const&, void const*) > void > viennacl::detail::copy_impl<viennacl::tools::const_sparse_matrix_adapter<float, > unsigned int>, float, > 1u>(viennacl::tools::const_sparse_matrix_adapter<float, unsigned > int> const&, viennacl::compressed_matrix<float, 1u>&, unsigned long > long) > void viennacl::copy<float, 1, 1u>(Eigen::SparseMatrix<float, 1, int> > const&, viennacl::compressed_matrix<float, 1u>&) > > > Any insight as to why this would be would be appreciated. compressed_matrix has the copy-constructor implemented, so that should be okay. Maybe it doesn't copy *all* internal members. I'll try to reproduce the problem so that I can debug it. Best regards, Karli |