17#include <TRUSTArray.h>
20#include <DeviceMemory.h>
24#include <Perf_counters.h>
28template <
typename _TYPE_,
typename _SIZE_>
37 const _TYPE_* v = span_.data();
44template <
typename _TYPE_,
typename _SIZE_>
56 _TYPE_* v = span_.data();
62 Cerr <<
"Error in TRUSTArray:readOn : size = " << sz << finl;
78template <
typename _TYPE_,
typename _SIZE_>
81 assert(new_size >= 0);
92 if(new_size == 0)
return;
95 if(storage_type_ == STORAGE::TEMP_STORAGE)
98 mem_ = std::make_shared<Vector_>(
Vector_(new_size));
100 span_ =
Span_(*mem_);
103 if (isAllocatedOnDevice(mem_->data()))
104 data_location_ = std::make_shared<DataLocation>(DataLocation::Device);
106 data_location_ = std::make_shared<DataLocation>(DataLocation::HostOnly);
108 if(opt == RESIZE_OPTIONS::COPY_INIT)
118 _SIZE_ sz_arr = size_array();
119 if(new_size != sz_arr)
121 assert(ref_count() == 1);
123 if (storage_type_ == STORAGE::TEMP_STORAGE)
126 assert( (std::is_same<trustIdType, int>::value || !std::is_same<_SIZE_, trustIdType>::value) );
130 _SIZE_ mem_sz = (_SIZE_)mem_->size();
131 if (new_size <= mem_sz)
134 span_ = Span_(span_.begin(), span_.begin()+new_size);
136 if (new_size > sz_arr && opt == RESIZE_OPTIONS::COPY_INIT)
139 std::fill(span_.begin() + sz_arr, span_.end(), (_TYPE_) 0);
146 span_ = Span_(*mem_);
147 if (opt == RESIZE_OPTIONS::COPY_INIT)
150 std::fill(span_.begin() + sz_arr, span_.end(), (_TYPE_) 0);
157 bool onDevice = isAllocatedOnDevice(*
this);
161 copyFromDevice(*
this);
162 _TYPE_ * prev_ad = span_.data();
163 deleteOnDevice(prev_ad, sz_arr);
164 set_data_location(DataLocation::HostOnly);
167 mem_->resize(new_size);
168 span_ = Span_(*mem_);
170 if (new_size > sz_arr && opt == RESIZE_OPTIONS::COPY_INIT)
171 std::fill(span_.begin()+sz_arr, span_.end(), (_TYPE_) 0);
194template <
typename _TYPE_,
typename _SIZE_>
197 assert(&source !=
this && nb_elements >= -1);
198 assert(first_element_dest >= 0 && first_element_source >= 0);
200 if (nb_elements < 0) nb_elements = source.
size_array();
202 assert(first_element_source + nb_elements <= source.
size_array());
203 assert(first_element_dest + nb_elements <=
size_array());
209 if (statistics().get_use_gpu() && nb_elements>100) start_gpu_timer(__KERNEL_NAME__);
214 const auto addr_source = source.view_ro<1>();
215 auto addr_dest = view_rw<1>();
216 Kokkos::parallel_for(__KERNEL_NAME__, nb_elements, KOKKOS_LAMBDA(
const _SIZE_ i) { addr_dest[first_element_dest+i] = addr_source[first_element_source+i]; });
222 const _TYPE_ * addr_source = source.span_.data() + first_element_source;
223 _TYPE_ * addr_dest = span_.data() + first_element_dest;
224 memcpy(addr_dest, addr_source, nb_elements *
sizeof(_TYPE_));
227 Cerr <<
"[Host] Filling a large TRUSTArray (" << nb_elements <<
" items) which is slow during a GPU run! Set a breakpoint to fix." << finl;
231 if (statistics().get_use_gpu() && nb_elements>100) end_gpu_timer(__KERNEL_NAME__, kernelOnDevice);
237template<
typename _TYPE_,
typename _SIZE_>
238template<
typename _TAB_>
239void TRUSTArray<_TYPE_, _SIZE_>::ref_conv_helper_(_TAB_& out)
const
245 out.data_location_ = data_location_;
246 out.storage_type_ = storage_type_;
256 ref_conv_helper_(out);
259template<
typename _TYPE_,
typename _SIZE_>
264 Process::exit(
"TRUSTArray<>::ref_as_big() should not be used with those current template types.");
275 assert(
size_array() < std::numeric_limits<int>::max());
276 ref_conv_helper_(out);
283 assert(
size_array() < std::numeric_limits<int>::max());
284 ref_conv_helper_(out);
287template<
typename _TYPE_,
typename _SIZE_>
292 Process::exit(
"TRUSTArray<>::ref_as_big() should not be used with those current template types.");
302 assert(
size_array() < std::numeric_limits<int>::max());
308 assert(( *std::min_element(span_.begin(), span_.end()) > std::numeric_limits<int>::min() ));
309 assert(( *std::max_element(span_.begin(), span_.end()) < std::numeric_limits<int>::max() ));
312 std::copy(span_.begin(), span_.end(), out.span_.begin());
315template<
typename _TYPE_,
typename _SIZE_>
320 Process::exit(
"TRUSTArray<>::from_tid_to_int() should not be used with those current template types.");
326template <
typename _TYPE_,
typename _SIZE_>
332 if (statistics().get_use_gpu() && size>100) start_gpu_timer(__KERNEL_NAME__);
337 auto data = view_rw<1>();
338 Kokkos::parallel_for(__KERNEL_NAME__, size, KOKKOS_LAMBDA(
const int i) {
data[i] = x; });
343 _TYPE_ *data = span_.data();
344 for (_SIZE_ i = 0; i < size; i++) data[i] = x;
347 if (statistics().get_use_gpu() && size>100) end_gpu_timer(__KERNEL_NAME__, kernelOnDevice);
354template <
typename _TYPE_,
typename _SIZE_>
361 if (statistics().get_use_gpu() && size>100) start_gpu_timer(__KERNEL_NAME__);
366 const auto dy = y.view_ro<1>();
367 auto dx = view_rw<1>();
368 Kokkos::parallel_for(__KERNEL_NAME__, size, KOKKOS_LAMBDA(
const _SIZE_ i) { dx[i] += dy[i]; });
373 const _TYPE_* dy = y.span_.data();
374 _TYPE_* dx = span_.data();
375 for (_SIZE_ i = 0; i < size; i++) dx[i] += dy[i];
378 if (statistics().get_use_gpu() && size>100) end_gpu_timer(__KERNEL_NAME__, kernelOnDevice);
385template <
typename _TYPE_,
typename _SIZE_>
391 if (statistics().get_use_gpu() && size>100) start_gpu_timer(__KERNEL_NAME__);
396 auto data = view_rw<1>();
397 Kokkos::parallel_for(__KERNEL_NAME__, size, KOKKOS_LAMBDA(
const _SIZE_ i) {
data[i] += dy; });
402 _TYPE_ *
data = span_.data();
403 for(_SIZE_ i = 0; i < size; i++)
data[i] += dy;
406 if (statistics().get_use_gpu() && size>100) end_gpu_timer(__KERNEL_NAME__, kernelOnDevice);
413template <
typename _TYPE_,
typename _SIZE_>
420 if (statistics().get_use_gpu() && size>100) start_gpu_timer(__KERNEL_NAME__);
425 auto data = view_rw<1>();
426 const auto data_y = y.view_ro<1>();
427 Kokkos::parallel_for(__KERNEL_NAME__, size, KOKKOS_LAMBDA(
const _SIZE_ i) {
data[i] -= data_y[i]; });
432 _TYPE_ *
data = span_.data();
433 const _TYPE_ * data_y = y.span_.data();
434 for (_SIZE_ i = 0; i < size; i++)
data[i] -= data_y[i];
437 if (statistics().get_use_gpu() && size>100) end_gpu_timer(__KERNEL_NAME__, kernelOnDevice);
444template <
typename _TYPE_,
typename _SIZE_>
453template <
typename _TYPE_,
typename _SIZE_>
459 if (statistics().get_use_gpu() && size>100) start_gpu_timer(__KERNEL_NAME__);
464 auto data = view_rw<1>();
465 Kokkos::parallel_for(__KERNEL_NAME__, size, KOKKOS_LAMBDA(
const _SIZE_ i) {
data[i] *= dy; });
470 _TYPE_ *
data = span_.data();
471 for(_SIZE_ i=0; i < size; i++)
data[i] *= dy;
474 if (statistics().get_use_gpu() && size>100) end_gpu_timer(__KERNEL_NAME__, kernelOnDevice);
481template <
typename _TYPE_,
typename _SIZE_>
484 if (std::is_integral<_TYPE_>::value)
throw;
virtual int get(int *ob, std::streamsize n)
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
virtual int put(const unsigned *ob, std::streamsize n, std::streamsize nb_colonnes=1)
Represents a an array of int/int64/double/... values.
void from_tid_to_int(TRUSTArray< int, int > &out) const
void resize_array_(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
TRUSTArray & operator*=(const _TYPE_ dy)
_SIZE_ size_array() const
TRUSTArray & operator/=(const _TYPE_ dy)
TRUSTArray & inject_array(const TRUSTArray &source, _SIZE_ nb_elements=-1, _SIZE_ first_element_dest=0, _SIZE_ first_element_source=0)
void ref_as_big(TRUSTArray< _TYPE_, trustIdType > &out) const
TRUSTArray & operator+=(const TRUSTArray &y)
TRUSTArray & operator-=(const TRUSTArray &y)
void ref_as_small(TRUSTArray< _TYPE_, int > &out) const
std::vector< int, TVAlloc< int > > Vector_
TRUSTArray & operator=(const TRUSTArray &)
Entree & readOn(Entree &is) override
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Sortie & printOn(Sortie &os) const override
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
static block_ptr_t GetFreeBlock(int sz)
static block_ptr_t ResizeBlock(block_ptr_t p, int new_sz)
static bool warning(trustIdType nb_items)