inline svm_ptr<T> copy_on_device(svm_ptr<T> first, svm_ptr<T> last, svm_ptr<T> result, command_queue &queue) { size_t count = iterator_range_size(first, last); if(count == 0){ return result; } queue.enqueue_svm_memcpy( result.get(), first.get(), count * sizeof(T) ); return result + count; }
inline future<svm_ptr<T> > copy_on_device_async(svm_ptr<T> first, svm_ptr<T> last, svm_ptr<T> result, command_queue &queue) { size_t count = iterator_range_size(first, last); if(count == 0){ return result; } event event_ = queue.enqueue_svm_memcpy_async( result.get(), first.get(), count * sizeof(T) ); return make_future(result + count, event_); }
inline void dispatch_fill(svm_ptr<T> first, size_t count, const T &value, command_queue &queue) { if(count == 0){ return; } queue.enqueue_svm_fill( first.get(), &value, sizeof(T), count * sizeof(T) ); }
inline svm_ptr<T> copy_to_device_map(HostIterator first, HostIterator last, svm_ptr<T> result, command_queue &queue, const wait_list &events) { size_t count = iterator_range_size(first, last); if(count == 0){ return result; } // map queue.enqueue_svm_map( result.get(), count * sizeof(T), CL_MAP_WRITE, events ); // copy [first; last) to result buffer std::copy(first, last, static_cast<T*>(result.get())); // unmap result queue.enqueue_svm_unmap(result.get()).wait(); return result + count; }
inline future<void> dispatch_fill_async(svm_ptr<T> first, size_t count, const T &value, command_queue &queue) { if(count == 0){ return future<void>(); } event event_ = queue.enqueue_svm_fill( first.get(), &value, sizeof(T), count * sizeof(T) ); return future<void>(event_); }
inline HostIterator copy_to_host(svm_ptr<T> first, svm_ptr<T> last, HostIterator result, command_queue &queue) { size_t count = iterator_range_size(first, last); if(count == 0){ return result; } queue.enqueue_svm_memcpy( ::boost::addressof(*result), first.get(), count * sizeof(T) ); return result + count; }
inline future<HostIterator> copy_to_host_async(svm_ptr<T> first, svm_ptr<T> last, HostIterator result, command_queue &queue) { size_t count = iterator_range_size(first, last); if(count == 0){ return result; } event event_ = queue.enqueue_svm_memcpy_async( ::boost::addressof(*result), first.get(), count * sizeof(T) ); return make_future(iterator_plus_distance(result, count), event_); }
inline future<svm_ptr<T> > copy_to_device_async(HostIterator first, HostIterator last, svm_ptr<T> result, command_queue &queue, const wait_list &events) { size_t count = iterator_range_size(first, last); if(count == 0){ return future<svm_ptr<T> >(); } event event_ = queue.enqueue_svm_memcpy_async( result.get(), ::boost::addressof(*first), count * sizeof(T), events ); return make_future(result + count, event_); }
inline svm_ptr<T> copy_to_device(HostIterator first, HostIterator last, svm_ptr<T> result, command_queue &queue, const wait_list &events) { size_t count = iterator_range_size(first, last); if(count == 0){ return result; } queue.enqueue_svm_memcpy( result.get(), ::boost::addressof(*first), count * sizeof(T), events ); return result + count; }
inline void svm_free(const context &context, svm_ptr<T> ptr) { clSVMFree(context.get(), ptr.get()); }
inline void svm_free(svm_ptr<T> ptr) { clSVMFree(ptr.get_context(), ptr.get()); }