OpendTect  6.6
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  RCS: $Id$
9 ________________________________________________________________________
10 
11 */
12 
13 #include "commondefs.h"
14 #include "paralleltask.h"
15 
16 template <class T> class ValueSeries;
17 
18 
19 namespace OD
20 {
22 }
23 
24 
25 
26 // 1M operations min per thread
27 #define mODMemMinThreadSize 131072
28 
29 namespace OD
30 {
31  template <class T> mGlobal(Basic) void memValueSet(T*,T,od_int64,
32  TaskRunner* taskrun=0);
33 }
34 
40 template <class T>
41 mClass(Basic) MemSetter : public ParallelTask
43 public:
44 
45  MemSetter();
46  MemSetter(T*,T val,od_int64 sz);
48 
49  typedef T (*ValueFunc)();
50  void setValueFunc(ValueFunc valfunc) { valfunc_ = valfunc; }
51  void setValue( const T& val ) { val_ = val; }
52  void setTarget( T* ptr ) { ptr_ = ptr; vs_ = 0; }
53  void setTarget( ValueSeries<T>& vs ) { ptr_ = vs.arr(); vs_ = &vs; }
54  void setSize( od_int64 sz ) { sz_ = sz; }
55 
56  uiString uiMessage() const { return tr("Value setter"); }
57  uiString uiNrDoneText() const { return sPosFinished(); }
58 
59 
60 protected:
61 
62  od_int64 nrIterations() const { return sz_; }
63  int minThreadSize() const { return mODMemMinThreadSize; }
64  bool setPtr(od_int64 start,od_int64 size);
65 
67  T* ptr_;
69  T val_;
70  ValueFunc valfunc_;
71 
72 private:
73 
74  bool doPrepare(int);
75  bool doWork(od_int64,od_int64,int);
76 
77 };
78 
79 
87 template <class T>
88 mClass(Basic) MemCopier : public ParallelTask
90 public:
91 
92  MemCopier();
93  MemCopier(T*,const T*,od_int64 sz);
94  MemCopier(T*,const ValueSeries<T>&,od_int64 sz);
95  MemCopier(ValueSeries<T>&,const T*,od_int64 sz);
97 
98  void setInput( const T* ptr ) { inptr_ = ptr; invs_ = 0; }
99  void setInput( const ValueSeries<T>& vs ) { inptr_ = vs.arr();
100  invs_ = &vs; }
101  void setOutput( T* ptr ) { outptr_ = ptr; outvs_ = 0; }
102  void setOutput( ValueSeries<T>& vs ) { outptr_ = vs.arr();
103  outvs_ = &vs; }
104  void setSize(od_int64 sz) { sz_ = sz; }
105 
106  uiString uiMessage() const { return tr("Value copier"); }
107  uiString uiNrDoneText() const { return sPosFinished(); }
108 
109 
110 protected:
111 
112  od_int64 nrIterations() const { return sz_; }
113  int minThreadSize() const { return mODMemMinThreadSize; }
114  inline bool setPtr(od_int64 start,od_int64 size);
115 
116  const T* inptr_;
121 
122 private:
123 
124  bool doPrepare(int);
125  bool doWork(od_int64,od_int64,int);
126 
127 };
128 
129 
134 template <class T>
137 public:
139  MemValReplacer(T*,const T& fromval,const T& toval,od_int64 sz);
140  MemValReplacer(ValueSeries<T>&,const T& from,const T& to,
141  od_int64 sz);
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 uiMessage() const { return tr("Value replacer"); }
150  uiString uiNrDoneText() 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_;
164 
165 private:
166 
167  bool doPrepare(int);
168  bool doWork(od_int64,od_int64,int);
169 
170 };
171 
172 
173 namespace OD { mGlobal(Basic) void sysMemCopy(void*,const void*,od_int64); }
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 namespace OD
251 {
252  mGlobal(Basic) void sysMemSet(void*,int,size_t);
253 
254  template <class T> mGlobal(Basic) T* sysMemValueSet(T*,T,od_int64 nrsamp);
255 }
256 
257 template <> inline
259 {
260  OD::sysMemSet( ptr_+start, (int)val_, (size_t) size );
261  addToNrDone( size );
262  return true;
263 }
264 
265 
266 template <> inline
268 {
269  OD::sysMemSet( ptr_+start, (int)val_, (size_t) size );
270  addToNrDone( size );
271  return true;
272 }
273 
274 
275 template <> inline
277 {
278  OD::sysMemSet( ptr_+start, (int)val_, (size_t) size );
279  addToNrDone( size );
280  return true;
281 }
282 
283 
284 #define mODMemSetterFullImpl(Type) \
285  Type* ptr = ptr_ + start; \
286  const Type* stopptr = ptr + size; \
287  while ( ptr != stopptr ) \
288  { \
289  *ptr = val_; \
290  ptr++; \
291  } \
292  \
293  return true;
294 
295 
296 namespace OD { mGlobal(Basic) void sysMemZero(void*,size_t); }
297 
298 #define mODMemSpecialImpl( Type ) \
299 template <> inline \
300 bool MemSetter<Type>::setPtr( od_int64 start, od_int64 size ) \
301 { \
302  if ( val_==0 ) \
303  OD::sysMemZero( ptr_+start, size*sizeof(Type) ); \
304  else \
305  OD::sysMemValueSet( ptr_+start, val_, size ); \
306  \
307  addToNrDone( size ); \
308  return true; \
309 }
310 
311 
315 mODMemSpecialImpl( unsigned int );
317 mODMemSpecialImpl( unsigned short );
320 
321 
322 
323 template <class T> inline
325 {
326  OD::sysMemValueSet( ptr_+start, val_, size );
327  addToNrDone( size );
328  return true;
329 }
330 
331 #undef mODMemSpecialImpl
332 #undef mODMemSetterFullImpl
333 
334 
335 template <class T> inline
337  : sz_(0), inptr_(0), invs_(0), outptr_(0), outvs_(0) {}
338 
339 template <class T> inline
340 MemCopier<T>::MemCopier( T* o, const T* i, od_int64 sz )
341  : sz_(sz), inptr_(i), invs_(0), outptr_(o), outvs_(0) {}
342 
343 template <class T> inline
345  : sz_(sz), inptr_(i), invs_(0), outptr_(o.arr()), outvs_(&o) {}
346 
347 template <class T> inline
349  : sz_(sz), inptr_(i.arr()), invs_(&i), outptr_(o), outvs_(0) {}
350 
351 template <class T> inline
353  od_int64 sz)
354  : sz_(sz), inptr_(i.arr), invs_(&i), outptr_(o.arr()), outvs_(&o) {}
355 
356 
357 template <class T> inline
359 { return (inptr_ || invs_) && (outptr_ || outvs_); }
360 
361 
362 template <class T> inline
363 bool MemCopier<T>::doWork( od_int64 start, od_int64 stop, int )
364 {
365  if ( inptr_ && outptr_ )
366  return setPtr( start, stop-start+1 );
367 
368  if ( outptr_ )
369  {
370  for ( od_int64 idx=start; idx<=stop; idx++ )
371  { outptr_[idx] = invs_->value( idx ); }
372  }
373  else if ( inptr_ )
374  {
375  for ( od_int64 idx=start; idx<=stop; idx++ )
376  { outvs_->setValue( idx, inptr_[idx] ); }
377  }
378  else
379  {
380  for ( od_int64 idx=start; idx<=stop; idx++ )
381  { outvs_->setValue( idx, invs_->value(idx)); }
382  }
383  return true;
384 }
385 
386 
387 
388 template <class T> inline
390 {
391  OD::sysMemCopy( outptr_+start, inptr_+start, size * sizeof(T) );
392  addToNrDone( size );
393  return true;
394 }
395 
396 
397 template <class T> inline
398 MemValReplacer<T>::MemValReplacer( T* ptr, const T& fromval, const T& toval,
399  od_int64 sz )
400  : ptr_( ptr )
401  , vs_( 0 )
402  , fromval_( fromval )
403  , toval_( toval )
404  , sz_( sz )
405 {}
406 
407 
408 template <class T> inline
410  const T& toval,
411  od_int64 sz)
412  : ptr_( vs.arr() )
413  , vs_( &vs )
414  , toval_( toval )
415  , fromval_( fromval )
416  , sz_( sz )
417 {}
418 
419 
420 template <class T> inline
422 { return ptr_ || vs_; }
423 
424 
425 template <class T> inline
427 {
428  if ( ptr_ )
429  return setPtr( start, stop-start+1 );
430 
431  for ( od_int64 idx=start; idx<=stop; idx++ )
432  {
433  if ( vs_->value(idx)==fromval_ )
434  vs_->setValue( idx, toval_ );
435  }
436 
437  return true;
438 }
439 
440 template <class T> inline
442 {
443  T* ptr = ptr_ + start;
444  const T* stopptr = ptr + size;
445  while ( ptr != stopptr )
446  {
447  if ( *ptr==fromval_ )
448  *ptr = toval_;
449 
450  ptr++;
451  }
452 
453  return true;
454 }
455 
456 
457 
459 #define cMinMemValSetParallelSize 400
460 
461 namespace OD
462 {
463 
464 template <class T>
465 inline T* sysMemValueSet( T* ptr, T val , od_int64 size )
466 {
467  if ( !ptr || size<=0 )
468  return ptr ? ptr : 0;
469 
470  const T* stopptr = ptr + size;
471  while ( ptr != stopptr )
472  *ptr++ = val;
473 
474  return ptr;
475 }
476 
477 
478 template <class T>
479 inline void memValueSet( T* arr, T val , od_int64 sz, TaskRunner* taskrun )
480 {
481  if ( sz < cMinMemValSetParallelSize )
482  {
483  sysMemValueSet( arr, val, sz );
484  return;
485  }
486 
487  MemSetter<T> msetter( arr, val, sz );
488  taskrun ? taskrun->execute( msetter )
489  : msetter.execute();
490 }
491 
492 } // namespace OD
493 
494 
ValueSeries
Interface to a series of values.
Definition: odmemory.h:16
MemValReplacer::sz_
int64_t sz_
Definition: odmemory.h:161
MemCopier::uiNrDoneText
uiString uiNrDoneText() const
will be nrDoneText() in 7.x
Definition: odmemory.h:107
MemValReplacer::doWork
bool doWork(int64_t, int64_t, int)
Definition: odmemory.h:426
od_uint64
#define od_uint64
Definition: plftypes.h:36
MemSetter::setPtr
bool setPtr(int64_t start, int64_t size)
Definition: odmemory.h:324
TaskRunner::execute
static bool execute(TaskRunner *tr, Task &)
Taskrunner may be zero.
OD::sysMemZero
void sysMemZero(void *, size_t)
MemCopier
ValueSeries Copier.
Definition: odmemory.h:89
OD::memValueSet
void memValueSet(T *, T, int64_t, TaskRunner *taskrun=0)
Definition: odmemory.h:479
MemValReplacer::setPtr
void setPtr(T *ptr)
Definition: odmemory.h:145
MemValReplacer::setToValue
void setToValue(const T &val)
Definition: odmemory.h:144
MemSetter::setValueFunc
void setValueFunc(ValueFunc valfunc)
Definition: odmemory.h:50
mODMemMinThreadSize
#define mODMemMinThreadSize
Definition: odmemory.h:27
MemCopier::outptr_
T * outptr_
Definition: odmemory.h:118
MemValReplacer::vs_
ValueSeries< T > * vs_
Definition: odmemory.h:159
Conv::to
T to(const F &fr)
Definition: convert.h:34
mGlobal
#define mGlobal(module)
Definition: commondefs.h:180
ParallelTask::execute
bool execute()
Definition: paralleltask.h:70
MemValReplacer::setPtr
void setPtr(ValueSeries< T > &vs)
Definition: odmemory.h:146
valseries.h
commondefs.h
od_int64
#define od_int64
Definition: plftypes.h:35
MemSetter::setTarget
void setTarget(T *ptr)
Definition: odmemory.h:52
MemValReplacer::ptr_
T * ptr_
Definition: odmemory.h:160
OD
OpendTect.
Definition: commontypes.h:28
MemSetter::setTarget
void setTarget(ValueSeries< T > &vs)
Definition: odmemory.h:53
MemSetter::setValue
void setValue(const T &val)
Definition: odmemory.h:51
MemCopier::MemCopier
MemCopier()
Definition: odmemory.h:336
OD::UsePtr
@ UsePtr
Definition: odmemory.h:21
MemCopier::setPtr
bool setPtr(int64_t start, int64_t size)
Definition: odmemory.h:389
MemSetter::MemSetter
MemSetter()
Definition: odmemory.h:179
MemCopier::setOutput
void setOutput(T *ptr)
Definition: odmemory.h:101
MemCopier::outvs_
ValueSeries< T > * outvs_
Definition: odmemory.h:119
MemCopier::setInput
void setInput(const T *ptr)
Definition: odmemory.h:98
MemSetter::setSize
void setSize(int64_t sz)
Definition: odmemory.h:54
mODTextTranslationClass
#define mODTextTranslationClass(clss)
Definition: uistring.h:40
MemValReplacer::doPrepare
bool doPrepare(int)
Definition: odmemory.h:421
MemValReplacer::setFromValue
void setFromValue(const T &val)
Definition: odmemory.h:143
MemValReplacer::uiNrDoneText
uiString uiNrDoneText() const
will be nrDoneText() in 7.x
Definition: odmemory.h:150
MemSetter::doWork
bool doWork(int64_t, int64_t, int)
Definition: odmemory.h:213
MemSetter::vs_
ValueSeries< T > * vs_
Definition: odmemory.h:66
MemCopier::nrIterations
int64_t nrIterations() const
Definition: odmemory.h:112
mClass
#define mClass(module)
Definition: commondefs.h:181
MemCopier::doPrepare
bool doPrepare(int)
Definition: odmemory.h:358
MemValReplacer::setSize
void setSize(int64_t sz)
Definition: odmemory.h:147
MemSetter::sz_
int64_t sz_
Definition: odmemory.h:68
TaskRunner
Class that can execute a task.
Definition: task.h:170
MemSetter::valfunc_
ValueFunc valfunc_
Definition: odmemory.h:70
MemValReplacer::toval_
T toval_
Definition: odmemory.h:162
MemSetter::val_
T val_
Definition: odmemory.h:69
mODMemSpecialImpl
#define mODMemSpecialImpl(Type)
Definition: odmemory.h:298
MemSetter::doPrepare
bool doPrepare(int)
Definition: odmemory.h:208
MemCopier::uiMessage
uiString uiMessage() const
will be message() again in 7.x
Definition: odmemory.h:106
MemCopier::setSize
void setSize(int64_t sz)
Definition: odmemory.h:104
MemCopier::minThreadSize
int minThreadSize() const
Definition: odmemory.h:113
OD::TakeOverPtr
@ TakeOverPtr
Definition: odmemory.h:21
OD::sysMemValueSet
T * sysMemValueSet(T *, T, int64_t nrsamp)
Definition: odmemory.h:465
OD::sysMemCopy
void sysMemCopy(void *, const void *, int64_t)
ParallelTask
Generalization of a task that can be run in parallel.
Definition: paralleltask.h:66
MemSetter::ptr_
T * ptr_
Definition: odmemory.h:67
MemSetter::minThreadSize
int minThreadSize() const
Definition: odmemory.h:63
MemValReplacer::uiMessage
uiString uiMessage() const
will be message() again in 7.x
Definition: odmemory.h:149
MemCopier::doWork
bool doWork(int64_t, int64_t, int)
Definition: odmemory.h:363
uiString
String that is able to hold international (UTF-8) strings for the user interface.
Definition: uistring.h:121
MemCopier::invs_
const ValueSeries< T > * invs_
Definition: odmemory.h:117
MemValReplacer
Goes through some mem or a ValSeries and replaces one value with another.
Definition: odmemory.h:136
MemCopier::sz_
int64_t sz_
Definition: odmemory.h:120
MemValReplacer::minThreadSize
int minThreadSize() const
Definition: odmemory.h:156
MemCopier::inptr_
const T * inptr_
Definition: odmemory.h:116
OD::CopyPtr
@ CopyPtr
Definition: odmemory.h:21
MemValReplacer::MemValReplacer
MemValReplacer()
MemValReplacer::fromval_
T fromval_
Definition: odmemory.h:163
MemValReplacer::nrIterations
int64_t nrIterations() const
Definition: odmemory.h:155
MemSetter::uiMessage
uiString uiMessage() const
will be message() again in 7.x
Definition: odmemory.h:56
OD::PtrPolicy
PtrPolicy
Definition: odmemory.h:21
cMinMemValSetParallelSize
#define cMinMemValSetParallelSize
size determined experimentally on different Linux and Windows systems
Definition: odmemory.h:459
MemCopier::setOutput
void setOutput(ValueSeries< T > &vs)
Definition: odmemory.h:102
paralleltask.h
MemCopier::setInput
void setInput(const ValueSeries< T > &vs)
Definition: odmemory.h:99
MemSetter
Sets large amounts of values to a constant using multiple threads.
Definition: odmemory.h:42
MemSetter::nrIterations
int64_t nrIterations() const
Definition: odmemory.h:62
ValueSeries::arr
virtual T * arr()
Definition: valseries.h:55
MemSetter::uiNrDoneText
uiString uiNrDoneText() const
will be nrDoneText() in 7.x
Definition: odmemory.h:57
OD::sysMemSet
void sysMemSet(void *, int, size_t)

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