40 #ifndef ECUDA_ALGO_FILL_HPP
41 #define ECUDA_ALGO_FILL_HPP
46 #include "../global.hpp"
47 #include "../iterator.hpp"
53 template<
class ForwardIterator,
typename T>
__HOST__ __DEVICE__ inline void fill( ForwardIterator first, ForwardIterator last,
const T& val );
58 namespace fill_device {
60 template<
class ForwardIterator,
typename T>
62 ForwardIterator first, ForwardIterator last,
67 while( first != last ) { *first = val; ++first; }
71 const bool isContiguous = ecuda::is_same<iterator_contiguity,ecuda::true_type>::value;
72 ECUDA_STATIC_ASSERT(isContiguous,CANNOT_FILL_RANGE_REPRESENTED_BY_NONCONTIGUOUS_DEVICE_ITERATOR);
76 CUDA_CALL( cudaMemset<value_type>( first.operator->(), val, static_cast<std::size_t>(n) ) );
80 template<
typename T,
typename P>
82 device_contiguous_block_iterator<T,P> first, device_contiguous_block_iterator<T,P> last,
87 while( first != last ) { *first = val; ++first; }
89 typedef device_contiguous_block_iterator<T,P> input_iterator_type;
91 if( first.get_offset() ) {
92 const int leading = first.get_width() - first.get_offset();
93 ::ecuda::fill( first.contiguous_begin(), first.contiguous_begin()+leading, val );
97 const int rows = n / first.get_width();
99 typedef typename ecuda::add_pointer<value_type>::type pointer_type;
100 CUDA_CALL( cudaMemset2D<value_type>( naked_cast<pointer_type>(first.operator->()), first.operator->().get_pitch(), val, first.get_width(), rows ) );
101 n -= rows * first.get_width();
102 if( n )
::ecuda::fill( first.contiguous_begin(), first.contiguous_begin()+n, val );
109 template<
class ForwardIterator,
typename T>
111 ForwardIterator first, ForwardIterator last,
117 while( first != last ) { *first = val; ++first; }
122 const bool isSomeKindOfContiguous =
123 ecuda::is_same<iterator_contiguity,ecuda::true_type>::value ||
124 ecuda::is_same<iterator_category,device_contiguous_block_iterator_tag>::value;
125 ECUDA_STATIC_ASSERT(isSomeKindOfContiguous,CANNOT_FILL_RANGE_REPRESENTED_BY_NONCONTIGUOUS_DEVICE_ITERATOR);
131 const value_type val2( val );
137 template<
class ForwardIterator,
typename T>
139 ForwardIterator first, ForwardIterator last,
155 template<
class ForwardIterator,
typename T>
base_type::iterator_category iterator_category
ecuda::false_type is_device_iterator
#define ECUDA_STATIC_ASSERT(x, msg)
base_type::difference_type difference_type
#define ECUDA_SUPPRESS_HD_WARNINGS
ECUDA_SUPPRESS_HD_WARNINGS __HOST__ __DEVICE__ void fill(ForwardIterator first, ForwardIterator last, const T &val)
ECUDA_SUPPRESS_HD_WARNINGS __HOST__ __DEVICE__ std::iterator_traits< Iterator >::difference_type distance(const Iterator &first, const Iterator &last)
base_type::value_type value_type
__HOST__ __DEVICE__ void fill(ForwardIterator first, ForwardIterator last, const T &val)