cuda编程-并行规约

cuda编程-并行规约

大家好,又见面了,我是全栈君。

利用shared memory计算,并避免bank conflict;通过每个block内部规约,然后再把所有block的计算结果在CPU端累加

cuda编程-并行规约

 

代码:

#include <cuda_runtime.h>
#include <device_launch_parameters.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory>
#include <iostream>

#define DATA_SIZE 128
#define TILE_SIZE 64

__global__ void reductionKernel(float *in, float *out){
    int tx = threadIdx.x;
    int bx = blockIdx.x;

    __shared__ float data_shm[TILE_SIZE];
    data_shm[tx] = in[bx * blockDim.x + tx];
    __syncthreads();

    for (int i = blockDim.x / 2; i > 0; i >>= 1){
        if (tx < i){
            data_shm[tx] += data_shm[tx + i];
        }
        __syncthreads();
    }

    if (tx == 0)
        out[bx] = data_shm[0];
}

void reduction(){
    int out_size = (DATA_SIZE + TILE_SIZE - 1) / TILE_SIZE;
    float *in = (float*)malloc(DATA_SIZE * sizeof(float));
    float *out = (float*)malloc(out_size*sizeof(float));
    for (int i = 0; i < DATA_SIZE; ++i){
        in[i] = i;
    }
    memset(out, 0, out_size*sizeof(float));

    float *d_in, *d_out;
    cudaMalloc((void**)&d_in, DATA_SIZE * sizeof(float));
    cudaMalloc((void**)&d_out, out_size*sizeof(float));
    cudaMemcpy(d_in, in, DATA_SIZE * sizeof(float), cudaMemcpyHostToDevice);

    dim3 block(TILE_SIZE, 1);
    dim3 grid(out_size, 1);
    reductionKernel << <grid, block >> >(d_in, d_out);

    cudaMemcpy(in, d_in, DATA_SIZE * sizeof(float), cudaMemcpyDeviceToHost);
    cudaMemcpy(out, d_out, out_size * sizeof(float), cudaMemcpyDeviceToHost);

    float sum = 0;
    for (int i = 0; i < out_size; ++i){
        sum += out[i];
    }
    std::cout << sum << std::endl;

    // Check on CPU
    float sum_cpu = 0;
    for (int i = 0; i < DATA_SIZE; ++i){
        sum_cpu += in[i];
    }
    std::cout << sum_cpu << std::endl;

}

 

转载于:https://www.cnblogs.com/haiyang21/p/7795678.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108053.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python初学入门教程_初学python编程入门教程「建议收藏」

    python初学入门教程_初学python编程入门教程「建议收藏」对于不同的编程语言来讲,各有各的特点,各有各的长处。python这个编程语言,有什么明显的好处呢?有经验的程序员甚至可能在一天之内就掌握Python的基础知识,至多不过一周作用就可以上手,而编程语言的专家则肯定会比他掌握C、C++、Java甚至Perl要快很多。Python因其语法的明晰而获得的最大好处或许该算是开发时间的大大降低了。由于它易学、易用,学习成本较低,写代码的效率较高,所以使用者很…

    2022年6月22日
    28
  • 我为什么放弃Go语言

    我为什么放弃Go语言我为什么放弃Go语言?有好几次,当我想起来的时候,总是会问自己:这个决定是正确的吗?是明智和理性的吗?其实我一直在认真思考这个问题。开门见山地说,我当初放弃Go语言,就是因为两个“不爽”:第一,对Go语言本身不爽;第二,对Go语言社区里的某些人不爽。毫无疑问,这是非常主观的结论,但是我有足够详实的客观的论据。

    2022年6月30日
    23
  • 关于PHP在企业中处理数字加减乘除和对比运算方案

    关于PHP在企业中处理数字加减乘除和对比运算方案

    2021年6月29日
    98
  • ping不是内部或外部命令也不是可运行win10_电脑关掉防火墙仍然ping不通

    ping不是内部或外部命令也不是可运行win10_电脑关掉防火墙仍然ping不通前段时间配置Java环境将Path配置错误了计算机右键点击属性高级系统设置->环境变量系统变量编辑Path添加语句;C:\Windows\System32重新打开cmdpingwww.baidu.comnetstat-a出现上图表示配置成功…

    2025年6月22日
    2
  • WebClien使用国外代理服务器访问URL

    WebClien使用国外代理服务器访问URLusing(WebClientwc=newWebClient()){//代理服务器的IP和PortWebProxymyProxy=newWebProxy(CommonBLL.server,Convert.ToInt32(CommonBLL.port))…

    2022年4月29日
    65
  • 图解 AD9364模块 TDD与FDD

    图解 AD9364模块 TDD与FDD转载自:http://iphonebbs.cnmo.com/thread-14714263-1-1.html如图和明显TDD是这一秒上行,下一秒下行FDD是两个通道再详细点就是TDD就是这一个时段进,下一个时段出,所以叫做时分双工,速度越快,衰落变换频率越高,衰落深度越深,因此必须要求移动速度不能太高。而FDD是双向通道,是两个频段,所以叫做频分双工,FDD模式的特点是在分离(上下行频率间隔…

    2022年6月7日
    38

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号