原文链接

CUDA存储器类型:

每个线程拥有自己的register and loacal memory;

每个线程块拥有一块shared memory;

所有线程都可以访问global memory;

还有,可以被所有线程访问的只读存储器:constant memory and texture memory

1、  寄存器Register

  寄存器是GPU上的高速缓存器,其基本单元是寄存器文件,每个寄存器文件大小为32bit.

  Kernel中的局部(简单类型)变量第一选择是被分配到Register中。

  特点:每个线程私有,速度快。

2、  局部存储器 local memory

  当register耗尽时,数据将被存储到local memory。如果每个线程中使用了过多的寄存器,或声明了大型结构体或数组,或编译器无法确定数组大小,线程的私有数据就会被分配到local   memory中。

  特点:每个线程私有;没有缓存,慢。

  注:在声明局部变量时,尽量使变量可以分配到register。如:

  unsigned int mt[3];

  改为: unsigned int mt0, mt1, mt2;

3、  共享存储器 shared memory

  可以被同一block中的所有线程读写

  特点:block中的线程共有;访问共享存储器几乎与register一样快.

 1 //u(i)= u(i)^2 + u(i-1)2 //Static3 __global__ example(float* u) {4     int i=threadIdx.x;5     __shared__ int tmp[4];6      tmp[i]=u[i];7      u[i]=tmp[i]*tmp[i]+tmp[3-i];8 }9
10 int main() {
11     float hostU[4] = {1, 2, 3, 4};
12      float* devU;
13     size_t size = sizeof(float)*4;
14     cudaMalloc(&devU, size);
15     cudaMemcpy(devU, hostU, size,
16     cudaMemcpyHostToDevice);
17      example<<<1,4>>>(devU, devV);
18     cudaMemcpy(hostU, devU, size,
19     cudaMemcpyDeviceToHost);
20     cudaFree(devU);
21     return 0;
22 }
23
24 //Dynamic
25 extern __shared__ int tmp[];
26
27 __global__ example(float* u) {
28     int i=threadIdx.x;
29      tmp[i]=u[i];
30      u[i]=tmp[i]*tmp[i]+tmp[3-i];
31 }
32
33 int main() {
34     float hostU[4] = {1, 2, 3, 4};
35     float* devU;
36     size_t size = sizeof(float)*4;
37     cudaMalloc(&devU, size);
38     cudaMemcpy(devU, hostU, size, cudaMemcpyHostToDevice);
39      example<<<1,4,size>>>(devU, devV);
40     cudaMemcpy(hostU, devU, size, cudaMemcpyDeviceToHost);
41     cudaFree(devU);
42     return 0;
43 }

 4、  全局存储器 global memory

  特点:所有线程都可以访问;没有缓存

//Dynamic
__global__ add4f(float* u, float* v) {
int i=threadIdx.x;u[i]+=v[i];
}
int main() {float hostU[4] = {1, 2, 3, 4};float hostV[4] = {1, 2, 3, 4};float* devU, devV;size_t size = sizeof(float)*4;cudaMalloc(&devU, size);cudaMalloc(&devV, size);cudaMemcpy(devU, hostU, size,cudaMemcpyHostToDevice);cudaMemcpy(devV, hostV, size,cudaMemcpyHostToDevice);add4f<<<1,4>>>(devU, devV);cudaMemcpy(hostU, devU, size,cudaMemcpyDeviceToHost);cudaFree(devV);cudaFree(devU);return 0;
}//static
__device__ float devU[4];
__device__ float devV[4];__global__ addUV() {
int i=threadIdx.x;devU[i]+=devV[i];
}int main() {float hostU[4] = {1, 2, 3, 4};float hostV[4] = {1, 2, 3, 4};size_t size = sizeof(float)*4;cudaMemcpyToSymbol(devU, hostU, size, 0, cudaMemcpyHostToDevice);cudaMemcpyToSymbol(devV, hostV, size, 0, cudaMemcpyHostToDevice);addUV<<<1,4>>>();cudaMemcpyFromSymbol(hostU, devU, size, 0, cudaMemcpyDeviceToHost);return 0;
}

   5、  常数存储器constant memory

  用于存储访问频繁的只读参数

  特点:只读;有缓存;空间小(64KB)

   注:定义常数存储器时,需要将其定义在所有函数之外,作用于整个文件

1 __constant__ int devVar;
2 cudaMemcpyToSymbol(devVar, hostVar, sizeof(int), 0, cudaMemcpyHostToDevice)
3 cudaMemcpyFromSymbol(hostVar, devVar, sizeof(int), 0, cudaMemcpyDeviceToHost)

 6、  纹理存储器 texture memory

是一种只读存储器,其中的数据以一维、二维或者三维数组的形式存储在显存中。在通用计算中,其适合实现图像处理和查找,对大量数据的随机访问和非对齐访问也有良好的加速效果。

