70template <
size_t blockSize,
size_t str
ide,
typename T>
71__device__
static void __forceinline__
72cs_hip_reduce_warp_reduce_sum(
volatile T *stmp,
77#if CS_HIP_WARP_SIZE == 64
78 if (blockSize >= 128) stmp[tid] += stmp[tid + 64];
80 if (blockSize >= 64) stmp[tid] += stmp[tid + 32];
81 if (blockSize >= 32) stmp[tid] += stmp[tid + 16];
82 if (blockSize >= 16) stmp[tid] += stmp[tid + 8];
83 if (blockSize >= 8) stmp[tid] += stmp[tid + 4];
84 if (blockSize >= 4) stmp[tid] += stmp[tid + 2];
85 if (blockSize >= 2) stmp[tid] += stmp[tid + 1];
90#if CS_HIP_WARP_SIZE == 64
91 if (blockSize >= 128) {
93 for (
size_t i = 0; i < stride; i++)
94 stmp[tid*stride + i] += stmp[(tid + 64)*stride + i];
97 if (blockSize >= 64) {
99 for (
size_t i = 0; i < stride; i++)
100 stmp[tid*stride + i] += stmp[(tid + 32)*stride + i];
102 if (blockSize >= 32) {
104 for (
size_t i = 0; i < stride; i++)
105 stmp[tid*stride + i] += stmp[(tid + 16)*stride + i];
107 if (blockSize >= 16) {
109 for (
size_t i = 0; i < stride; i++)
110 stmp[tid*stride + i] += stmp[(tid + 8)*stride + i];
112 if (blockSize >= 8) {
114 for (
size_t i = 0; i < stride; i++)
115 stmp[tid*stride + i] += stmp[(tid + 4)*stride + i];
117 if (blockSize >= 4) {
119 for (
size_t i = 0; i < stride; i++)
120 stmp[tid*stride + i] += stmp[(tid + 2)*stride + i];
122 if (blockSize >= 2) {
124 for (
size_t i = 0; i < stride; i++)
125 stmp[tid*stride + i] += stmp[(tid + 1)*stride + i];
150template <
size_t blockSize,
size_t str
ide,
typename T>
151__device__
static void __forceinline__
152cs_hip_reduce_block_reduce_sum(T *stmp,
162 if (blockSize >= 1024) {
164 stmp[tid] += stmp[tid + 512];
168 if (blockSize >= 512) {
170 stmp[tid] += stmp[tid + 256];
174 if (blockSize >= 256) {
176 stmp[tid] += stmp[tid + 128];
179#if CS_HIP_WARP_SIZE == 32
180 if (blockSize >= 128) {
182 stmp[tid] += stmp[tid + 64];
187 cs_hip_reduce_warp_reduce_sum<blockSize, stride>(stmp, tid);
191 cs_hip_reduce_warp_reduce_sum<blockSize, stride>(stmp, tid);
197 if (tid == 0) sum_block[blockIdx.x] = stmp[0];
203 if (blockSize >= 1024) {
206 for (
size_t i = 0; i < stride; i++)
207 stmp[tid*stride + i] += stmp[(tid + 512)*stride + i];
211 if (blockSize >= 512) {
214 for (
size_t i = 0; i < stride; i++)
215 stmp[tid*stride + i] += stmp[(tid + 256)*stride + i];
219 if (blockSize >= 256) {
222 for (
size_t i = 0; i < stride; i++)
223 stmp[tid*stride + i] += stmp[(tid + 128)*stride + i];
226#if CS_HIP_WARP_SIZE == 32
227 if (blockSize >= 128) {
230 for (
size_t i = 0; i < stride; i++)
231 stmp[tid*stride + i] += stmp[(tid + 64)*stride + i];
236 cs_hip_reduce_warp_reduce_sum<blockSize, stride>(stmp, tid);
239 cs_hip_reduce_warp_reduce_sum<blockSize, stride>(stmp, tid);
246 for (
size_t i = 0; i < stride; i++)
247 sum_block[(blockIdx.x)*stride + i] = stmp[i];
265template <
size_t blockSize,
size_t str
ide,
typename T>
266__global__
static void
267cs_hip_reduce_sum_single_block(
size_t n,
271 __shared__ T sdata[blockSize * stride];
273 size_t tid = threadIdx.x;
281 for (
size_t i = threadIdx.x; i < n; i+= blockSize)
282 r_s[0] += g_idata[i];
287 for (
size_t j = blockSize/2; j > CS_HIP_WARP_SIZE; j /= 2) {
289 sdata[tid] += sdata[tid + j];
294 if (tid < CS_HIP_WARP_SIZE) cs_hip_reduce_warp_reduce_sum<blockSize, stride>(sdata, tid);
295 if (tid == 0) *g_odata = sdata[0];
301 for (
size_t k = 0;
k < stride;
k++) {
303 sdata[tid*stride +
k] = 0.;
306 for (
size_t i = threadIdx.x; i < n; i+= blockSize) {
308 for (
size_t k = 0;
k < stride;
k++) {
309 r_s[
k] += g_idata[i*stride +
k];
314 for (
size_t k = 0;
k < stride;
k++)
315 sdata[tid*stride +
k] = r_s[
k];
318 for (
size_t j = blockSize/2; j > CS_HIP_WARP_SIZE; j /= 2) {
321 for (
size_t k = 0;
k < stride;
k++)
322 sdata[tid*stride +
k] += sdata[(tid + j)*stride +
k];
327 if (tid < CS_HIP_WARP_SIZE) cs_hip_reduce_warp_reduce_sum<blockSize, stride>(sdata, tid);
330 for (
size_t k = 0;
k < stride;
k++)
331 g_odata[
k] = sdata[
k];
350template <
size_t blockSize,
typename R,
typename T>
351__device__
static void __forceinline__
352cs_hip_reduce_warp_reduce(
volatile T *stmp,
357#if CS_HIP_WARP_SIZE == 64
358 if (blockSize >= 128) reducer.combine(stmp[tid], stmp[tid + 64]);
360 if (blockSize >= 64) reducer.combine(stmp[tid], stmp[tid + 32]);
361 if (blockSize >= 32) reducer.combine(stmp[tid], stmp[tid + 16]);
362 if (blockSize >= 16) reducer.combine(stmp[tid], stmp[tid + 8]);
363 if (blockSize >= 8) reducer.combine(stmp[tid], stmp[tid + 4]);
364 if (blockSize >= 4) reducer.combine(stmp[tid], stmp[tid + 2]);
365 if (blockSize >= 2) reducer.combine(stmp[tid], stmp[tid + 1]);
385template <
size_t blockSize,
typename R,
typename T>
386__device__
static void __forceinline__
387cs_hip_reduce_block_reduce(T *stmp,
396 if (blockSize >= 1024) {
398 reducer.combine(stmp[tid], stmp[tid + 512]);
402 if (blockSize >= 512) {
404 reducer.combine(stmp[tid], stmp[tid + 256]);
408 if (blockSize >= 256) {
410 reducer.combine(stmp[tid], stmp[tid + 128]);
413#if CS_HIP_WARP_SIZE == 32
414 if (blockSize >= 128) {
416 reducer.combine(stmp[tid], stmp[tid + 64]);
421 cs_hip_reduce_warp_reduce<blockSize, R>(stmp, tid);
425 cs_hip_reduce_warp_reduce<blockSize, R>(stmp, tid);
431 if (tid == 0) rd_block[blockIdx.x] = stmp[0];
448template <
size_t blockSize,
typename R,
typename T>
449__global__
static void
450cs_hip_reduce_single_block(
size_t n,
454 extern __shared__
int p_stmp[];
455 T *sdata =
reinterpret_cast<T *
>(p_stmp);
458 size_t tid = threadIdx.x;
461 reducer.identity(r_s[0]);
462 reducer.identity(sdata[tid]);
464 for (
size_t i = threadIdx.x; i < n; i+= blockSize)
465 reducer.combine(r_s[0], g_idata[i]);
470 for (
size_t j = blockSize/2; j > CS_HIP_WARP_SIZE; j /= 2) {
472 reducer.combine(sdata[tid], sdata[tid + j]);
477 if (tid < CS_HIP_WARP_SIZE) cs_hip_reduce_warp_reduce<blockSize, R>(sdata, tid);
478 if (tid == 0) *g_odata = sdata[0];
@ k
Definition: cs_field_pointer.h:68