20#ifndef dftefeDeviceKernelLauncherHelpers_h
21#define dftefeDeviceKernelLauncherHelpers_h
25#ifdef DFTEFE_WITH_DEVICE
26# ifdef DFTEFE_WITH_DEVICE_NVIDIA
31 static const int DEVICE_WARP_SIZE = 32;
32 static const int DEVICE_MAX_BLOCK_SIZE = 1024;
33 static const int DEVICE_BLOCK_SIZE = 256;
38# elif DFTEFE_WITH_DEVICE_AMD
44 static const int DEVICE_WARP_SIZE = 64;
45 static const int DEVICE_MAX_BLOCK_SIZE = 1024;
46 static const int DEVICE_BLOCK_SIZE = 512;
51# elif DFTEFE_WITH_DEVICE_INTEL
57 static const int DEVICE_WARP_SIZE = 32;
58 static const int DEVICE_MAX_BLOCK_SIZE = 1024;
59 static const int DEVICE_BLOCK_SIZE = 256;
65# ifdef DFTEFE_WITH_DEVICE_LANG_CUDA
66# define DFTEFE_LAUNCH_KERNEL(kernel, grid, block, stream, ...) \
69 kernel<<<grid, block, 0, stream>>>(__VA_ARGS__); \
72# elif defined(DFTEFE_WITH_DEVICE_LANG_HIP)
73# define DFTEFE_LAUNCH_KERNEL(kernel, grid, block, stream, ...) \
77 HIP_KERNEL_NAME(kernel), grid, block, 0, stream, __VA_ARGS__); \
80# elif defined(DFTEFE_WITH_DEVICE_LANG_SYCL)
92# define DFTEFE_LAUNCH_KERNEL(kernel, grid, block, stream, ...) \
94 [&](auto &&...dftefe_launch_kernel_args_) { \
95 dftefe::utils::queueRegistry.find(stream)->second.parallel_for( \
96 sycl::nd_range<1>((grid) * (block), block), \
97 [=](sycl::nd_item<1> ind) { \
98 kernel(ind, dftefe_launch_kernel_args_...); \
101 std::make_tuple(__VA_ARGS__))
104 "No device backend defined (DFTEFE_WITH_DEVICE_LANG_CUDA or DFTEFE_WITH_DEVICE_LANG_HIP or DFTEFE_WITH_DEVICE_LANG_SYCL)"
107# ifdef DFTEFE_WITH_DEVICE_LANG_CUDA
108# define DFTEFE_LAUNCH_KERNEL_SMEM_D( \
109 kernel, grid, block, smemtype, smemcount, stream, ...) \
112 kernel<<<grid, block, smemcount * sizeof(smemtype), stream>>>( \
116# elif defined(DFTEFE_WITH_DEVICE_LANG_HIP)
117# define DFTEFE_LAUNCH_KERNEL_SMEM_D( \
118 kernel, grid, block, smemtype, smemcount, stream, ...) \
121 hipLaunchKernelGGL(HIP_KERNEL_NAME(kernel), \
124 smemcount * sizeof(smemtype), \
129# elif defined(DFTEFE_WITH_DEVICE_LANG_SYCL)
130# define DFTEFE_LAUNCH_KERNEL_SMEM_D( \
131 kernel, grid, block, smemtype, smemcount, stream, ...) \
133 [&](auto &&...dftefe_launch_kernel_args_) { \
134 dftefe::utils::queueRegistry.find(stream)->second.submit( \
135 [=](sycl::handler &cgh) { \
136 sycl::local_accessor<smemtype, 1> SMem_acc(smemcount, cgh); \
137 cgh.parallel_for(sycl::nd_range<1>((grid) * (block), block), \
138 [=](sycl::nd_item<1> ind) { \
140 SMem_acc.get_pointer(), \
141 dftefe_launch_kernel_args_...); \
145 std::make_tuple(__VA_ARGS__))
148 "No device backend defined (DFTEFE_WITH_DEVICE_LANG_CUDA or DFTEFE_WITH_DEVICE_LANG_HIP or DFTEFE_WITH_DEVICE_LANG_SYCL)"
151# ifdef DFTEFE_WITH_DEVICE_LANG_CUDA
152# define DFTEFE_LAUNCH_KERNEL_SMEM_S( \
153 kernel, grid, block, smemtype, smemcount, stream, ...) \
156 kernel<<<grid, block, 0, stream>>>(__VA_ARGS__); \
159# elif defined(DFTEFE_WITH_DEVICE_LANG_HIP)
160# define DFTEFE_LAUNCH_KERNEL_SMEM_S( \
161 kernel, grid, block, smemtype, smemcount, stream, ...) \
164 hipLaunchKernelGGL( \
165 HIP_KERNEL_NAME(kernel), grid, block, 0, stream, __VA_ARGS__); \
168# elif defined(DFTEFE_WITH_DEVICE_LANG_SYCL)
169# define DFTEFE_LAUNCH_KERNEL_SMEM_S( \
170 kernel, grid, block, smemtype, smemcount, stream, ...) \
172 [&](auto &&...dftefe_launch_kernel_args_) { \
173 dftefe::utils::queueRegistry.find(stream)->second.submit( \
174 [=](sycl::handler &cgh) { \
175 sycl::local_accessor<smemtype, 1> SMem_acc(smemcount, cgh); \
176 cgh.parallel_for(sycl::nd_range<1>((grid) * (block), block), \
177 [=](sycl::nd_item<1> ind) { \
179 SMem_acc.get_pointer(), \
180 dftefe_launch_kernel_args_...); \
184 std::make_tuple(__VA_ARGS__))
187 "No device backend defined (DFTEFE_WITH_DEVICE_LANG_CUDA or DFTEFE_WITH_DEVICE_LANG_HIP or DFTEFE_WITH_DEVICE_LANG_SYCL)"
191# define DFTEFE_KERNEL_ARGUMENT(...) __VA_ARGS__
194# if defined(DFTEFE_WITH_DEVICE_LANG_CUDA) || \
195 defined(DFTEFE_WITH_DEVICE_LANG_HIP)
196# define DFTEFE_CREATE_KERNEL(RET, NAME, BODY, ...) \
197 __global__ RET NAME(__VA_ARGS__) \
199 const size_type globalThreadId = \
200 blockIdx.x * blockDim.x + threadIdx.x; \
201 const size_type nThreadsPerBlock = blockDim.x; \
202 const size_type nThreadBlock = gridDim.x; \
205# elif defined(DFTEFE_WITH_DEVICE_LANG_SYCL)
206# define DFTEFE_CREATE_KERNEL(RET, NAME, BODY, ...) \
207 RET NAME(sycl::nd_item<1> ind, __VA_ARGS__) \
209 const size_type globalThreadId = ind.get_global_id(0); \
210 const size_type nThreadsPerBlock = ind.get_local_range(0); \
211 const size_type nThreadBlock = ind.get_group_range(0); \
216 "No device backend defined (DFTEFE_WITH_DEVICE_LANG_CUDA or DFTEFE_WITH_DEVICE_LANG_HIP or DFTEFE_WITH_DEVICE_LANG_SYCL)"
219# if defined(DFTEFE_WITH_DEVICE_LANG_CUDA) || \
220 defined(DFTEFE_WITH_DEVICE_LANG_HIP)
221# define DFTEFE_CREATE_KERNEL_SMEM_D(SMEMTYPE, RET, NAME, BODY, ...) \
222 __global__ RET NAME(__VA_ARGS__) \
224 extern __shared__ SMEMTYPE smem[]; \
225 const size_type globalThreadId = \
226 blockIdx.x * blockDim.x + threadIdx.x; \
227 const size_type threadId = threadIdx.x; \
228 const size_type blockId = blockIdx.x; \
229 const size_type nThreadsPerBlock = blockDim.x; \
230 const size_type nThreadBlock = gridDim.x; \
233# elif defined(DFTEFE_WITH_DEVICE_LANG_SYCL)
234# define DFTEFE_CREATE_KERNEL_SMEM_D(SMEMTYPE, RET, NAME, BODY, ...) \
235 RET NAME(sycl::nd_item<1> ind, SMEMTYPE *smem, __VA_ARGS__) \
237 const size_type globalThreadId = ind.get_global_id(0); \
238 const size_type threadId = ind.get_local_id(0); \
239 const size_type blockId = ind.get_group(0); \
240 const size_type nThreadsPerBlock = ind.get_local_range(0); \
241 const size_type nThreadBlock = ind.get_group_range(0); \
246 "No device backend defined (DFTEFE_WITH_DEVICE_LANG_CUDA or DFTEFE_WITH_DEVICE_LANG_HIP or DFTEFE_WITH_DEVICE_LANG_SYCL)"
249# if defined(DFTEFE_WITH_DEVICE_LANG_CUDA) || \
250 defined(DFTEFE_WITH_DEVICE_LANG_HIP)
251# define DFTEFE_CREATE_KERNEL_SMEM_S( \
252 SMEMTYPE, SMEMCOUNT, RET, NAME, BODY, ...) \
253 __global__ RET NAME(__VA_ARGS__) \
255 __shared__ SMEMTYPE smem[SMEMCOUNT]; \
256 const size_type globalThreadId = \
257 blockIdx.x * blockDim.x + threadIdx.x; \
258 const size_type threadId = threadIdx.x; \
259 const size_type blockId = blockIdx.x; \
260 const size_type nThreadsPerBlock = blockDim.x; \
261 const size_type nThreadBlock = gridDim.x; \
264# elif defined(DFTEFE_WITH_DEVICE_LANG_SYCL)
265# define DFTEFE_CREATE_KERNEL_SMEM_S( \
266 SMEMTYPE, SMEMCOUNT, RET, NAME, BODY, ...) \
267 RET NAME(sycl::nd_item<1> ind, SMEMTYPE *smem, __VA_ARGS__) \
269 const size_type globalThreadId = ind.get_global_id(0); \
270 const size_type threadId = ind.get_local_id(0); \
271 const size_type blockId = ind.get_group(0); \
272 const size_type nThreadsPerBlock = ind.get_local_range(0); \
273 const size_type nThreadBlock = ind.get_group_range(0); \
278 "No device backend defined (DFTEFE_WITH_DEVICE_LANG_CUDA or DFTEFE_WITH_DEVICE_LANG_HIP or DFTEFE_WITH_DEVICE_LANG_SYCL)"
282# if defined(DFTEFE_WITH_DEVICE_LANG_CUDA) || \
283 defined(DFTEFE_WITH_DEVICE_LANG_HIP)
284# define SYNCTHREADS __syncthreads()
285# elif defined(DFTEFE_WITH_DEVICE_LANG_SYCL)
286# define SYNCTHREADS sycl::group_barrier(ind.get_group());
289 "No device backend defined (DFTEFE_WITH_DEVICE_LANG_CUDA or DFTEFE_WITH_DEVICE_LANG_HIP or DFTEFE_WITH_DEVICE_LANG_SYCL)"
292# if defined(DFTEFE_WITH_DEVICE_LANG_CUDA) || \
293 defined(DFTEFE_WITH_DEVICE_LANG_HIP)
295# define DFTEFE_DEVICE __device__
296# define DFTEFE_HOST_DEVICE __host__ __device__
297# define DFTEFE_FORCEINLINE __forceinline__
299# elif defined(DFTEFE_WITH_DEVICE_LANG_SYCL)
302# define DFTEFE_DEVICE
303# define DFTEFE_HOST_DEVICE
304# if defined(__clang__)
305# define DFTEFE_FORCEINLINE inline __attribute__((always_inline))
307# define DFTEFE_FORCEINLINE inline
311# error "DFTEFE_WITH_DEVICE is set but no backend (CUDA/HIP/SYCL) defined"
316# define DFTEFE_HOST_DEVICE
317# define DFTEFE_FORCEINLINE inline
321#define DFTEFE_HOST_DEVICE_FUNC DFTEFE_FORCEINLINE DFTEFE_HOST_DEVICE
dealii includes
Definition: AtomFieldDataSpherical.cpp:31