CUDA共享内存使用示例如下:参考教材《GPU高性能编程CUDA实战》。P54-P65

教材下载地址:http://download.csdn.net/download/yizhaoyanbo/10150300。如果没有下载分可以评论区留下邮箱,我发你。

 #include <cuda.h>
#include <cuda_runtime.h>
#include <device_launch_parameters.h>
#include <device_functions.h>
#include <iostream>
#include <string> using namespace std; #define imin(a,b) (a<b? a:b)
const int N = * ;
const int threadsPerBlock = ;
const int blocksPerGrid = imin(, (N + threadsPerBlock - ) / threadsPerBlock); __global__ void dot(float *a, float *b, float *c)
{
__shared__ float cache[threadsPerBlock];
int tid = threadIdx.x + blockDim.x*blockIdx.x;
int cacheIndex = threadIdx.x; float temp = ;
//每个线程负责计算的点乘,再加和
while (tid<N)
{
temp += a[tid] * b[tid];
tid += blockDim.x*gridDim.x;
} //每个线程块中线程计算的加和保存到缓冲区cache,一共有blocksPerGrid个缓冲区副本
cache[cacheIndex] = temp;
//对线程块中的线程进行同步
__syncthreads(); //归约运算,将每个缓冲区中的值加和,存放到缓冲区第一个元素位置
int i = blockDim.x / ;
while (i != )
{
if (cacheIndex < i)
{
cache[cacheIndex] += cache[cacheIndex + i];
}
__syncthreads();
i /= ;
}
//使用第一个线程取出每个缓冲区第一个元素赋值到C数组
if (cacheIndex == )
{
c[blockIdx.x] = cache[];
}
} void main()
{
float *a, *b, c, *partial_c;
float *dev_a, *dev_b, *dev_partial_c; //分配CPU内存
a = (float*)malloc(N * sizeof(float));
b = (float*)malloc(N * sizeof(float));
partial_c = (float*)malloc(blocksPerGrid * sizeof(float)); //分配GPU内存
cudaMalloc(&dev_a, N * sizeof(float));
cudaMalloc(&dev_b, N * sizeof(float));
cudaMalloc(&dev_partial_c, blocksPerGrid * sizeof(float)); float sum = ;
for (int i = ; i < N; i++)
{
a[i] = i;
b[i] = i * ;
} //将数组上传到GPU
cudaMemcpy(dev_a, a, N * sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(dev_b, b, N * sizeof(float), cudaMemcpyHostToDevice); dot << <blocksPerGrid, threadsPerBlock >> > (dev_a, dev_b, dev_partial_c); cudaMemcpy(partial_c, dev_partial_c, blocksPerGrid * sizeof(float), cudaMemcpyDeviceToHost); //CPU 完成最终求和
c = ;
for (int i = ; i < blocksPerGrid; i++)
{
c += partial_c[i];
} #define sum_squares(x) (x*(x+1)*(2*x+1)/6)
printf("does GPU value %.6g = %.6g?\n", c, * sum_squares((float)(N - ))); cudaFree(dev_a);
cudaFree(dev_b);
cudaFree(dev_partial_c); free(a);
free(b);
free(partial_c);
}

我的博客即将同步至腾讯云+社区,邀请大家一同入驻。

CUDA共享内存的使用示例的更多相关文章

  1. 【CUDA 基础】5.1 CUDA共享内存概述

    title: [CUDA 基础]5.1 CUDA共享内存概述 categories: - CUDA - Freshman tags: - CUDA共享内存模型 - CUDA共享内存分配 - CUDA共 ...

  2. windows 下共享内存使用方法示例

    windows下共享内存使用方法较 linux 而言微微复杂 示例实现的功能 有一个视频文件,一块内存区域 : 程序 A,将该视频写入该内存区域 : 程序 B,从该内存区域读取该视频 : 代码模块实现 ...

  3. 【CUDA 基础】5.0 共享内存和常量内存

    title: [CUDA 基础]5.0 共享内存和常量内存 categories: - CUDA - Freshman tags: - 共享内存 - 常量内存 toc: true date: 2018 ...

  4. linux实现共享内存同步的四种方法

    https://blog.csdn.net/sunxiaopengsun/article/details/79869115 本文主要对实现共享内存同步的四种方法进行了介绍. 共享内存是一种最为高效的进 ...

  5. Linux IPC之共享内存

    System V共享内存机制: shmget  shmat  shmdt  shmctl 原理及实现: system V IPC机制下的共享内存本质是一段特殊的内存区域,进程间需要共享的数据被放在该共 ...

  6. linux 实现共享内存同步

    本文主要对实现共享内存同步的四种方法进行了介绍. 共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝.它是IPC对象的一种. 为了在多个进程间交换信息,内核专门留出了 ...

  7. 信号量学习 & 共享内存同步

    刚刚这篇文章学习了共享内存:http://www.cnblogs.com/charlesblc/p/6142139.html 里面也提到了共享内存,自己不进行同步,需要其他手段比如信号量来进行.那么现 ...

  8. CUDA: 共享内存与同步

    CUDA C支持共享内存, 将CUDA C关键字__shared__添加到变量声明中,将使这个变量驻留在共享内存中.对在GPU上启动的每个线程块,CUDA C编译器都将创建该变量的一个副本.线程块中的 ...

  9. 【CUDA 基础】5.2 共享内存的数据布局

    title: [CUDA 基础]5.2 共享内存的数据布局 categories: - CUDA - Freshman tags: - 行主序 - 列主序 toc: true date: 2018-0 ...

随机推荐

  1. 启用composer镜像服务

    使用composer下载东西,需要FQ时,可使用其镜像服务 安装composer后,命令行执行全局配置 composer config -g repo.packagist composer https ...

  2. Windows上Python2与Python3共存

    首先安装好python2与python3版本 因为安装顺序的不同,所以系统默认的版本也不同.如果先安装的是python,那么系统默认的就是python2 如果根据需求需要使用不同的版本,可以使用py命 ...

  3. 执行PHP脚本时遇到 mysql_connect(): Headers and client library minor version mismatch的解决方法

    把服务器从Windows迁移到了centos7.2,配置好PHP运行环境后,项目运行正常. 但在命令行中运行一个PHP脚本时,遇到了标题中显示的错误 使用 php -i | grep Client 得 ...

  4. Node.js 蚕食计划(五)—— Koa 基础项目搭建

    Koa 是由 Express 原班人马打造的超轻量服务端框架 与 Express 相比,除了自由度更高,可以自行引入中间件之外,更重要的是使用了 ES6 + async,从而避免了回调地狱 不过也是因 ...

  5. zabbix 图形插件 Grafana的安装

    看http://www.myexception.cn/software-testing/2008870.html 就好了.

  6. 【Java框架型项目从入门到装逼】第八节 - 用EasyUI绘制主界面

    1.引入资源包 在上一节中,我们把基本的框架都搭好了,用了Spring,SPringMVC.这一节,我们先来画页面,前端框架采用EasyUI来实现. easyui是一种基于jQuery的用户界面插件集 ...

  7. 音频PCM编码

    PCM编码 PCM就是把一个时间连续,取值连续的模拟信号变换成时间离散,取值离散的数字信号后在信道中传输.简而言之PCM就是对模拟信号先抽样,再对样值幅度量化,编码的过程.例如听到的声音就是模拟信号, ...

  8. 不要错过iost币的免费派发机会

    2013 年 ripple 币曾经进行免费派发,而现在瑞波币兑CNY价格最高曾经达到20元, 如果你错过了 ripple 币,就不要错过这次李笑来和徐小平等背书 iost 币的免费派发

  9. 【转载】Linux下的IO监控与分析

    近期要在公司内部做个Linux IO方面的培训, 整理下手头的资料给大家分享下 各种IO监视工具在Linux IO 体系结构中的位置 源自 Linux Performance and Tuning G ...

  10. JSP执行过程分析

    概述 在java领域,表现层技术主要有三种:jsp.freemarker.velocity.jsp是由sun公司倡导的官方标准,freemarker和velocity是第三方的模板. jsp是大家最熟 ...