1 // Boost.uBLAS
2 //
3 // Copyright (c) 2018 Fady Essam
4 // Copyright (c) 2018 Stefan Seefeld
5 //
6 // Distributed under the Boost Software License, Version 1.0.
7 // (See accompanying file LICENSE_1_0.txt or
8 // copy at http://www.boost.org/LICENSE_1_0.txt)
9 
10 #ifndef boost_numeric_ublas_opencl_vector_hpp_
11 #define boost_numeric_ublas_opencl_vector_hpp_
12 
13 #include <boost/numeric/ublas/opencl/library.hpp>
14 #include <boost/numeric/ublas/functional.hpp>
15 #include <boost/compute/core.hpp>
16 #include <boost/compute/algorithm.hpp>
17 #include <boost/compute/buffer.hpp>
18 #include <boost/compute/container/vector.hpp>
19 
20 namespace boost { namespace numeric { namespace ublas { namespace opencl {
21 
22 class storage;
23 
24 namespace compute = boost::compute;
25 
26 } // namespace opencl
27 
28 template <class T>
29 class vector<T, opencl::storage> : public boost::compute::vector<T>
30 {
31   typedef std::size_t size_type;
32 public:
vector()33   vector() : compute::vector<T>() {}
vector(size_type size,compute::context context)34   vector(size_type size, compute::context context)
35     : compute::vector<T>(size, context)
36   { device_ = context.get_device();}
vector(size_type size,T value,compute::command_queue queue)37   vector(size_type size, T value, compute::command_queue queue)
38     : compute::vector<T>(size, value, queue.get_context())
39   {
40     queue.finish();
41     device_ = queue.get_device();
42   }
43 
44   template <typename A>
vector(vector<T,A> const & v,compute::command_queue & queue)45   vector(vector<T, A> const &v, compute::command_queue &queue)
46     : vector(v.size(), queue.get_context())
47   {
48     this->from_host(v, queue);
49   }
50 
51 
device() const52   const compute::device device() const { return device_;}
device()53   compute::device device() { return device_;}
54 
55   template<class A>
from_host(ublas::vector<T,A> const & v,compute::command_queue & queue)56   void from_host(ublas::vector<T, A> const &v, compute::command_queue & queue)
57   {
58     assert(this->device() == queue.get_device());
59     compute::copy(v.begin(),
60 		  v.end(),
61 		  this->begin(),
62 		  queue);
63     queue.finish();
64   }
65 
66   template<class A>
to_host(ublas::vector<T,A> & v,compute::command_queue & queue) const67   void to_host(ublas::vector<T, A>& v, compute::command_queue& queue) const
68   {
69     assert(this->device() == queue.get_device());
70     compute::copy(this->begin(),
71 		  this->end(),
72 		  v.begin(),
73 		  queue);
74     queue.finish();
75   }
76 
fill(T value,compute::command_queue & queue)77   void fill(T value, compute::command_queue & queue)
78   {
79     assert(this->device() == queue.get_device());
80     compute::fill(this->begin(), this->end(), value, queue);
81     queue.finish();
82   }
83 
84 private:
85   compute::device device_;
86 };
87 
88 }}}
89 
90 #endif
91