CUDA共享内存的使用示例
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共享内存的使用示例的更多相关文章
- 【CUDA 基础】5.1 CUDA共享内存概述
title: [CUDA 基础]5.1 CUDA共享内存概述 categories: - CUDA - Freshman tags: - CUDA共享内存模型 - CUDA共享内存分配 - CUDA共 ...
- windows 下共享内存使用方法示例
windows下共享内存使用方法较 linux 而言微微复杂 示例实现的功能 有一个视频文件,一块内存区域 : 程序 A,将该视频写入该内存区域 : 程序 B,从该内存区域读取该视频 : 代码模块实现 ...
- 【CUDA 基础】5.0 共享内存和常量内存
title: [CUDA 基础]5.0 共享内存和常量内存 categories: - CUDA - Freshman tags: - 共享内存 - 常量内存 toc: true date: 2018 ...
- linux实现共享内存同步的四种方法
https://blog.csdn.net/sunxiaopengsun/article/details/79869115 本文主要对实现共享内存同步的四种方法进行了介绍. 共享内存是一种最为高效的进 ...
- Linux IPC之共享内存
System V共享内存机制: shmget shmat shmdt shmctl 原理及实现: system V IPC机制下的共享内存本质是一段特殊的内存区域,进程间需要共享的数据被放在该共 ...
- linux 实现共享内存同步
本文主要对实现共享内存同步的四种方法进行了介绍. 共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝.它是IPC对象的一种. 为了在多个进程间交换信息,内核专门留出了 ...
- 信号量学习 & 共享内存同步
刚刚这篇文章学习了共享内存:http://www.cnblogs.com/charlesblc/p/6142139.html 里面也提到了共享内存,自己不进行同步,需要其他手段比如信号量来进行.那么现 ...
- CUDA: 共享内存与同步
CUDA C支持共享内存, 将CUDA C关键字__shared__添加到变量声明中,将使这个变量驻留在共享内存中.对在GPU上启动的每个线程块,CUDA C编译器都将创建该变量的一个副本.线程块中的 ...
- 【CUDA 基础】5.2 共享内存的数据布局
title: [CUDA 基础]5.2 共享内存的数据布局 categories: - CUDA - Freshman tags: - 行主序 - 列主序 toc: true date: 2018-0 ...
随机推荐
- Struts2内部执行过程
首先是Struts2的流程图. 一.当有一个请求的时候.执行以下流程. 1 客户端初始化一个指向Servlet容器的请求: 2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做Act ...
- Linux学习笔记整理
2.1BASH命令行基本操作 [用户@主机~]$ # //$#为提示符 $代表普通用户 #代表root用户 ~代表当前目录 ls //list相当于DOS的dir 显示当前目录列表 -a // ...
- Ubuntu 安装Appium
1.安装node apt-get install node.js 2.安装npm apt-get install npm 3.安装cnpm npm install -g cnpm 创建链接:ln -s ...
- Cent OS 6.5下源码安装php7.2
1.安装php需要的扩展 # yum install libxml2 libxml2-devel openssl openssl-devel libcurl libcurl-devel libjpeg ...
- 【Tarjan】洛谷P3379 Tarjan求LCA
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...
- 【树链剖分】洛谷P3384树剖模板
题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式 ...
- Core Animation文档翻译 (第一篇)
Core Animation 文档翻译(第一篇) 前言 作为iOS 开发,官方文档的阅读是很有必要的,值此周末便写下此文.作为iOS 实际经验3年的开发,之前有阅读并实践过经典的<iOS核心动画 ...
- 微信跳一跳辅助Demo
[原创] 前几天没事干看别人一直在玩微信上线的那一个跳一跳小游戏,玩着玩着老是掉下去,闲着没事呗 就想了想做一个辅助程序的呗.不过先做的手动版的.自动版的有点麻烦.就不发了.用的Java写的,也就一个 ...
- Zabbix Agent for Windows部署(五)
一.环境介绍 二.软件准备 1.Zabbix官方下载地址:https://www.zabbix.com/download进入Zabbix pre-compiled agents项,下载相应版本 2.将 ...
- [翻译]QT core wallet manual 狗狗币核心钱包使用教程
译注:比特币没赶上可以玩狗狗币啊,水电厂包不起可以用CPU挖啊.为了顺应时代潮流,了解一下区(fa)块(heng)链(cai)和加密货币技术,准备从研究狗狗币开始.网上找了一圈没有看到很好的入门级教程 ...