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 ...
随机推荐
- IE下判断IE版本的语句...[if lte IE 8]……[endif]
<!--[if lte IE 6]> <![endif]--> IE6及其以下版本可见 <!--[if lte IE 7]> <![endif]--> ...
- Java笔记:Java 流(Stream)、文件(File)和IO
更新时间:2018-1-7 12:27:21 更多请查看在线文集:http://android.52fhy.com/java/index.html java.io 包几乎包含了所有操作输入.输出需要的 ...
- Python的类与类型
1.经典类与新式类 在了解Python的类与类型前,需要对Python的经典类(classic classes)与新式类(new-style classes)有个简单的概念. 在Python 2.x及 ...
- jquery 获取URL相对/绝对路径问题
在B/s系统中,使用jquery做图片上传时通常会遇到获取不到路径的的问题,这是因为系统不允许浏览器的访问而进行限制造成的, 一般获取到的都是C://Program Files/~/文件位置.而在有时 ...
- c# 岛2 小辅助~~~ 钓鱼 连击
- javascript 基本特性
JavaScript是按照ECMAScript标准设计和实现的,后文说的JavaScript语法其实是ES5的标准的实现. 先说说有哪些基础语法? 01- 最基础语法有哪些? 基础语法几乎所有的语言差 ...
- webp怎么打开 webp怎么转换成jpg
webp怎么打开 webp怎么转换成jpg 2 3 4 5 6 7 分步阅读 在使用google服务的时候(比如 google play),我们会发现保存的图都是webp格式. 那webp是什么东 ...
- 关于jmeter工具使用的总结
今天总结下jmeter工具如何使用 先从最简单的说起 如何打开jemter 配置环境变量 接下来我们只要在dos窗口中输入 jmeter就能打开,这也告诉了我们配置环境变量的方便性 接下来介绍一下线程 ...
- express框架开发案例
express是基于Node.js平台的web应用开发框架,用express框架开发web项目可以直接构建整个项目框架并且将前端页面跟后台贯穿起来,用起来还是灵活的:最近刚开始学习,写篇博客总结下,涉 ...
- GNS3的配置
为了更好的了解协议我决定学习CCNA 安装好GNS3后我们打开 点击设置 先把iso解压,解压完成后倒入 保存结束 然后在输入idlepc get 设备名称 来计算idepc的值 idepc能让我们p ...