规约算法-reduction

CUDA Samples上的例子,可是那个封装的优点太复杂,不适合初学者看,按照上面的方法实现了一下。如下

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <math.h>
#include "book.h"
#define SIZE 81920000
#define THREAD_NUM 512

__global__ void reduce1(float *a, float *c, int size)
{
        int i = threadIdx.x + blockDim.x * blockIdx.x;
        __shared__ float sdata[THREAD_NUM];
        sdata[threadIdx.x] = i < size ? a[i] : 0;
        __syncthreads();    

        int j = THREAD_NUM / 2;
        while (j != 0)
        {
                if (threadIdx.x < j)
                {
                        sdata[threadIdx.x] += sdata[threadIdx.x + j];
                }
                 __syncthreads();

                j /= 2;
        }


        if (threadIdx.x == 0)
        {
                c[blockIdx.x] = sdata[0];
        }
}


__global__ void reduce2(float *a, float *c, int size)
{
        int i = threadIdx.x + blockIdx.x * 2 * blockDim.x;
        __shared__ float sdata[THREAD_NUM];

        float sum = i < size ? a[i] : 0;

        if (i + blockDim.x < size)
                sum += a[i+blockDim.x];

        sdata[threadIdx.x] = sum;
        __syncthreads();

        int j = THREAD_NUM/2;
        while (j > 0)
        {
                if (threadIdx.x < j)
                        sdata[threadIdx.x] += sdata[threadIdx.x + j];
                __syncthreads();
                j /= 2;
        }

        if (threadIdx.x == 0)
        {
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值