特点:具有纹理缓存,只读。

转载于:https://www.cnblogs.com/liangliangdetianxia/p/4198850.html

CUDA memory相关推荐

  1. cuda Memory Fence Functions

    thread对内存读写的安全 void __threadfence_block(); void __threadfence(); void __threadfence_system(); 参考: ht ...

  2. CUDA系列学习(四)Parallel Task类型 与 Memory Allocation

    本文为CUDA系列学习第四讲,首先介绍了Parallel communication patterns的几种形式(map, gather, scatter, stencil, transpose), ...

  3. cuda的global memory介绍

    CUDA Memory Model 对于程序员来说,memory可以分为下面两类: Programmable:我们可以灵活操作的部分. Non-programmable:不能操作,由一套自动机制来达到 ...

  4. 【解决汇总:待更新】CUDA error: an illegal memory access was encountered with channels_last

    为方便查看,就直接贴图和网址了.仅供学习使用,如有侵权,请联系我删除. 一.调试方法: 链接 原文: Recently, I encountered "an illegal memory a ...

  5. CUDA(六). 从并行排序方法理解并行化思维——冒泡、归并、双调排序的GPU实现

    在第五讲中我们学习了GPU三个重要的基础并行算法: Reduce, Scan 和 Histogram,分析了 其作用与串并行实现方法. 在第六讲中,本文以冒泡排序 Bubble Sort.归并排序 M ...

  6. CUDA系列学习(三)GPU设计与结构QA coding练习

    啥?你把CUDA系列学习(一),(二)都看完了还不知道為什麼要用GPU提速? 是啊..经微博上的反馈我默默感觉到提出这样问题的小伙伴不在少数,但是更多小伙伴应该是看了(一)就感觉离自己太远所以赶紧撤粉 ...

  7. CUDA 编程简介(下)

    文章目录 Memory shared memory global memory Transfer Data 异步预取 Threads thread block warp GPU 性能 查看性能 测试性 ...

  8. CPU与GPU统一虚拟内存(CUDA UM)原理

    CPU与GPU的统一内存(CUDA Unified Memory)原理 文章目录 CPU与GPU的统一内存(CUDA Unified Memory)原理 一.UM下的CUDA编程 二.UM的实现原理 ...

  9. CUDA学习(四):CUDA编程七个步骤

    博主CUDA学习系列汇总传送门(持续更新):编程语言|CUDA入门 文章目录 一.cudaMalloc.cudaMemcpy和cudaFree 介绍 二.CUDA编程七步曲 本章节学习内容: 1.CU ...

  10. linux .sh文件 命令如何写,Linux下面使用命令如何运行.sh文件的两种解决办法

    SpringMVC 参数注入 写一个web service, 总是400. 说是request有问题,server不识别.然而检查了很多次都没问题.最终问题指向spring对参数的解析和注入. 一个c ...

最新文章

  1. Hadoop HBase概念学习系列之HRegion服务器(三)
  2. 检测到目标主机可能存在缓慢的HTTP拒绝服务攻击
  3. os如何处理键盘的所有按键,显示or不显示,显示是如何显示
  4. centOS 阿里云yum地址配置
  5. Datatables 构建响应式
  6. php是走什么协议,TCP是什么协议
  7. 不同网段的局域网怎么互通_华为实操系列 | 交换机在局域网中是怎么应用的,看完你肯定懂了!...
  8. PST转换软件 v6.3
  9. 禅道能连接数据库无法打开页面
  10. C#比较两个日期的大小两种案例解析
  11. ASCII、Unicode和UTF_8的前生后世
  12. tcp/ip ---IP路由选择
  13. 【优化算法】粒子群工具箱函数优化算法【含Matlab源码 1126期】
  14. oracle sql 查询无数据_信运大讲堂丨ORACLE数据库SQL和索引
  15. 智能客服搭建(4) - 语音流的分贝计算
  16. nanomsg交叉编译
  17. 程序设计大赛WBS图
  18. visual studio出现的0xc0000135问题
  19. C#顺时针逆时针旋转图片
  20. 小鸟云服务器怎么修改密码?

热门文章

  1. Elasticsearch2.4.X 搜索引擎框架 安装配置
  2. PHPSTORM 6.0.3 Xdebug 配置9
  3. 4)Thymeleaf th:each 循环迭代与 th:if、th:switch 条件判断
  4. 金蝶专业版过账提示运行时错误5_金蝶财务软件的操作流程
  5. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_17-CMS前端工程创建-单页面应用介绍...
  6. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_08-CMS需求分析-CMS页面管理需求...
  7. Oracle之根据约束名查找表
  8. jfinal 模板引擎
  9. Ubuntu16.04上使用Anaconda3的Python3.6的pip安装UWSGI报错解决办法
  10. win32使用拖放文件