83 extern __shared__ T shared_memory[];
84 const int number_of_tasks = dev_.num_tasks_per_block_dev[
block_index()];
86 if (number_of_tasks == 0)
89 T *smem_alpha = &shared_memory[0];
91 const int offset = dev_.sorted_blocks_offset_dev[
block_index()];
92 T *smem_cab =
reinterpret_cast<double *
>(
93 __builtin_assume_aligned(allocate_workspace<T>(dev_), 32));
95 for (
int tk = 0; tk < number_of_tasks; tk++) {
97 const int task_id = dev_.task_sorted_by_blocks_dev[offset + tk];
98 if (dev_.tasks[task_id].skip_task)
102 T *__restrict__ coef_ =
103 &dev_.buffers_dev.coef[dev_.tasks[task_id].coef_offset];
107 for (
int z = tid; z < task.n1 * task.n2;
108 z += blockDim.x * blockDim.y * blockDim.z)
112 block_to_cab<T, IS_FUNC_AB>(dev_, task, smem_cab);
154 if (dev_.tasks[dev_.first_task +
block_index()].skip_task)
162 extern __shared__ T coefs_[];
164 const size_t coef_offset =
165 dev_.tasks[dev_.first_task +
block_index()].coef_offset;
166 T *coef_ = &dev_.buffers_dev.coef[coef_offset];
171 dh_[tid] = dev_.dh_[tid];
174 for (
int i = tid;
i < ncoset(6);
i += blockDim.x * blockDim.y * blockDim.z)
175 coefs_[
i] = coef_[
i];
181 setup_task_cube_center<T, T3, distributed__>(dev_, task);
185 for (
int z = threadIdx.z; z < task.cube_size.z; z += blockDim.z) {
186 int z2 =
wrap_grid_index(z + task.cube_center.z, dev_.grid_full_size_.z);
190 if (task.apply_border_mask) {
194 if ((z2 < task.window_shift.z) || (z2 > task.window_size.z)) {
203 int ymax = task.cube_size.y - 1;
205 if (orthogonal_ && !task.apply_border_mask) {
209 for (
int y = ymin + threadIdx.y; y <= ymax; y += blockDim.y) {
210 int y2 =
wrap_grid_index(y + task.cube_center.y, dev_.grid_full_size_.y);
213 if (task.apply_border_mask) {
215 if ((y2 < task.window_shift.y) || (y2 > task.window_size.y)) {
222 int xmax = task.cube_size.x - 1;
223 if (orthogonal_ && !task.apply_border_mask) {
224 calculate_xmin_xmax_boundaries<T, T3>(task, y, kremain, xmin, xmax);
227 for (
int x = xmin + threadIdx.x; x <= xmax; x += blockDim.x) {
232 if (task.apply_border_mask) {
235 if ((x2 < task.window_shift.x) || (x2 > task.window_size.x)) {
246 (y + task.lb_cube.y + task.roffset.y),
247 (z + task.lb_cube.z + task.roffset.z));
249 const T r3x2 = r3.x * r3.x;
250 const T r3y2 = r3.y * r3.y;
251 const T r3z2 = r3.z * r3.z;
258 if (((task.radius * task.radius) <= (r3x2 + r3y2 + r3z2)) &&
259 (!orthogonal_ || task.apply_border_mask))
263 if ((!orthogonal_) &&
264 ((task.radius * task.radius) <= (r3x2 + r3y2 + r3z2)))
273 res += coefs_[1] * r3.x;
274 res += coefs_[2] * r3.y;
275 res += coefs_[3] * r3.z;
277 const T r3xy = r3.x * r3.y;
278 const T r3xz = r3.x * r3.z;
279 const T r3yz = r3.y * r3.z;
282 res += coefs_[4] * r3x2;
283 res += coefs_[5] * r3xy;
284 res += coefs_[6] * r3xz;
285 res += coefs_[7] * r3y2;
286 res += coefs_[8] * r3yz;
287 res += coefs_[9] * r3z2;
292 (coefs_[10] * r3.x + coefs_[11] * r3.y + coefs_[12] * r3.z);
293 res += r3.x * (coefs_[13] * r3y2 + coefs_[15] * r3z2);
294 res += coefs_[14] * r3xy * r3.z;
295 res += r3y2 * (coefs_[16] * r3.y + coefs_[17] * r3.z);
296 res += r3z2 * (coefs_[18] * r3.y + coefs_[19] * r3.z);
301 (coefs_[20] * r3x2 + coefs_[21] * r3xy + coefs_[22] * r3xz +
302 coefs_[23] * r3y2 + coefs_[24] * r3yz + coefs_[25] * r3z2);
304 (coefs_[26] * r3xy + coefs_[27] * r3xz + coefs_[30] * r3y2 +
305 coefs_[31] * r3yz + coefs_[32] * r3z2);
306 res += r3z2 * (coefs_[28] * r3xy + coefs_[29] * r3xz +
307 coefs_[33] * r3yz + coefs_[34] * r3z2);
311 const T r3x4 = r3x2 * r3x2;
312 const T r3y4 = r3y2 * r3y2;
313 const T r3z4 = r3z2 * r3z2;
315 res += r3x4 * (coefs_[35] * r3.x +
318 res += r3x2 * (r3.x * (coefs_[38] * r3y2 +
321 r3y2 * (coefs_[41] * r3.y +
323 r3z2 * (coefs_[43] * r3.y +
325 res += r3.x * (coefs_[45] * r3y4 +
326 r3y2 * (coefs_[46] * r3yz +
328 r3z2 * (coefs_[48] * r3yz +
330 res += r3y2 * (r3y2 * (coefs_[50] * r3.y +
332 r3z2 * (coefs_[52] * r3.y +
334 res += r3z4 * (coefs_[54] * r3.y +
338 res += r3x4 * (coefs_[56] * r3x2 +
345 res += r3x2 * (coefs_[62] * r3y2 * r3xy +
346 coefs_[63] * r3y2 * r3xz +
347 coefs_[64] * r3xy * r3z2 +
348 coefs_[65] * r3z2 * r3xz +
350 coefs_[67] * r3y2 * r3yz +
351 coefs_[68] * r3y2 * r3z2 +
352 coefs_[69] * r3yz * r3z2 +
359 res += r3y4 * (coefs_[71] * r3xy +
364 res += r3z4 * (coefs_[75] * r3xy +
371 for (
int ic = ncoset(6); ic < ncoset(task.lp); ic++) {
374 for (
int po = 0; po < (co.l[2] >> 1); po++)
378 for (
int po = 0; po < (co.l[1] >> 1); po++)
382 for (
int po = 0; po < (co.l[0] >> 1); po++)
386 res += tmp * coef_[ic];
391 res *= exp(-(r3x2 + r3y2 + r3z2) * task.zetp);
392 atomicAdd(dev_.buffers_dev.grid +
393 (z2 * dev_.grid_local_size_.y + y2) *
394 dev_.grid_local_size_.x +
442 *lp_diff = smem_params.
lp_diff();
446 kernel_params params = set_kernel_parameters(level, smem_params);
450 const dim3 threads_per_block(4, 4, 4);
452 if (
grid_[level].is_distributed()) {
453 if (
grid_[level].is_orthogonal())
454 collocate_kernel<double, double3, true, true>
458 collocate_kernel<double, double3, true, false>
462 if (
grid_[level].is_orthogonal())
463 collocate_kernel<double, double3, false, true>
467 collocate_kernel<double, double3, false, false>