ESBMC
Efficient SMT-based Context-Bounded Model Checker
Loading...
Searching...
No Matches
device_launch_parameters.h
Go to the documentation of this file.
1#if !defined(__DEVICE_LAUNCH_PARAMETERS_H__)
2# define __DEVICE_LAUNCH_PARAMETERS_H__
3
4# include <stddef.h>
5# include <stdlib.h>
6# include "vector_types.h"
7
8# include <pthread.h>
9
11
12# if !defined(__STORAGE__)
13
14# define __STORAGE__ extern const
15
16# endif /* __STORAGE__ */
17
18# ifdef __cplusplus
19
20extern "C"
21{
22# endif
23
24 /*__device_builtin__ __STORAGE__ */ dim3 blockDim;
25
26 /*__device_builtin__ __STORAGE__ */ dim3 gridDim;
27
29
32
33 uint3 getThreadIdx(unsigned int id);
34 uint3 getBlockIdx(unsigned int id);
35
36 uint3 getThreadIdx_table(unsigned int id);
37 uint3 getBlockIdx_table(unsigned int id);
38
40 {
41 __ESBMC_atomic_begin();
42 int i;
43
44 // for(i = 0; i < GPU_threads; i++)
45 for (i = 0; i < 2; i++)
47 // for(i = 0; i < GPU_threads; i++)
48 for (i = 0; i < 2; i++)
50
51 __ESBMC_atomic_end();
52 }
53
54# define threadIdx indexOfThread[__ESBMC_get_thread_id() - 1]
55# define blockIdx indexOfBlock[__ESBMC_get_thread_id() - 1]
56
57 uint3 getThreadIdx(unsigned int id)
58 {
59 __ESBMC_atomic_begin();
60 unsigned int linear_value_total = id;
61 unsigned int block_size = blockDim.x * blockDim.y * blockDim.z;
62 unsigned int grid_position = (unsigned int)indexOfBlock[id].x +
63 indexOfBlock[id].y * gridDim.x +
64 indexOfBlock[id].z * gridDim.x * gridDim.y;
65 unsigned int linear_value = linear_value_total - grid_position * block_size;
66
67 uint3 thread_index;
68
69 thread_index.z = (unsigned int)(linear_value / (blockDim.x * blockDim.y));
70 thread_index.y =
71 (unsigned int)((linear_value % (blockDim.x * blockDim.y)) / blockDim.x);
72 thread_index.x =
73 (unsigned int)((linear_value % (blockDim.x * blockDim.y)) % blockDim.x);
74
75 __ESBMC_atomic_end();
76 return thread_index;
77 }
78
79 uint3 getBlockIdx(unsigned int id)
80 {
81 __ESBMC_atomic_begin();
82
83 unsigned int linear_value =
84 (unsigned int)id / (blockDim.x * blockDim.y * blockDim.z);
85
86 uint3 block_index;
87 block_index.z = (unsigned int)(linear_value / (gridDim.x * gridDim.y));
88 block_index.y =
89 (unsigned int)((linear_value % (gridDim.x * gridDim.y)) / gridDim.x);
90 block_index.x =
91 (unsigned int)((linear_value % (gridDim.x * gridDim.y)) % gridDim.x);
92
93 __ESBMC_atomic_end();
94 return block_index;
95 }
96
101 uint3 getThreadIdx_table(unsigned int id)
102 {
103 __ESBMC_atomic_begin();
104
105 unsigned int lookup3Dx[2][2][2] = {{{0, 0}, {0, 0}}, {{0, 1}, {0, 1}}};
106
107 unsigned int gridDim_index = (unsigned int)(gridDim.x - 1);
108 unsigned int blockDim_index = (unsigned int)(blockDim.x - 1);
109
110 uint3 thread_index;
111
112 /* The table only covers blockDim (1|2, 1, 1), so .z is always 0. */
113 thread_index.z = (unsigned int)0;
114 thread_index.y = (unsigned int)0;
115 thread_index.x =
116 (unsigned int)(lookup3Dx[id][gridDim_index][blockDim_index]);
117
118 __ESBMC_atomic_end();
119 return thread_index;
120 }
121
122 uint3 getBlockIdx_table(unsigned int id)
123 {
124 __ESBMC_atomic_begin();
125
126 unsigned int lookup3D[2][2][2] = {{{0, 0}, {0, 0}}, {{1, 0}, {1, 0}}};
127
128 unsigned int gridDim_index = (unsigned int)(gridDim.x - 1);
129 unsigned int blockDim_index = (unsigned int)(blockDim.x - 1);
130
131 uint3 block_index;
132
133 block_index.z = (unsigned int)0;
134 block_index.y = (unsigned int)0;
135 block_index.x = (unsigned int)(lookup3D[id][gridDim_index][blockDim_index]);
136
137 __ESBMC_atomic_end();
138 return block_index;
139 }
140
141# undef __STORAGE__
142
143# ifdef __cplusplus
144}
145# endif
146
147#endif /* !__DEVICE_LAUNCH_PARAMETERS_H__ */
uint3 getThreadIdx_table(unsigned int id)
Apply a lookup table to drastically reduce validation time while retaining the same behavior.
Definition device_launch_parameters.h:101
void assignIndexes()
Definition device_launch_parameters.h:39
dim3 blockDim
Definition device_launch_parameters.h:24
uint3 getThreadIdx(unsigned int id)
Definition device_launch_parameters.h:57
uint3 getBlockIdx(unsigned int id)
Definition device_launch_parameters.h:79
dim3 gridDim
Definition device_launch_parameters.h:26
pthread_t __ESBMC_get_thread_id(void)
#define __STORAGE__
Definition device_launch_parameters.h:14
uint3 getBlockIdx_table(unsigned int id)
Definition device_launch_parameters.h:122
uint3 indexOfThread[1024]
Definition device_launch_parameters.h:30
uint3 indexOfBlock[1024]
Definition device_launch_parameters.h:31
__device_builtin__ __STORAGE__ int warpSize
Definition device_launch_parameters.h:28
#define __device_builtin__
Definition host_defines.h:120
Definition int.py:1
unsigned long int pthread_t
Definition pthread.h:41
__device_builtin__ struct __uint3 uint3
Definition vector_types.h:333
__device_builtin__ struct __dim3 dim3
Definition vector_types.h:395