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