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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C语言结构体(struct)常见使用方法[通俗易懂]

    C语言结构体(struct)常见使用方法[通俗易懂]注意:盗版是不会得到修正和更新的!今天复习一下struct,顺便挖掘一下以前没注意的小细节:基本定义:结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问修改内部变量。(因为C++和C有共通之处,但是在结构体上的某些机制又有所不同,所以后边提了一下,不喜欢可以略过)结构体定义:…

    2022年5月12日
    76
  • Java动态代理实现动态爬虫

    Java动态代理实现动态爬虫笔者公司是一家区块链门户网站,该网站的很多资讯,快讯,视频等数据都是通过爬虫爬取得第三方网站获得的,需要从很多网站要爬取数据,如果每个数据源网站都需要单独写个接口去爬的话,工作量无疑是巨大的,因为笔者想到了通过动态代理实现一套爬虫机制,每次要爬取新的数据源,只要在数据库里增加一条数据源即可,无需修改代码。废话不多说,下贴出数据库表结构DROPTABLEIFEXISTS…

    2022年7月15日
    20
  • redis缓存雪崩 缓存穿透 缓存击穿如何解决_redis防止缓存击穿

    redis缓存雪崩 缓存穿透 缓存击穿如何解决_redis防止缓存击穿文章目录缓存穿透缓存击穿缓存雪崩缓存穿透数据库中没有这个数据,内存中也没有这个数据简单场景public class demoController { public R selectOrderById(int id){ Object redisObj = ValueOperations.get(Strubg.valueof(id)); if(redisObj != null){ return new R().setCode(200).

    2022年8月8日
    5
  • android studio java和xml_android studio闪退

    android studio java和xml_android studio闪退Program:         $JDKPath$\bin\javah.exeParameters:      -classpath$OutputPath$;$ModuleSdkPath$/platforms/android-25/android.jar-jni-d$ModuleFileDir$/src/main/jni$FileClass$

    2022年9月24日
    2
  • 项目POC_poc技术

    项目POC_poc技术PoC(ProofofConcept),即概念验证。通常是企业进行产品选型时或开展外部实施项目前,进行的一种产品或供应商能力验证工作。验证内容1、产品的功能。产品功能由企业提供,企业可以根据自己的需求提供功能清单,也可以通过与多家供应商交流后,列出自己所需要的功能;2、产品的性能。性能指标也是由企业提供,并建议提供具体性能指标所应用的环境及硬件设备等测试环境要求;3、产品的API适用性;4、产…

    2025年7月9日
    7
  • 软件管理和电脑管家打不开怎么办_电脑管家下载软件连接错误

    软件管理和电脑管家打不开怎么办_电脑管家下载软件连接错误错误:应用程序无法启动,因为应用程序的并行配置不正确。请参阅应用程序事件日志,或使用命令行sxstrace.exe工具”问题的处理方法。方法一:开始-运行(输入services.msc)-确定或回车,打开:服务(本地);我们在服务(本地)窗口找到:WindowsModulesInstaller服务,查看是否被禁用;3…如果WindowsModulesInstaller服务被禁用,我们必须把它更改为启用-手动,重启计算机,再安装应用程序。转载至https://blo

    2022年8月13日
    9

发表回复

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

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