DASH  0.3.0
HashPolicy.h
1 #ifndef DASH__MAP__HASH_POLICY_H__INCLUDED
2 #define DASH__MAP__HASH_POLICY_H__INCLUDED
3 
4 #include <dash/Team.h>
5 
6 namespace dash {
7 template <typename Key>
8 class HashLocal {
9  private:
10  typedef dash::default_size_t size_type;
11 
12  public:
13  typedef Key argument_type;
14  typedef team_unit_t result_type;
15 
16  public:
21  : _team(nullptr)
22  , _nunits(0)
23  , _myid(DART_UNDEFINED_UNIT_ID)
24  {
25  }
26 
31  : _team(&team)
32  , _nunits(team.size())
33  , _myid(team.myid())
34  {
35  }
36 
37  result_type operator()(const argument_type& key) const { return _myid; }
38  private:
39  dash::Team* _team = nullptr;
40  size_type _nunits = 0;
41  team_unit_t _myid;
42 }; // class HashLocal
43 
44 namespace detail {
45 
46 struct HashNodeBase {
47  HashNodeBase* _next;
48 
49  HashNodeBase() noexcept
50  : _next()
51  {
52  }
53  HashNodeBase(HashNodeBase* other) noexcept
54  : _next(other)
55  {
56  }
57 };
58 
59 template <typename V>
60 struct HashNode {
61  V _val;
62 
63  HashNode* next() const noexcept { return static_cast<HashNode *>(this->_next); }
64 
65  V val() noexcept {
66  return _val;
67  }
68 };
69 
70 struct prime_number_hash_policy {
71  size_t index_for_hash(size_t hash, size_t /*num_slots_minus_one*/) const
72  {
73  switch (prime_index) {
74  case 0:
75  return 0llu;
76  case 1:
77  return hash % 2llu;
78  case 2:
79  return hash % 3llu;
80  case 3:
81  return hash % 5llu;
82  case 4:
83  return hash % 7llu;
84  case 5:
85  return hash % 11llu;
86  case 6:
87  return hash % 13llu;
88  case 7:
89  return hash % 17llu;
90  case 8:
91  return hash % 23llu;
92  case 9:
93  return hash % 29llu;
94  case 10:
95  return hash % 37llu;
96  case 11:
97  return hash % 47llu;
98  case 12:
99  return hash % 59llu;
100  case 13:
101  return hash % 73llu;
102  case 14:
103  return hash % 97llu;
104  case 15:
105  return hash % 127llu;
106  case 16:
107  return hash % 151llu;
108  case 17:
109  return hash % 197llu;
110  case 18:
111  return hash % 251llu;
112  case 19:
113  return hash % 313llu;
114  case 20:
115  return hash % 397llu;
116  case 21:
117  return hash % 499llu;
118  case 22:
119  return hash % 631llu;
120  case 23:
121  return hash % 797llu;
122  case 24:
123  return hash % 1009llu;
124  case 25:
125  return hash % 1259llu;
126  case 26:
127  return hash % 1597llu;
128  case 27:
129  return hash % 2011llu;
130  case 28:
131  return hash % 2539llu;
132  case 29:
133  return hash % 3203llu;
134  case 30:
135  return hash % 4027llu;
136  case 31:
137  return hash % 5087llu;
138  case 32:
139  return hash % 6421llu;
140  case 33:
141  return hash % 8089llu;
142  case 34:
143  return hash % 10193llu;
144  case 35:
145  return hash % 12853llu;
146  case 36:
147  return hash % 16193llu;
148  case 37:
149  return hash % 20399llu;
150  case 38:
151  return hash % 25717llu;
152  case 39:
153  return hash % 32401llu;
154  case 40:
155  return hash % 40823llu;
156  case 41:
157  return hash % 51437llu;
158  case 42:
159  return hash % 64811llu;
160  case 43:
161  return hash % 81649llu;
162  case 44:
163  return hash % 102877llu;
164  case 45:
165  return hash % 129607llu;
166  case 46:
167  return hash % 163307llu;
168  case 47:
169  return hash % 205759llu;
170  case 48:
171  return hash % 259229llu;
172  case 49:
173  return hash % 326617llu;
174  case 50:
175  return hash % 411527llu;
176  case 51:
177  return hash % 518509llu;
178  case 52:
179  return hash % 653267llu;
180  case 53:
181  return hash % 823117llu;
182  case 54:
183  return hash % 1037059llu;
184  case 55:
185  return hash % 1306601llu;
186  case 56:
187  return hash % 1646237llu;
188  case 57:
189  return hash % 2074129llu;
190  case 58:
191  return hash % 2613229llu;
192  case 59:
193  return hash % 3292489llu;
194  case 60:
195  return hash % 4148279llu;
196  case 61:
197  return hash % 5226491llu;
198  case 62:
199  return hash % 6584983llu;
200  case 63:
201  return hash % 8296553llu;
202  case 64:
203  return hash % 10453007llu;
204  case 65:
205  return hash % 13169977llu;
206  case 66:
207  return hash % 16593127llu;
208  case 67:
209  return hash % 20906033llu;
210  case 68:
211  return hash % 26339969llu;
212  case 69:
213  return hash % 33186281llu;
214  case 70:
215  return hash % 41812097llu;
216  case 71:
217  return hash % 52679969llu;
218  case 72:
219  return hash % 66372617llu;
220  case 73:
221  return hash % 83624237llu;
222  case 74:
223  return hash % 105359939llu;
224  case 75:
225  return hash % 132745199llu;
226  case 76:
227  return hash % 167248483llu;
228  case 77:
229  return hash % 210719881llu;
230  case 78:
231  return hash % 265490441llu;
232  case 79:
233  return hash % 334496971llu;
234  case 80:
235  return hash % 421439783llu;
236  case 81:
237  return hash % 530980861llu;
238  case 82:
239  return hash % 668993977llu;
240  case 83:
241  return hash % 842879579llu;
242  case 84:
243  return hash % 1061961721llu;
244  case 85:
245  return hash % 1337987929llu;
246  case 86:
247  return hash % 1685759167llu;
248  case 87:
249  return hash % 2123923447llu;
250  case 88:
251  return hash % 2675975881llu;
252  case 89:
253  return hash % 3371518343llu;
254  case 90:
255  return hash % 4247846927llu;
256  case 91:
257  return hash % 5351951779llu;
258  case 92:
259  return hash % 6743036717llu;
260  case 93:
261  return hash % 8495693897llu;
262  case 94:
263  return hash % 10703903591llu;
264  case 95:
265  return hash % 13486073473llu;
266  case 96:
267  return hash % 16991387857llu;
268  case 97:
269  return hash % 21407807219llu;
270  case 98:
271  return hash % 26972146961llu;
272  case 99:
273  return hash % 33982775741llu;
274  case 100:
275  return hash % 42815614441llu;
276  case 101:
277  return hash % 53944293929llu;
278  case 102:
279  return hash % 67965551447llu;
280  case 103:
281  return hash % 85631228929llu;
282  case 104:
283  return hash % 107888587883llu;
284  case 105:
285  return hash % 135931102921llu;
286  case 106:
287  return hash % 171262457903llu;
288  case 107:
289  return hash % 215777175787llu;
290  case 108:
291  return hash % 271862205833llu;
292  case 109:
293  return hash % 342524915839llu;
294  case 110:
295  return hash % 431554351609llu;
296  case 111:
297  return hash % 543724411781llu;
298  case 112:
299  return hash % 685049831731llu;
300  case 113:
301  return hash % 863108703229llu;
302  case 114:
303  return hash % 1087448823553llu;
304  case 115:
305  return hash % 1370099663459llu;
306  case 116:
307  return hash % 1726217406467llu;
308  case 117:
309  return hash % 2174897647073llu;
310  case 118:
311  return hash % 2740199326961llu;
312  case 119:
313  return hash % 3452434812973llu;
314  case 120:
315  return hash % 4349795294267llu;
316  case 121:
317  return hash % 5480398654009llu;
318  case 122:
319  return hash % 6904869625999llu;
320  case 123:
321  return hash % 8699590588571llu;
322  case 124:
323  return hash % 10960797308051llu;
324  case 125:
325  return hash % 13809739252051llu;
326  case 126:
327  return hash % 17399181177241llu;
328  case 127:
329  return hash % 21921594616111llu;
330  case 128:
331  return hash % 27619478504183llu;
332  case 129:
333  return hash % 34798362354533llu;
334  case 130:
335  return hash % 43843189232363llu;
336  case 131:
337  return hash % 55238957008387llu;
338  case 132:
339  return hash % 69596724709081llu;
340  case 133:
341  return hash % 87686378464759llu;
342  case 134:
343  return hash % 110477914016779llu;
344  case 135:
345  return hash % 139193449418173llu;
346  case 136:
347  return hash % 175372756929481llu;
348  case 137:
349  return hash % 220955828033581llu;
350  case 138:
351  return hash % 278386898836457llu;
352  case 139:
353  return hash % 350745513859007llu;
354  case 140:
355  return hash % 441911656067171llu;
356  case 141:
357  return hash % 556773797672909llu;
358  case 142:
359  return hash % 701491027718027llu;
360  case 143:
361  return hash % 883823312134381llu;
362  case 144:
363  return hash % 1113547595345903llu;
364  case 145:
365  return hash % 1402982055436147llu;
366  case 146:
367  return hash % 1767646624268779llu;
368  case 147:
369  return hash % 2227095190691797llu;
370  case 148:
371  return hash % 2805964110872297llu;
372  case 149:
373  return hash % 3535293248537579llu;
374  case 150:
375  return hash % 4454190381383713llu;
376  case 151:
377  return hash % 5611928221744609llu;
378  case 152:
379  return hash % 7070586497075177llu;
380  case 153:
381  return hash % 8908380762767489llu;
382  case 154:
383  return hash % 11223856443489329llu;
384  case 155:
385  return hash % 14141172994150357llu;
386  case 156:
387  return hash % 17816761525534927llu;
388  case 157:
389  return hash % 22447712886978529llu;
390  case 158:
391  return hash % 28282345988300791llu;
392  case 159:
393  return hash % 35633523051069991llu;
394  case 160:
395  return hash % 44895425773957261llu;
396  case 161:
397  return hash % 56564691976601587llu;
398  case 162:
399  return hash % 71267046102139967llu;
400  case 163:
401  return hash % 89790851547914507llu;
402  case 164:
403  return hash % 113129383953203213llu;
404  case 165:
405  return hash % 142534092204280003llu;
406  case 166:
407  return hash % 179581703095829107llu;
408  case 167:
409  return hash % 226258767906406483llu;
410  case 168:
411  return hash % 285068184408560057llu;
412  case 169:
413  return hash % 359163406191658253llu;
414  case 170:
415  return hash % 452517535812813007llu;
416  case 171:
417  return hash % 570136368817120201llu;
418  case 172:
419  return hash % 718326812383316683llu;
420  case 173:
421  return hash % 905035071625626043llu;
422  case 174:
423  return hash % 1140272737634240411llu;
424  case 175:
425  return hash % 1436653624766633509llu;
426  case 176:
427  return hash % 1810070143251252131llu;
428  case 177:
429  return hash % 2280545475268481167llu;
430  case 178:
431  return hash % 2873307249533267101llu;
432  case 179:
433  return hash % 3620140286502504283llu;
434  case 180:
435  return hash % 4561090950536962147llu;
436  case 181:
437  return hash % 5746614499066534157llu;
438  case 182:
439  return hash % 7240280573005008577llu;
440  case 183:
441  return hash % 9122181901073924329llu;
442  case 184:
443  return hash % 11493228998133068689llu;
444  case 185:
445  return hash % 14480561146010017169llu;
446  case 186:
447  return hash % 18446744073709551557llu;
448  default:
449  return hash;
450  }
451  }
452  uint8_t next_size_over(size_t& size) const
453  {
454  // prime numbers generated by the following method:
455  // 1. start with a prime p = 2
456  // 2. go to wolfram alpha and get p = NextPrime(2 * p)
457  // 3. repeat 2. until you overflow 64 bits
458  // you now have large gaps which you would hit if somebody called reserve()
459  // with an unlucky number.
460  // 4. to fill the gaps for every prime p go to wolfram alpha and get
461  // ClosestPrime(p * 2^(1/3)) and ClosestPrime(p * 2^(2/3)) and put those in
462  // the gaps
463  // 5. get PrevPrime(2^64) and put it at the end
464  //
465  // clang-format off
466  static constexpr const size_t prime_list[] =
467  {
468  2llu, 3llu, 5llu, 7llu, 11llu, 13llu, 17llu, 23llu, 29llu, 37llu, 47llu,
469  59llu, 73llu, 97llu, 127llu, 151llu, 197llu, 251llu, 313llu, 397llu,
470  499llu, 631llu, 797llu, 1009llu, 1259llu, 1597llu, 2011llu, 2539llu,
471  3203llu, 4027llu, 5087llu, 6421llu, 8089llu, 10193llu, 12853llu, 16193llu,
472  20399llu, 25717llu, 32401llu, 40823llu, 51437llu, 64811llu, 81649llu,
473  102877llu, 129607llu, 163307llu, 205759llu, 259229llu, 326617llu,
474  411527llu, 518509llu, 653267llu, 823117llu, 1037059llu, 1306601llu,
475  1646237llu, 2074129llu, 2613229llu, 3292489llu, 4148279llu, 5226491llu,
476  6584983llu, 8296553llu, 10453007llu, 13169977llu, 16593127llu, 20906033llu,
477  26339969llu, 33186281llu, 41812097llu, 52679969llu, 66372617llu,
478  83624237llu, 105359939llu, 132745199llu, 167248483llu, 210719881llu,
479  265490441llu, 334496971llu, 421439783llu, 530980861llu, 668993977llu,
480  842879579llu, 1061961721llu, 1337987929llu, 1685759167llu, 2123923447llu,
481  2675975881llu, 3371518343llu, 4247846927llu, 5351951779llu, 6743036717llu,
482  8495693897llu, 10703903591llu, 13486073473llu, 16991387857llu,
483  21407807219llu, 26972146961llu, 33982775741llu, 42815614441llu,
484  53944293929llu, 67965551447llu, 85631228929llu, 107888587883llu,
485  135931102921llu, 171262457903llu, 215777175787llu, 271862205833llu,
486  342524915839llu, 431554351609llu, 543724411781llu, 685049831731llu,
487  863108703229llu, 1087448823553llu, 1370099663459llu, 1726217406467llu,
488  2174897647073llu, 2740199326961llu, 3452434812973llu, 4349795294267llu,
489  5480398654009llu, 6904869625999llu, 8699590588571llu, 10960797308051llu,
490  13809739252051llu, 17399181177241llu, 21921594616111llu, 27619478504183llu,
491  34798362354533llu, 43843189232363llu, 55238957008387llu, 69596724709081llu,
492  87686378464759llu, 110477914016779llu, 139193449418173llu,
493  175372756929481llu, 220955828033581llu, 278386898836457llu,
494  350745513859007llu, 441911656067171llu, 556773797672909llu,
495  701491027718027llu, 883823312134381llu, 1113547595345903llu,
496  1402982055436147llu, 1767646624268779llu, 2227095190691797llu,
497  2805964110872297llu, 3535293248537579llu, 4454190381383713llu,
498  5611928221744609llu, 7070586497075177llu, 8908380762767489llu,
499  11223856443489329llu, 14141172994150357llu, 17816761525534927llu,
500  22447712886978529llu, 28282345988300791llu, 35633523051069991llu,
501  44895425773957261llu, 56564691976601587llu, 71267046102139967llu,
502  89790851547914507llu, 113129383953203213llu, 142534092204280003llu,
503  179581703095829107llu, 226258767906406483llu, 285068184408560057llu,
504  359163406191658253llu, 452517535812813007llu, 570136368817120201llu,
505  718326812383316683llu, 905035071625626043llu, 1140272737634240411llu,
506  1436653624766633509llu, 1810070143251252131llu, 2280545475268481167llu,
507  2873307249533267101llu, 3620140286502504283llu, 4561090950536962147llu,
508  5746614499066534157llu, 7240280573005008577llu, 9122181901073924329llu,
509  11493228998133068689llu, 14480561146010017169llu, 18446744073709551557llu
510  };
511  // clang-format on
512  const size_t* found = std::lower_bound(std::begin(prime_list),
513  std::end(prime_list) - 1, size);
514  size = *found;
515  return static_cast<uint8_t>(1 + found - prime_list);
516  }
517 
518  private:
519  uint8_t prime_index = 0;
520 };
521 }
522 }
523 
524 #endif
global_unit_t myid()
Shortcut to query the global unit ID of the calling unit.
internal::default_unsigned_index default_size_t
Unsigned integer type used as default for size values.
Definition: Types.h:69
size_t size()
Return the number of units in the global team.
constexpr auto end(RangeType &&range) -> decltype(std::forward< RangeType >(range).end())
Definition: Range.h:98
This class is a simple memory pool which holds allocates elements of size ValueType.
Definition: AllOf.h:8
constexpr auto begin(RangeType &&range) -> decltype(std::forward< RangeType >(range).begin())
Definition: Range.h:89
A Team instance specifies a subset of all available units.
Definition: Team.h:41
HashLocal(dash::Team &team)
Constructor.
Definition: HashPolicy.h:30
struct dash::unit_id< dash::local_unit, dart_team_unit_t > team_unit_t
Unit ID to use for team-local IDs.
Definition: Types.h:319
#define DART_UNDEFINED_UNIT_ID
Undefined unit ID.
Definition: dart_types.h:160
HashLocal()
Default constructor.
Definition: HashPolicy.h:20