Hi Andy,

apparently I was completely bananas and couldn't see the more fundamental problem with the code. I could reproduce the issue on my laptop (I'm on travel) and after finding the cause, I wonder why it didn't fail on my other machine.

The reason for the problem is the initialization of the matrix A and the vector B: If you pass in a pointer to host memory, you *must* specify the memory type as viennacl::MAIN_MEMORY. To convert the data to OpenCL, switch to the OpenCL context via the member function .switch_memory_context(). It is not possible to use host data directly with OpenCL in general, because host memory and device memory can be physically distinct. (ignoring some possible pointer sharing on certain OpenCL devices here)

The corrected code is attached. Please have a look at how A and B are initialized and how their memory context is changed to OpenCL after creation. Use viennacl::copy() or viennacl::fast_copy() to bring the data back to one of your host buffers.

Sorry for not spotting this earlier...

Best regards,
Karli



On 10/12/2016 06:25 AM, Andrew Palumbo wrote:
Hi Karl,

As I mentioned before, I'm using libviennacl-dev version 1.7.1 installed
from the ubunto repo.



When I run your attached code, I get do get an error:


andrew@michael:~/Downloads$ g++ DenseVectorMmul.cpp
-I/usr/include/viennacl/ -lOpenCL -o denseVec

andrew@michael:~/Downloads$ ./denseVec
terminate called after throwing an instance of 'viennacl::memory_exception'
  what():  ViennaCL: Internal memory error: not initialised!
Aborted (core dumped)

andrew@michael:~/Downloads$ g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.2) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Thanks,


Andy





------------------------------------------------------------------------
*From:* Karl Rupp <r...@iue.tuwien.ac.at>
*Sent:* Tuesday, October 11, 2016 10:31 AM
*To:* Andrew Palumbo; viennacl-devel@lists.sourceforge.net
*Subject:* Re: [ViennaCL-devel] Fw: Matrix * Vector CL_OUT_OF_RESOURCES
error

Hi Andy,

thanks for the reminder and sorry for not getting back to you sooner.

After replacing the dynamically-sized arrays with std::vector<double>, I
compiled the code you provided and can execute it without problems. The
code is also valgrind-clean, so I don't know what could possibly be the
problem.

Can you please verify two things:
  a) you use the latest code from the master branch?
  b) does the error show up with the attached code? It contains the
fixes for std::vector<>. The reason for the change is that my compiler
(GCC 4.6) did error out with the following:

DenseVectorMmul.cpp: In function ‘int main()’:
DenseVectorMmul.cpp:32:30: error: variable-sized object ‘A_values’ may
not be initialized
DenseVectorMmul.cpp:45:26: error: variable-sized object ‘B_values’ may
not be initialized


Best regards,
Karli

#define VIENNACL_WITH_OPENCL
#include "viennacl/context.hpp"
#include "viennacl/matrix.hpp"
#include "viennacl/tools/random.hpp"

#include <vector>

// C_vec = A_dense_matrix %*% B_vec.

// compile line: g++ DenseVectorMmul.cpp  -I/usr/include/viennacl/ -lOpenCL -o denseVec



int main()
{
  // trying to recreate javacpp wrapper functionalliy as closely as possible
  // so not using typedef, unsigned ints, etc, and defining templates as doubles
  // creating buffers as int/double arrays and then setting pointers to them.
  // (not 100% sure that this is how javacpp passes pointers but should be close.)  


  //typedef double       ScalarType;

  // using unsigned ints here to suppress warnings/errors w/o using -fpermissive`
  // in acuallity, we cast `int`s from jni/javacpp.
  unsigned int m = 200;
  unsigned int n = 100;

  // create an OpenCL context which we will pass directly to the constructors 
  // of the Matrix and vector
  viennacl::context oclCtx(viennacl::OPENCL_MEMORY);
 
  std::vector<double> A_values(m * n);

  viennacl::tools::uniform_random_numbers<double> randomNumber;
  for (int i = 0; i < m * n; i++) { 
    A_values[i] = randomNumber();
  }

  double* A_values_ptr = &(A_values[0]);

  // this is currently the constructor that we're using through scala/javacpp.
  viennacl::matrix<double,viennacl::row_major> A_dense_matrix(A_values_ptr, viennacl::MAIN_MEMORY , m, n);
  A_dense_matrix.switch_memory_context(oclCtx);

  std::vector<double> B_values(n);

  for (int i = 0; i < n; i++) { 
    B_values[i] = randomNumber();
  }

  double* B_values_ptr = &(B_values[0]);
           
  // this is currently the constructor that we're using through scala/javacpp.
  viennacl::vector<double> B_vec(B_values_ptr, viennacl::MAIN_MEMORY, n, 0, 1);                          
  B_vec.switch_memory_context(oclCtx);

  // perform multiplication and pass result to a vector constructor
  viennacl::vector<double> C_vec(viennacl::linalg::prod(A_dense_matrix , B_vec));

  // print out vec 
  std::cout << "ViennaCL: " << C_vec << std::endl;


  // just exit with success for now if there are no runtime errors.  

  return EXIT_SUCCESS;
}
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most 
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
ViennaCL-devel mailing list
ViennaCL-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/viennacl-devel

Reply via email to