20#ifndef dftefeDeviceKernelLauncherHelpers_h
21#define dftefeDeviceKernelLauncherHelpers_h
23#ifdef DFTEFE_WITH_DEVICE
24# ifdef DFTEFE_WITH_DEVICE_NVIDIA
29 static const int DEVICE_WARP_SIZE = 32;
30 static const int DEVICE_MAX_BLOCK_SIZE = 1024;
31 static const int DEVICE_BLOCK_SIZE = 256;
36# elif DFTEFE_WITH_DEVICE_AMD
42 static const int DEVICE_WARP_SIZE = 64;
43 static const int DEVICE_MAX_BLOCK_SIZE = 1024;
44 static const int DEVICE_BLOCK_SIZE = 512;
49# elif DFTEFE_WITH_DEVICE_INTEL
55 static const int DEVICE_WARP_SIZE = 32;
56 static const int DEVICE_MAX_BLOCK_SIZE = 1024;
57 static const int DEVICE_BLOCK_SIZE = 256;
63# ifdef DFTEFE_WITH_DEVICE_LANG_CUDA
64# define DFTEFE_LAUNCH_KERNEL(kernel, grid, block, stream, ...) \
67 kernel<<<grid, block, 0, stream>>>(__VA_ARGS__); \
70# elif defined(DFTEFE_WITH_DEVICE_LANG_HIP)
71# define DFTEFE_LAUNCH_KERNEL(kernel, grid, block, stream, ...) \
75 HIP_KERNEL_NAME(kernel), grid, block, 0, stream, __VA_ARGS__); \
78# elif defined(DFTEFE_WITH_DEVICE_LANG_SYCL)
79# define DFTEFE_LAUNCH_KERNEL(kernel, grid, block, stream, ...) \
82 dftefe::utils::queueRegistry.find(stream)->second.parallel_for( \
83 sycl::nd_range<1>((grid) * (block), block), \
84 [=](sycl::nd_item<1> ind) { kernel(ind, __VA_ARGS__); }); \
89 "No device backend defined (DFTEFE_WITH_DEVICE_LANG_CUDA or DFTEFE_WITH_DEVICE_LANG_HIP or DFTEFE_WITH_DEVICE_LANG_SYCL)"
92# ifdef DFTEFE_WITH_DEVICE_LANG_CUDA
93# define DFTEFE_LAUNCH_KERNEL_SMEM_D( \
94 kernel, grid, block, smemtype, smemcount, stream, ...) \
97 kernel<<<grid, block, smemcount * sizeof(smemtype), stream>>>( \
101# elif defined(DFTEFE_WITH_DEVICE_LANG_HIP)
102# define DFTEFE_LAUNCH_KERNEL_SMEM_D( \
103 kernel, grid, block, smemtype, smemcount, stream, ...) \
106 hipLaunchKernelGGL(HIP_KERNEL_NAME(kernel), \
109 smemcount * sizeof(smemtype), \
114# elif defined(DFTEFE_WITH_DEVICE_LANG_SYCL)
115# define DFTEFE_LAUNCH_KERNEL_SMEM_D( \
116 kernel, grid, block, smemtype, smemcount, stream, ...) \
119 dftefe::utils::queueRegistry.find(stream)->second.submit( \
120 [=](sycl::handler &cgh) { \
121 sycl::local_accessor<smemtype, 1> SMem_acc(smemcount, cgh); \
122 cgh.parallel_for(sycl::nd_range<1>((grid) * (block), block), \
123 [=](sycl::nd_item<1> ind) { \
125 SMem_acc.get_pointer(), \
133 "No device backend defined (DFTEFE_WITH_DEVICE_LANG_CUDA or DFTEFE_WITH_DEVICE_LANG_HIP or DFTEFE_WITH_DEVICE_LANG_SYCL)"
136# ifdef DFTEFE_WITH_DEVICE_LANG_CUDA
137# define DFTEFE_LAUNCH_KERNEL_SMEM_S( \
138 kernel, grid, block, smemtype, smemcount, stream, ...) \
141 kernel<<<grid, block, 0, stream>>>(__VA_ARGS__); \
144# elif defined(DFTEFE_WITH_DEVICE_LANG_HIP)
145# define DFTEFE_LAUNCH_KERNEL_SMEM_S( \
146 kernel, grid, block, smemtype, smemcount, stream, ...) \
149 hipLaunchKernelGGL( \
150 HIP_KERNEL_NAME(kernel), grid, block, 0, stream, __VA_ARGS__); \
153# elif defined(DFTEFE_WITH_DEVICE_LANG_SYCL)
154# define DFTEFE_LAUNCH_KERNEL_SMEM_S( \
155 kernel, grid, block, smemtype, smemcount, stream, ...) \
158 dftefe::utils::queueRegistry.find(stream)->second.submit( \
159 [=](sycl::handler &cgh) { \
160 sycl::local_accessor<smemtype, 1> SMem_acc(smemcount, cgh); \
161 cgh.parallel_for(sycl::nd_range<1>((grid) * (block), block), \
162 [=](sycl::nd_item<1> ind) { \
164 SMem_acc.get_pointer(), \
172 "No device backend defined (DFTEFE_WITH_DEVICE_LANG_CUDA or DFTEFE_WITH_DEVICE_LANG_HIP or DFTEFE_WITH_DEVICE_LANG_SYCL)"
176# define DFTEFE_KERNEL_ARGUMENT(...) __VA_ARGS__
179# if defined(DFTEFE_WITH_DEVICE_LANG_CUDA) || \
180 defined(DFTEFE_WITH_DEVICE_LANG_HIP)
181# define DFTEFE_CREATE_KERNEL(RET, NAME, BODY, ...) \
182 __global__ RET NAME(__VA_ARGS__) \
184 const size_type globalThreadId = \
185 blockIdx.x * blockDim.x + threadIdx.x; \
186 const size_type nThreadsPerBlock = blockDim.x; \
187 const size_type nThreadBlock = gridDim.x; \
190# elif defined(DFTEFE_WITH_DEVICE_LANG_SYCL)
191# define DFTEFE_CREATE_KERNEL(RET, NAME, BODY, ...) \
192 RET NAME(sycl::nd_item<1> ind, __VA_ARGS__) \
194 const size_type globalThreadId = ind.get_global_id(0); \
195 const size_type nThreadsPerBlock = ind.get_local_range(0); \
196 const size_type nThreadBlock = ind.get_group_range(0); \
201 "No device backend defined (DFTEFE_WITH_DEVICE_LANG_CUDA or DFTEFE_WITH_DEVICE_LANG_HIP or DFTEFE_WITH_DEVICE_LANG_SYCL)"
204# if defined(DFTEFE_WITH_DEVICE_LANG_CUDA) || \
205 defined(DFTEFE_WITH_DEVICE_LANG_HIP)
206# define DFTEFE_CREATE_KERNEL_SMEM_D(SMEMTYPE, RET, NAME, BODY, ...) \
207 __global__ RET NAME(__VA_ARGS__) \
209 extern __shared__ SMEMTYPE smem[]; \
210 const size_type globalThreadId = \
211 blockIdx.x * blockDim.x + threadIdx.x; \
212 const size_type threadId = threadIdx.x; \
213 const size_type blockId = blockIdx.x; \
214 const size_type nThreadsPerBlock = blockDim.x; \
215 const size_type nThreadBlock = gridDim.x; \
218# elif defined(DFTEFE_WITH_DEVICE_LANG_SYCL)
219# define DFTEFE_CREATE_KERNEL_SMEM_D(SMEMTYPE, RET, NAME, BODY, ...) \
220 RET NAME(sycl::nd_item<1> ind, SMEMTYPE *smem, __VA_ARGS__) \
222 const size_type globalThreadId = ind.get_global_id(0); \
223 const size_type threadId = ind.get_local_id(0); \
224 const size_type blockId = ind.get_group(0); \
225 const size_type nThreadsPerBlock = ind.get_local_range(0); \
226 const size_type nThreadBlock = ind.get_group_range(0); \
231 "No device backend defined (DFTEFE_WITH_DEVICE_LANG_CUDA or DFTEFE_WITH_DEVICE_LANG_HIP or DFTEFE_WITH_DEVICE_LANG_SYCL)"
234# if defined(DFTEFE_WITH_DEVICE_LANG_CUDA) || \
235 defined(DFTEFE_WITH_DEVICE_LANG_HIP)
236# define DFTEFE_CREATE_KERNEL_SMEM_S( \
237 SMEMTYPE, SMEMCOUNT, RET, NAME, BODY, ...) \
238 __global__ RET NAME(__VA_ARGS__) \
240 __shared__ SMEMTYPE smem[SMEMCOUNT]; \
241 const size_type globalThreadId = \
242 blockIdx.x * blockDim.x + threadIdx.x; \
243 const size_type threadId = threadIdx.x; \
244 const size_type blockId = blockIdx.x; \
245 const size_type nThreadsPerBlock = blockDim.x; \
246 const size_type nThreadBlock = gridDim.x; \
249# elif defined(DFTEFE_WITH_DEVICE_LANG_SYCL)
250# define DFTEFE_CREATE_KERNEL_SMEM_S( \
251 SMEMTYPE, SMEMCOUNT, RET, NAME, BODY, ...) \
252 RET NAME(sycl::nd_item<1> ind, SMEMTYPE *smem, __VA_ARGS__) \
254 const size_type globalThreadId = ind.get_global_id(0); \
255 const size_type threadId = ind.get_local_id(0); \
256 const size_type blockId = ind.get_group(0); \
257 const size_type nThreadsPerBlock = ind.get_local_range(0); \
258 const size_type nThreadBlock = ind.get_group_range(0); \
263 "No device backend defined (DFTEFE_WITH_DEVICE_LANG_CUDA or DFTEFE_WITH_DEVICE_LANG_HIP or DFTEFE_WITH_DEVICE_LANG_SYCL)"
267# if defined(DFTEFE_WITH_DEVICE_LANG_CUDA) || \
268 defined(DFTEFE_WITH_DEVICE_LANG_HIP)
269# define SYNCTHREADS __syncthreads()
270# elif defined(DFTEFE_WITH_DEVICE_LANG_SYCL)
271# define SYNCTHREADS sycl::group_barrier(ind.get_group());
274 "No device backend defined (DFTEFE_WITH_DEVICE_LANG_CUDA or DFTEFE_WITH_DEVICE_LANG_HIP or DFTEFE_WITH_DEVICE_LANG_SYCL)"
277# if defined(DFTEFE_WITH_DEVICE_LANG_CUDA) || \
278 defined(DFTEFE_WITH_DEVICE_LANG_HIP)
280# define DFTEFE_DEVICE __device__
281# define DFTEFE_HOST_DEVICE __host__ __device__
282# define DFTEFE_FORCEINLINE __forceinline__
284# elif defined(DFTEFE_WITH_DEVICE_LANG_SYCL)
287# define DFTEFE_DEVICE
288# define DFTEFE_HOST_DEVICE
289# if defined(__clang__)
290# define DFTEFE_FORCEINLINE inline __attribute__((always_inline))
292# define DFTEFE_FORCEINLINE inline
296# error "DFTEFE_WITH_DEVICE is set but no backend (CUDA/HIP/SYCL) defined"
301# define DFTEFE_HOST_DEVICE
302# define DFTEFE_FORCEINLINE inline
306#define DFTEFE_HOST_DEVICE_FUNC DFTEFE_FORCEINLINE DFTEFE_HOST_DEVICE
dealii includes
Definition: AtomFieldDataSpherical.cpp:31