OpendTect  6.3
odmemory.h
Go to the documentation of this file.
1 #pragma once
2 /*
3 ________________________________________________________________________
4 
5  (C) dGB Beheer B.V.; (LICENSE) http://opendtect.org/OpendTect_license.txt
6  Author: K. Tingdahl
7  Date: Jan 2009
8 ________________________________________________________________________
9 
10 */
11 
12 #include "commondefs.h"
13 #include "paralleltask.h"
14 
15 template <class T> class ValueSeries;
16 
17 
18 namespace OD
19 {
21 }
22 
23 
24 
25 // 1M operations min per thread
26 #define mODMemMinThreadSize 131072
27 
28 namespace OD
29 {
30  template <class T> mGlobal(Basic) void memValueSet(T*,T,od_int64,
31  TaskRunner* taskrun=0);
32 }
33 
39 template <class T>
40 mClass(Basic) MemSetter : public ParallelTask
42 public:
43 
44  MemSetter();
45  MemSetter(T*,T val,od_int64 sz);
47 
48  typedef T (*ValueFunc)();
49  void setValueFunc(ValueFunc valfunc) { valfunc_ = valfunc; }
50  void setValue( const T& val ) { val_ = val; }
51  void setTarget( T* ptr ) { ptr_ = ptr; vs_ = 0; }
52  void setTarget( ValueSeries<T>& vs ) { ptr_ = vs.arr(); vs_ = &vs; }
53  void setSize( od_int64 sz ) { sz_ = sz; }
54 
55  uiString message() const { return tr("Value setter"); }
56  uiString nrDoneText() const { return sPosFinished(); }
57 
58 
59 protected:
60 
61  od_int64 nrIterations() const { return sz_; }
62  int minThreadSize() const { return mODMemMinThreadSize; }
63  bool setPtr(od_int64 start,od_int64 size);
64 
66  T* ptr_;
68  T val_;
69  ValueFunc valfunc_;
70 
71 private:
72 
73  bool doPrepare(int);
74  bool doWork(od_int64,od_int64,int);
75 
76 };
77 
78 
86 template <class T>
87 mClass(Basic) MemCopier : public ParallelTask
89 public:
90 
91  MemCopier();
92  MemCopier(T*,const T*,od_int64 sz);
93  MemCopier(T*,const ValueSeries<T>&,od_int64 sz);
94  MemCopier(ValueSeries<T>&,const T*,od_int64 sz);
96 
97  void setInput( const T* ptr ) { inptr_ = ptr; invs_ = 0; }
98  void setInput( const ValueSeries<T>& vs ) { inptr_ = vs.arr();
99  invs_ = &vs; }
100  void setOutput( T* ptr ) { outptr_ = ptr; outvs_ = 0; }
101  void setOutput( ValueSeries<T>& vs ) { outptr_ = vs.arr();
102  outvs_ = &vs; }
103  void setSize(od_int64 sz) { sz_ = sz; }
104 
105  uiString message() const { return tr("Value copier"); }
106  uiString nrDoneText() const { return sPosFinished(); }
107 
108 
109 protected:
110 
111  od_int64 nrIterations() const { return sz_; }
112  int minThreadSize() const { return mODMemMinThreadSize; }
113  inline bool setPtr(od_int64 start,od_int64 size);
114 
115  const T* inptr_;
120 
121 private:
122 
123  bool doPrepare(int);
124  bool doWork(od_int64,od_int64,int);
125 
126 };
127 
128 
133 template <class T>
136 public:
137  MemValReplacer();
138  MemValReplacer(T*,const T& fromval,const T& toval,od_int64 sz,
139  TypeSet<od_int64>* repids=0);
140  MemValReplacer(ValueSeries<T>&,const T& from,const T& to,
141  od_int64 sz,TypeSet<od_int64>* repids=0);
142 
143  void setFromValue(const T& val) { fromval_ = val; }
144  void setToValue(const T& val) { toval_ = val; }
145  void setPtr(T* ptr) { ptr_ = ptr; vs_ = 0; }
146  void setPtr(ValueSeries<T>& vs) { ptr_ = vs.arr(); vs_ = &vs; }
147  void setSize(od_int64 sz) { sz_ = sz; }
148 
149  uiString message() const { return tr("Value replacer"); }
150  uiString nrDoneText() const { return sPosFinished(); }
151 
152 
153 protected:
154 
155  od_int64 nrIterations() const { return sz_; }
156  int minThreadSize() const { return mODMemMinThreadSize; }
157  bool setPtr(od_int64 start,od_int64 size);
158 
160  T* ptr_;
166 
167 private:
168 
169  bool doPrepare(int);
170  bool doWork(od_int64,od_int64,int);
171  bool doFinish(bool yn);
172 };
173 
174 
175 #include "valseries.h"
176 
177 
178 template <class T> inline
180  : ptr_( 0 )
181  , vs_( 0 )
182  , sz_( -1 )
183  , valfunc_( 0 )
184 {}
185 
186 
187 template <class T> inline
188 MemSetter<T>::MemSetter( T* ptr, T val, od_int64 sz )
189  : ptr_( ptr )
190  , vs_( 0 )
191  , val_( val )
192  , sz_( sz )
193  , valfunc_( 0 )
194 {}
195 
196 
197 template <class T> inline
199  : ptr_( vs.arr() )
200  , vs_( &vs )
201  , val_( val )
202  , sz_( sz )
203  , valfunc_( 0 )
204 {}
205 
206 
207 template <class T> inline
209 { return ptr_ || vs_; }
210 
211 
212 template <class T> inline
213 bool MemSetter<T>::doWork( od_int64 start, od_int64 stop, int )
214 {
215  if ( ptr_ )
216  {
217  if ( valfunc_ )
218  {
219  T* ptr = ptr_+start;
220  T* stopptr = ptr_+stop;
221  while ( ptr<=stopptr )
222  {
223  *ptr = valfunc_();
224  ptr++;
225  }
226 
227  return true;
228  }
229  else
230  {
231  return setPtr( start, stop-start+1 );
232  }
233  }
234 
235  if ( valfunc_ )
236  {
237  for ( od_int64 idx=start; idx<=stop; idx++ )
238  { vs_->setValue( idx, valfunc_() ); }
239  }
240  else
241  {
242  for ( od_int64 idx=start; idx<=stop; idx++ )
243  { vs_->setValue( idx, val_ ); }
244  }
245 
246  return true;
247 }
248 
249 
250 template <> inline
252 {
253  OD::memSet( ptr_+start, (int)val_, (size_t) size );
254  addToNrDone( size );
255  return true;
256 }
257 
258 
259 template <> inline
261 {
262  OD::memSet( ptr_+start, (int)val_, (size_t) size );
263  addToNrDone( size );
264  return true;
265 }
266 
267 
268 template <> inline
270 {
271  OD::memSet( ptr_+start, (int)val_, (size_t) size );
272  addToNrDone( size );
273  return true;
274 }
275 
276 
277 #define mODMemSetterFullImpl(Type) \
278  Type* ptr = ptr_ + start; \
279  const Type* stopptr = ptr + size; \
280  while ( ptr != stopptr ) \
281  { \
282  *ptr = val_; \
283  ptr++; \
284  } \
285  \
286  return true;
287 
288 
289 #define mODMemSpecialImpl( Type ) \
290 template <> inline \
291 bool MemSetter<Type>::setPtr( od_int64 start, od_int64 size ) \
292 { \
293  if ( val_==0 ) \
294  { \
295  OD::memZero( ptr_+start, size*sizeof(Type) ); \
296  addToNrDone( size ); \
297  return true; \
298  } \
299  \
300  mODMemSetterFullImpl(Type); \
301 }
302 
303 
307 mODMemSpecialImpl( unsigned int );
309 mODMemSpecialImpl( unsigned short );
312 
313 
314 
315 template <class T> inline
317 {
319 }
320 
321 #undef mODMemSpecialImpl
322 #undef mODMemSetterFullImpl
323 
324 
325 template <class T> inline
327  : sz_(0), inptr_(0), invs_(0), outptr_(0), outvs_(0) {}
328 
329 template <class T> inline
330 MemCopier<T>::MemCopier( T* o, const T* i, od_int64 sz )
331  : sz_(sz), inptr_(i), invs_(0), outptr_(o), outvs_(0) {}
332 
333 template <class T> inline
335  : sz_(sz), inptr_(i), invs_(0), outptr_(o.arr()), outvs_(&o) {}
336 
337 template <class T> inline
339  : sz_(sz), inptr_(i.arr()), invs_(&i), outptr_(o), outvs_(0) {}
340 
341 template <class T> inline
343  od_int64 sz)
344  : sz_(sz), inptr_(i.arr), invs_(&i), outptr_(o.arr()), outvs_(&o) {}
345 
346 
347 template <class T> inline
349 { return (inptr_ || invs_) && (outptr_ || outvs_); }
350 
351 
352 template <class T> inline
353 bool MemCopier<T>::doWork( od_int64 start, od_int64 stop, int )
354 {
355  if ( inptr_ && outptr_ )
356  return setPtr( start, stop-start+1 );
357 
358  if ( outptr_ )
359  {
360  for ( od_int64 idx=start; idx<=stop; idx++ )
361  { outptr_[idx] = invs_->value( idx ); }
362  }
363  else if ( inptr_ )
364  {
365  for ( od_int64 idx=start; idx<=stop; idx++ )
366  { outvs_->setValue( idx, inptr_[idx] ); }
367  }
368  else
369  {
370  for ( od_int64 idx=start; idx<=stop; idx++ )
371  { outvs_->setValue( idx, invs_->value(idx)); }
372  }
373  return true;
374 }
375 
376 
377 
378 namespace OD { mGlobal(Basic) void sysMemSet(void*,char,od_int64); }
379 namespace OD { mGlobal(Basic) void sysMemCopy(void*,const void*,od_int64); }
380 
381 template <class T> inline
383 {
384  OD::sysMemCopy( outptr_+start, inptr_+start, size * sizeof(T) );
385  addToNrDone( size );
386  return true;
387 }
388 
389 
390 template <class T> inline
391 MemValReplacer<T>::MemValReplacer( T* ptr, const T& fromval, const T& toval,
392  od_int64 sz, TypeSet<od_int64>* repids )
393  : ptr_( ptr )
394  , vs_( 0 )
395  , fromval_( fromval )
396  , toval_( toval )
397  , sz_( sz )
398  , repids_(repids)
399 {}
400 
401 
402 template <class T> inline
404  const T& toval,
405  od_int64 sz, TypeSet<od_int64>* repids )
406  : ptr_( vs.arr() )
407  , vs_( &vs )
408  , toval_( toval )
409  , fromval_( fromval )
410  , sz_( sz )
411  , repids_(repids)
412 {}
413 
414 
415 template <class T> inline
416 bool MemValReplacer<T>::doPrepare( int nrthreds )
417 {
418  if ( repids_ )
419  threadrepids_.setSize( nrthreds );
420 
421  return ptr_ || vs_;
422 }
423 
424 
425 template <class T> inline
426 bool MemValReplacer<T>::doWork( od_int64 start, od_int64 stop, int thread )
427 {
428  if ( ptr_ )
429  {
430  if ( !repids_ )
431  return setPtr( start, stop-start+1 );
432  else
433  {
434  for ( od_int64 idx=start; idx<=stop; idx++ )
435  {
436  if ( ptr_[idx]==fromval_ )
437  {
438  ptr_[idx] = toval_;
439  threadrepids_[thread] += idx;
440  }
441  }
442  return true;
443  }
444  }
445 
446  for ( od_int64 idx=start; idx<=stop; idx++ )
447  {
448  if ( vs_->value(idx)==fromval_ )
449  {
450  vs_->setValue( idx, toval_ );
451  if ( repids_ )
452  threadrepids_[thread] += idx;
453  }
454  }
455 
456  return true;
457 }
458 
459 template <class T> inline
461 {
462  if ( repids_ )
463  {
464  repids_->erase();
465  for ( int idx=0; idx<threadrepids_.size(); idx++ )
466  {
467  for ( int idy=0; idy<threadrepids_[idx].size(); idy++ )
468  repids_->add( threadrepids_[idx][idy] );
469  }
470  }
471 
472  return yn;
473 }
474 
475 
476 template <class T> inline
478 {
479  T* ptr = ptr_ + start;
480  const T* stopptr = ptr + size;
481  while ( ptr != stopptr )
482  {
483  if ( *ptr==fromval_ )
484  *ptr = toval_;
485 
486  ptr++;
487  }
488 
489  return true;
490 }
491 
492 
493 
495 #define cMinMemValSetParallelSize 400
496 
497 namespace OD
498 {
499 
500 template <class T>
501 inline void memValueSet( T* arr, T val , od_int64 sz, TaskRunner* taskrun )
502 {
503  if ( !arr || sz<=0 )
504  return;
505 
506  if ( sz > cMinMemValSetParallelSize )
507  {
508  MemSetter<T> msetter( arr, val, sz );
509  taskrun ? taskrun->execute( msetter )
510  : msetter.execute();
511  }
512  else
513  {
514  const T* stopptr = arr + sz;
515  for ( T* curptr=arr; curptr!=stopptr; curptr++ )
516  *curptr = val;
517  }
518 }
519 
520 } // namespace OD
uiString message() const
Definition: odmemory.h:55
bool doWork(int64_t, int64_t, int)
Definition: odmemory.h:353
T val_
Definition: odmemory.h:68
int64_t sz_
Definition: odmemory.h:67
T toval_
Definition: odmemory.h:162
bool doPrepare(int)
Definition: odmemory.h:208
T to(const F &fr)
Definition: convert.h:31
ValueSeries< T > * vs_
Definition: odmemory.h:65
Sets large amounts of values to a constant using multiple threads.
Definition: odmemory.h:40
#define mODTextTranslationClass(clss)
Definition: uistring.h:37
#define mGlobal(module)
Definition: commondefs.h:160
#define od_int64
Definition: plftypes.h:34
int minThreadSize() const
Definition: odmemory.h:62
void setToValue(const T &val)
Definition: odmemory.h:144
TypeSetBase< T, I > & add(const T &)
Definition: typeset.h:344
int64_t nrIterations() const
Definition: odmemory.h:61
ValueFunc valfunc_
Definition: odmemory.h:69
TypeSet< int64_t > * repids_
Definition: odmemory.h:164
static bool execute(TaskRunner *tskr, Task &)
Taskrunner may be zero.
Definition: uistring.h:88
Goes through some mem or a ValSeries and replaces one value with another.
Definition: odmemory.h:134
void setTarget(ValueSeries< T > &vs)
Definition: odmemory.h:52
void setOutput(ValueSeries< T > &vs)
Definition: odmemory.h:101
void setSize(int64_t sz)
Definition: odmemory.h:103
Generalization of a task that can be run in parallel.
Definition: paralleltask.h:64
#define mODMemSetterFullImpl(Type)
Definition: odmemory.h:277
uiString nrDoneText() const
Definition: odmemory.h:106
int64_t sz_
Definition: odmemory.h:161
uiString nrDoneText() const
Definition: odmemory.h:56
MemSetter()
Definition: odmemory.h:179
int minThreadSize() const
Definition: odmemory.h:112
void setSize(int64_t sz)
Definition: odmemory.h:147
bool doPrepare(int)
Definition: odmemory.h:348
void setInput(const ValueSeries< T > &vs)
Definition: odmemory.h:98
Class that can execute a task.
Definition: task.h:193
bool setPtr(int64_t start, int64_t size)
Definition: odmemory.h:316
#define mODMemMinThreadSize
Definition: odmemory.h:26
const T * inptr_
Definition: odmemory.h:115
bool execute()
Definition: paralleltask.h:69
Interface to a series of values.
Definition: odmemory.h:15
Definition: odmemory.h:20
void setPtr(T *ptr)
Definition: odmemory.h:145
T * ptr_
Definition: odmemory.h:66
bool setPtr(int64_t start, int64_t size)
Definition: odmemory.h:382
TypeSet< TypeSet< int64_t > > threadrepids_
Definition: odmemory.h:165
int64_t nrIterations() const
Definition: odmemory.h:155
void setValueFunc(ValueFunc valfunc)
Definition: odmemory.h:49
void setOutput(T *ptr)
Definition: odmemory.h:100
void memValueSet(T *, T, int64_t, TaskRunner *taskrun=0)
Definition: odmemory.h:501
T * outptr_
Definition: odmemory.h:117
ValueSeries< T > * outvs_
Definition: odmemory.h:118
void setInput(const T *ptr)
Definition: odmemory.h:97
int64_t nrIterations() const
Definition: odmemory.h:111
int minThreadSize() const
Definition: odmemory.h:156
uiString message() const
Definition: odmemory.h:149
#define cMinMemValSetParallelSize
size determined experimentally on different Linux and Windows systems
Definition: odmemory.h:495
void setPtr(ValueSeries< T > &vs)
Definition: odmemory.h:146
bool doFinish(bool yn)
Definition: odmemory.h:460
#define od_uint64
Definition: plftypes.h:35
ValueSeries< T > * vs_
Definition: odmemory.h:159
void sysMemCopy(void *, const void *, int64_t)
int64_t sz_
Definition: odmemory.h:119
size_type size() const
Definition: typeset.h:263
uiString message() const
Definition: odmemory.h:105
MemCopier()
Definition: odmemory.h:326
T * ptr_
Definition: odmemory.h:160
virtual void erase()
Definition: typeset.h:360
OpendTect.
Definition: commontypes.h:25
PtrPolicy
Definition: odmemory.h:20
T fromval_
Definition: odmemory.h:163
bool doWork(int64_t, int64_t, int)
Definition: odmemory.h:426
virtual bool setSize(size_type, T val=T())
Definition: typeset.h:267
ValueSeries Copier.
Definition: odmemory.h:87
const ValueSeries< T > * invs_
Definition: odmemory.h:116
void setSize(int64_t sz)
Definition: odmemory.h:53
#define mClass(module)
Definition: commondefs.h:161
bool doWork(int64_t, int64_t, int)
Definition: odmemory.h:213
Definition: odmemory.h:20
void addToNrDone(int64_t increment)
virtual T * arr()
Definition: valseries.h:48
void setTarget(T *ptr)
Definition: odmemory.h:51
void sysMemSet(void *, char, int64_t)
#define mODMemSpecialImpl(Type)
Definition: odmemory.h:289
void setValue(const T &val)
Definition: odmemory.h:50
Definition: odmemory.h:20
bool doPrepare(int)
Definition: odmemory.h:416
uiString nrDoneText() const
Definition: odmemory.h:150
void setFromValue(const T &val)
Definition: odmemory.h:143

Generated at for the OpendTect seismic interpretation project. Copyright (C): dGB Beheer B. V. 2017