STORMM Source Documentation
Loading...
Searching...
No Matches
hpc_bounds.h
1// -*-c++-*-
2#ifndef STORMM_HPC_BOUNDS_H
3#define STORMM_HPC_BOUNDS_H
4
5#include "copyright.h"
6#include "DataTypes/common_types.h"
7
8namespace stormm {
9namespace constants {
10
14#if defined(STORMM_USE_HIP)
15constexpr size_t warp_size_zu = 64;
16constexpr int warp_size_int = 64;
17constexpr unsigned long int warp_size_uint = 64LU;
18constexpr long long int warp_size_lld = 64LL;
19constexpr unsigned long long int warp_size_llu = 64LLU;
20constexpr int warp_bits = 6;
21#elif defined(STORMM_USE_INTEL)
22constexpr size_t warp_size_zu = 16;
23constexpr int warp_size_int = 16;
24constexpr unsigned long int warp_size_uint = 16LU;
25constexpr long long int warp_size_lld = 16LL;
26constexpr unsigned long long int warp_size_llu = 16LLU;
27constexpr int warp_bits = 4;
28#else
29constexpr size_t warp_size_zu = 32;
30constexpr int warp_size_int = 32;
31constexpr unsigned long int warp_size_uint = 32LU;
32constexpr long long int warp_size_lld = 32LL;
33constexpr unsigned long long int warp_size_llu = 32LLU;
34constexpr int warp_bits = 5;
35#endif
36constexpr size_t twice_warp_size_zu = 2LLU * warp_size_zu;
37constexpr int twice_warp_size_int = 2 * warp_size_int;
38constexpr unsigned long int twice_warp_size_uint = 2LU * warp_size_uint;
39constexpr long long int twice_warp_size_lld = 2LL * warp_size_lld;
40constexpr unsigned long long int twice_warp_size_llu = 2LLU * warp_size_llu;
41constexpr size_t warp_bits_mask_zu = warp_size_zu - 1LLU;
42constexpr int warp_bits_mask_int = warp_size_int - 1;
43constexpr unsigned long int warp_bits_mask_lu = warp_size_uint - 1LU;
44constexpr long long int warp_bits_mask_lld = warp_size_lld - 1LL;
45constexpr unsigned long long int warp_bits_mask_llu = warp_size_llu - 1LLU;
46constexpr size_t twice_warp_bits_mask_zu = warp_bits_mask_zu + warp_size_zu;
47constexpr int twice_warp_bits_mask_int = warp_bits_mask_int + warp_size_int;
48constexpr unsigned long int twice_warp_bits_mask_lu = warp_bits_mask_lu + warp_size_uint;
49constexpr long long int twice_warp_bits_mask_lld = warp_bits_mask_lld + warp_size_lld;
50constexpr unsigned long long int twice_warp_bits_mask_llu = warp_bits_mask_llu + warp_size_llu;
51constexpr int quarter_warp_size_int = (warp_size_int >> 2);
52constexpr int half_warp_size_int = (warp_size_int >> 1);
53constexpr int three_quarter_warp_size_int = quarter_warp_size_int + half_warp_size_int;
54constexpr int quarter_warp_bits = 3;
55constexpr int half_warp_bits = 4;
57
59enum class BlockSize {
60 TINY,
61 SMALL,
62 MEDIUM,
63 LARGE
64};
65
67constexpr int block_size_test_increment = 64;
68
74constexpr int tiny_block_size = 128;
75constexpr int small_block_size = 256;
76constexpr int medium_block_size = 512;
77constexpr int large_block_size = 1024;
79
82constexpr int tiny_block_warps = (tiny_block_size >> warp_bits);
83constexpr int small_block_warps = (small_block_size >> warp_bits);
84constexpr int medium_block_warps = (medium_block_size >> warp_bits);
85constexpr int large_block_warps = (large_block_size >> warp_bits);
87
88} // namespace constants
89} // namespace stormm
90
91// Share the major block bounds
92namespace stormm {
93using constants::warp_size_zu;
94using constants::warp_size_int;
95using constants::warp_size_uint;
96using constants::warp_size_lld;
97using constants::warp_size_llu;
98using constants::twice_warp_size_zu;
99using constants::twice_warp_size_int;
100using constants::twice_warp_size_uint;
101using constants::twice_warp_size_lld;
102using constants::twice_warp_size_llu;
103using constants::twice_warp_bits_mask_zu;
104using constants::twice_warp_bits_mask_int;
105using constants::twice_warp_bits_mask_lu;
106using constants::twice_warp_bits_mask_lld;
107using constants::twice_warp_bits_mask_llu;
108using constants::warp_bits;
109using constants::warp_bits_mask_int;
110using constants::warp_bits_mask_lu;
111using constants::warp_bits_mask_lld;
112using constants::warp_bits_mask_llu;
113using constants::warp_bits_mask_zu;
114using constants::quarter_warp_size_int;
115using constants::half_warp_size_int;
116using constants::three_quarter_warp_size_int;
117using constants::quarter_warp_bits;
118using constants::half_warp_bits;
119using constants::BlockSize;
120using constants::large_block_size;
121using constants::medium_block_size;
122using constants::small_block_size;
123using constants::tiny_block_size;
124using constants::large_block_warps;
125using constants::medium_block_warps;
126using constants::small_block_warps;
127using constants::tiny_block_warps;
128}
129
130#endif