Bit-manipulation intrinsics#
Defined in code/simulator.h.
This page documents 48 symbols: 1 macros, 47 functions.
Macros#
Signature |
Description |
Availability |
Location |
Example |
|---|---|---|---|---|
|
Expands to |
sim + nvcc |
simulator.h:949 |
Functions#
Signature |
Description |
Availability |
Location |
Example |
|---|---|---|---|---|
|
sim only |
simulator.h:808 |
||
|
sim only |
simulator.h:815 |
||
|
Assemble 4 bytes selected by the nibbles of |
sim only |
simulator.h:820 |
|
|
sim only |
simulator.h:803 |
||
|
sim only |
simulator.h:804 |
||
|
sim only |
simulator.h:882 |
||
|
sim only |
simulator.h:890 |
||
|
__dp2a_lo uses the LOW halves of |
sim only |
simulator.h:877 |
|
|
sim only |
simulator.h:887 |
||
|
sm_61 4-way byte / 2-way short dot products with accumulate. |
sim only |
simulator.h:855 |
|
|
sim only |
simulator.h:862 |
||
|
sim only |
simulator.h:869 |
||
|
sim only |
simulator.h:872 |
||
|
__ffs is 1-based and returns 0 for an all-zero word (CUDA semantics). |
sim only |
simulator.h:806 |
|
|
sim only |
simulator.h:807 |
||
|
sim only |
simulator.h:897 |
||
|
Concatenate {hi:lo} to 64 bits, shift, take the requested 32-bit window. |
sim only |
simulator.h:836 |
|
|
sim only |
simulator.h:840 |
||
|
sim only |
simulator.h:845 |
||
|
sim only |
simulator.h:849 |
||
|
sim only |
simulator.h:896 |
||
|
sim only |
simulator.h:801 |
||
|
sim only |
simulator.h:802 |
||
|
sim only |
simulator.h:893 |
||
|
sim only |
simulator.h:894 |
||
|
sim only |
simulator.h:919 |
||
|
sim only |
simulator.h:918 |
||
|
Device math provides max/min overloads that host <algorithm> only exposes as std::max/std::min. |
sim only |
simulator.h:903 |
|
|
sim only |
simulator.h:904 |
||
|
sim only |
simulator.h:905 |
||
|
sim only |
simulator.h:906 |
||
|
sim only |
simulator.h:907 |
||
|
sim only |
simulator.h:908 |
||
|
sim only |
simulator.h:931 |
||
|
sim only |
simulator.h:909 |
||
|
sim only |
simulator.h:910 |
||
|
sim only |
simulator.h:911 |
||
|
sim only |
simulator.h:912 |
||
|
sim only |
simulator.h:913 |
||
|
sim only |
simulator.h:914 |
||
|
sim only |
simulator.h:938 |
||
|
__syncthreads(): park at the block-wide barrier; the scheduler releases it only once every live thread in the block has arrived. |
sim only |
simulator.h:953 |
|
|
Dynamic (runtime-sized) shared memory. |
sim only |
simulator.h:948 |
|
|
sim only |
simulator.h:921 |
||
|
sim only |
simulator.h:920 |
||
|
sim only |
simulator.h:917 |
||
|
CUDA also exposes the explicitly-typed integer min/max intrinsics by name. |
sim only |
simulator.h:916 |
Examples#
Code from the repository’s example corpus (code\*.cu); the highlighted line is the call site. These blocks are what the View links above open.
max (test_web_cs_atomics.cu:69)
59 val = 0;
60 for (int i = 0; i < len; ++i) val -= 10;
61 if (val != gpuData[1]) { std::printf("atomicSub failed\n"); return false; }
62
63 bool found = false;
64 for (int i = 0; i < len; ++i) if (i == gpuData[2]) { found = true; break; }
65 if (!found) { std::printf("atomicExch failed\n"); return false; }
66
67 val = -(1 << 8);
68 for (int i = 0; i < len; ++i) val = max(val, i);
69 if (val != gpuData[3]) { std::printf("atomicMax failed\n"); return false; }
70
71 val = 1 << 8;
72 for (int i = 0; i < len; ++i) val = min(val, i);
73 if (val != gpuData[4]) { std::printf("atomicMin failed\n"); return false; }
74
75 int limit = 17;
76 val = 0;
77 for (int i = 0; i < len; ++i) val = (val >= limit) ? 0 : val + 1;
78 if (val != gpuData[5]) { std::printf("atomicInc failed\n"); return false; }
max (test_web_cs_atomics.cu:69)
59 val = 0;
60 for (int i = 0; i < len; ++i) val -= 10;
61 if (val != gpuData[1]) { std::printf("atomicSub failed\n"); return false; }
62
63 bool found = false;
64 for (int i = 0; i < len; ++i) if (i == gpuData[2]) { found = true; break; }
65 if (!found) { std::printf("atomicExch failed\n"); return false; }
66
67 val = -(1 << 8);
68 for (int i = 0; i < len; ++i) val = max(val, i);
69 if (val != gpuData[3]) { std::printf("atomicMax failed\n"); return false; }
70
71 val = 1 << 8;
72 for (int i = 0; i < len; ++i) val = min(val, i);
73 if (val != gpuData[4]) { std::printf("atomicMin failed\n"); return false; }
74
75 int limit = 17;
76 val = 0;
77 for (int i = 0; i < len; ++i) val = (val >= limit) ? 0 : val + 1;
78 if (val != gpuData[5]) { std::printf("atomicInc failed\n"); return false; }
max (test_web_cs_atomics.cu:69)
59 val = 0;
60 for (int i = 0; i < len; ++i) val -= 10;
61 if (val != gpuData[1]) { std::printf("atomicSub failed\n"); return false; }
62
63 bool found = false;
64 for (int i = 0; i < len; ++i) if (i == gpuData[2]) { found = true; break; }
65 if (!found) { std::printf("atomicExch failed\n"); return false; }
66
67 val = -(1 << 8);
68 for (int i = 0; i < len; ++i) val = max(val, i);
69 if (val != gpuData[3]) { std::printf("atomicMax failed\n"); return false; }
70
71 val = 1 << 8;
72 for (int i = 0; i < len; ++i) val = min(val, i);
73 if (val != gpuData[4]) { std::printf("atomicMin failed\n"); return false; }
74
75 int limit = 17;
76 val = 0;
77 for (int i = 0; i < len; ++i) val = (val >= limit) ? 0 : val + 1;
78 if (val != gpuData[5]) { std::printf("atomicInc failed\n"); return false; }
max (test_web_cs_atomics.cu:69)
59 val = 0;
60 for (int i = 0; i < len; ++i) val -= 10;
61 if (val != gpuData[1]) { std::printf("atomicSub failed\n"); return false; }
62
63 bool found = false;
64 for (int i = 0; i < len; ++i) if (i == gpuData[2]) { found = true; break; }
65 if (!found) { std::printf("atomicExch failed\n"); return false; }
66
67 val = -(1 << 8);
68 for (int i = 0; i < len; ++i) val = max(val, i);
69 if (val != gpuData[3]) { std::printf("atomicMax failed\n"); return false; }
70
71 val = 1 << 8;
72 for (int i = 0; i < len; ++i) val = min(val, i);
73 if (val != gpuData[4]) { std::printf("atomicMin failed\n"); return false; }
74
75 int limit = 17;
76 val = 0;
77 for (int i = 0; i < len; ++i) val = (val >= limit) ? 0 : val + 1;
78 if (val != gpuData[5]) { std::printf("atomicInc failed\n"); return false; }
max (test_web_cs_atomics.cu:69)
59 val = 0;
60 for (int i = 0; i < len; ++i) val -= 10;
61 if (val != gpuData[1]) { std::printf("atomicSub failed\n"); return false; }
62
63 bool found = false;
64 for (int i = 0; i < len; ++i) if (i == gpuData[2]) { found = true; break; }
65 if (!found) { std::printf("atomicExch failed\n"); return false; }
66
67 val = -(1 << 8);
68 for (int i = 0; i < len; ++i) val = max(val, i);
69 if (val != gpuData[3]) { std::printf("atomicMax failed\n"); return false; }
70
71 val = 1 << 8;
72 for (int i = 0; i < len; ++i) val = min(val, i);
73 if (val != gpuData[4]) { std::printf("atomicMin failed\n"); return false; }
74
75 int limit = 17;
76 val = 0;
77 for (int i = 0; i < len; ++i) val = (val >= limit) ? 0 : val + 1;
78 if (val != gpuData[5]) { std::printf("atomicInc failed\n"); return false; }
max (test_web_cs_atomics.cu:69)
59 val = 0;
60 for (int i = 0; i < len; ++i) val -= 10;
61 if (val != gpuData[1]) { std::printf("atomicSub failed\n"); return false; }
62
63 bool found = false;
64 for (int i = 0; i < len; ++i) if (i == gpuData[2]) { found = true; break; }
65 if (!found) { std::printf("atomicExch failed\n"); return false; }
66
67 val = -(1 << 8);
68 for (int i = 0; i < len; ++i) val = max(val, i);
69 if (val != gpuData[3]) { std::printf("atomicMax failed\n"); return false; }
70
71 val = 1 << 8;
72 for (int i = 0; i < len; ++i) val = min(val, i);
73 if (val != gpuData[4]) { std::printf("atomicMin failed\n"); return false; }
74
75 int limit = 17;
76 val = 0;
77 for (int i = 0; i < len; ++i) val = (val >= limit) ? 0 : val + 1;
78 if (val != gpuData[5]) { std::printf("atomicInc failed\n"); return false; }
max (test_web_cs_atomics.cu:69)
59 val = 0;
60 for (int i = 0; i < len; ++i) val -= 10;
61 if (val != gpuData[1]) { std::printf("atomicSub failed\n"); return false; }
62
63 bool found = false;
64 for (int i = 0; i < len; ++i) if (i == gpuData[2]) { found = true; break; }
65 if (!found) { std::printf("atomicExch failed\n"); return false; }
66
67 val = -(1 << 8);
68 for (int i = 0; i < len; ++i) val = max(val, i);
69 if (val != gpuData[3]) { std::printf("atomicMax failed\n"); return false; }
70
71 val = 1 << 8;
72 for (int i = 0; i < len; ++i) val = min(val, i);
73 if (val != gpuData[4]) { std::printf("atomicMin failed\n"); return false; }
74
75 int limit = 17;
76 val = 0;
77 for (int i = 0; i < len; ++i) val = (val >= limit) ? 0 : val + 1;
78 if (val != gpuData[5]) { std::printf("atomicInc failed\n"); return false; }
min (test_web_cs_atomics.cu:73)
63 bool found = false;
64 for (int i = 0; i < len; ++i) if (i == gpuData[2]) { found = true; break; }
65 if (!found) { std::printf("atomicExch failed\n"); return false; }
66
67 val = -(1 << 8);
68 for (int i = 0; i < len; ++i) val = max(val, i);
69 if (val != gpuData[3]) { std::printf("atomicMax failed\n"); return false; }
70
71 val = 1 << 8;
72 for (int i = 0; i < len; ++i) val = min(val, i);
73 if (val != gpuData[4]) { std::printf("atomicMin failed\n"); return false; }
74
75 int limit = 17;
76 val = 0;
77 for (int i = 0; i < len; ++i) val = (val >= limit) ? 0 : val + 1;
78 if (val != gpuData[5]) { std::printf("atomicInc failed\n"); return false; }
79
80 limit = 137;
81 val = 0;
82 for (int i = 0; i < len; ++i) val = ((val == 0) || (val > limit)) ? limit : val - 1;
83 if (val != gpuData[6]) { std::printf("atomicDec failed\n"); return false; }
min (test_web_cs_atomics.cu:73)
63 bool found = false;
64 for (int i = 0; i < len; ++i) if (i == gpuData[2]) { found = true; break; }
65 if (!found) { std::printf("atomicExch failed\n"); return false; }
66
67 val = -(1 << 8);
68 for (int i = 0; i < len; ++i) val = max(val, i);
69 if (val != gpuData[3]) { std::printf("atomicMax failed\n"); return false; }
70
71 val = 1 << 8;
72 for (int i = 0; i < len; ++i) val = min(val, i);
73 if (val != gpuData[4]) { std::printf("atomicMin failed\n"); return false; }
74
75 int limit = 17;
76 val = 0;
77 for (int i = 0; i < len; ++i) val = (val >= limit) ? 0 : val + 1;
78 if (val != gpuData[5]) { std::printf("atomicInc failed\n"); return false; }
79
80 limit = 137;
81 val = 0;
82 for (int i = 0; i < len; ++i) val = ((val == 0) || (val > limit)) ? limit : val - 1;
83 if (val != gpuData[6]) { std::printf("atomicDec failed\n"); return false; }
min (test_web_cs_atomics.cu:73)
63 bool found = false;
64 for (int i = 0; i < len; ++i) if (i == gpuData[2]) { found = true; break; }
65 if (!found) { std::printf("atomicExch failed\n"); return false; }
66
67 val = -(1 << 8);
68 for (int i = 0; i < len; ++i) val = max(val, i);
69 if (val != gpuData[3]) { std::printf("atomicMax failed\n"); return false; }
70
71 val = 1 << 8;
72 for (int i = 0; i < len; ++i) val = min(val, i);
73 if (val != gpuData[4]) { std::printf("atomicMin failed\n"); return false; }
74
75 int limit = 17;
76 val = 0;
77 for (int i = 0; i < len; ++i) val = (val >= limit) ? 0 : val + 1;
78 if (val != gpuData[5]) { std::printf("atomicInc failed\n"); return false; }
79
80 limit = 137;
81 val = 0;
82 for (int i = 0; i < len; ++i) val = ((val == 0) || (val > limit)) ? limit : val - 1;
83 if (val != gpuData[6]) { std::printf("atomicDec failed\n"); return false; }
min (test_web_cs_atomics.cu:73)
63 bool found = false;
64 for (int i = 0; i < len; ++i) if (i == gpuData[2]) { found = true; break; }
65 if (!found) { std::printf("atomicExch failed\n"); return false; }
66
67 val = -(1 << 8);
68 for (int i = 0; i < len; ++i) val = max(val, i);
69 if (val != gpuData[3]) { std::printf("atomicMax failed\n"); return false; }
70
71 val = 1 << 8;
72 for (int i = 0; i < len; ++i) val = min(val, i);
73 if (val != gpuData[4]) { std::printf("atomicMin failed\n"); return false; }
74
75 int limit = 17;
76 val = 0;
77 for (int i = 0; i < len; ++i) val = (val >= limit) ? 0 : val + 1;
78 if (val != gpuData[5]) { std::printf("atomicInc failed\n"); return false; }
79
80 limit = 137;
81 val = 0;
82 for (int i = 0; i < len; ++i) val = ((val == 0) || (val > limit)) ? limit : val - 1;
83 if (val != gpuData[6]) { std::printf("atomicDec failed\n"); return false; }
min (test_web_cs_atomics.cu:73)
63 bool found = false;
64 for (int i = 0; i < len; ++i) if (i == gpuData[2]) { found = true; break; }
65 if (!found) { std::printf("atomicExch failed\n"); return false; }
66
67 val = -(1 << 8);
68 for (int i = 0; i < len; ++i) val = max(val, i);
69 if (val != gpuData[3]) { std::printf("atomicMax failed\n"); return false; }
70
71 val = 1 << 8;
72 for (int i = 0; i < len; ++i) val = min(val, i);
73 if (val != gpuData[4]) { std::printf("atomicMin failed\n"); return false; }
74
75 int limit = 17;
76 val = 0;
77 for (int i = 0; i < len; ++i) val = (val >= limit) ? 0 : val + 1;
78 if (val != gpuData[5]) { std::printf("atomicInc failed\n"); return false; }
79
80 limit = 137;
81 val = 0;
82 for (int i = 0; i < len; ++i) val = ((val == 0) || (val > limit)) ? limit : val - 1;
83 if (val != gpuData[6]) { std::printf("atomicDec failed\n"); return false; }
min (test_web_cs_atomics.cu:73)
63 bool found = false;
64 for (int i = 0; i < len; ++i) if (i == gpuData[2]) { found = true; break; }
65 if (!found) { std::printf("atomicExch failed\n"); return false; }
66
67 val = -(1 << 8);
68 for (int i = 0; i < len; ++i) val = max(val, i);
69 if (val != gpuData[3]) { std::printf("atomicMax failed\n"); return false; }
70
71 val = 1 << 8;
72 for (int i = 0; i < len; ++i) val = min(val, i);
73 if (val != gpuData[4]) { std::printf("atomicMin failed\n"); return false; }
74
75 int limit = 17;
76 val = 0;
77 for (int i = 0; i < len; ++i) val = (val >= limit) ? 0 : val + 1;
78 if (val != gpuData[5]) { std::printf("atomicInc failed\n"); return false; }
79
80 limit = 137;
81 val = 0;
82 for (int i = 0; i < len; ++i) val = ((val == 0) || (val > limit)) ? limit : val - 1;
83 if (val != gpuData[6]) { std::printf("atomicDec failed\n"); return false; }
min (test_web_cs_atomics.cu:73)
63 bool found = false;
64 for (int i = 0; i < len; ++i) if (i == gpuData[2]) { found = true; break; }
65 if (!found) { std::printf("atomicExch failed\n"); return false; }
66
67 val = -(1 << 8);
68 for (int i = 0; i < len; ++i) val = max(val, i);
69 if (val != gpuData[3]) { std::printf("atomicMax failed\n"); return false; }
70
71 val = 1 << 8;
72 for (int i = 0; i < len; ++i) val = min(val, i);
73 if (val != gpuData[4]) { std::printf("atomicMin failed\n"); return false; }
74
75 int limit = 17;
76 val = 0;
77 for (int i = 0; i < len; ++i) val = (val >= limit) ? 0 : val + 1;
78 if (val != gpuData[5]) { std::printf("atomicInc failed\n"); return false; }
79
80 limit = 137;
81 val = 0;
82 for (int i = 0; i < len; ++i) val = ((val == 0) || (val > limit)) ? limit : val - 1;
83 if (val != gpuData[6]) { std::printf("atomicDec failed\n"); return false; }
umin (test_web_cs_mergesort.cu:59)
49 (msg), static_cast<int>(_e), __FILE__, __LINE__); \
50 std::exit(EXIT_FAILURE); \
51 } } while (0)
52
53// verbatim device helpers from the source repo
54template <uint sortDir> static inline __device__ uint binarySearchInclusive(uint val, uint *data, uint L, uint stride)
55{
56 if (L == 0) return 0;
57 uint pos = 0;
58 for (; stride > 0; stride >>= 1) {
59 uint newPos = umin(pos + stride, L);
60 if ((sortDir && (data[newPos - 1] <= val)) || (!sortDir && (data[newPos - 1] >= val)))
61 pos = newPos;
62 }
63 return pos;
64}
65
66template <uint sortDir> static inline __device__ uint binarySearchExclusive(uint val, uint *data, uint L, uint stride)
67{
68 if (L == 0) return 0;
69 uint pos = 0;
70 for (; stride > 0; stride >>= 1) {