CUDA内存类型memory

2013-09-30 10:34 4224人阅读 评论(1) 收藏 举报
分类:
CUDA(106)

http://www.cnblogs.com/traceorigin/archive/2013/04/11/3015482.html

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一样快.

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

 4、  全局存储器 global memory

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

[cpp] view plaincopy
  1. //Dynamic
  2. __global__ add4f(float* u, float* v) {
  3. int i=threadIdx.x;
  4. u[i]+=v[i];
  5. }
  6. int main() {
  7. float hostU[4] = {1, 2, 3, 4};
  8. float hostV[4] = {1, 2, 3, 4};
  9. float* devU, devV;
  10. size_t size = sizeof(float)*4;
  11. cudaMalloc(&devU, size);
  12. cudaMalloc(&devV, size);
  13. cudaMemcpy(devU, hostU, size,
  14. cudaMemcpyHostToDevice);
  15. cudaMemcpy(devV, hostV, size,
  16. cudaMemcpyHostToDevice);
  17. add4f<<<1,4>>>(devU, devV);
  18. cudaMemcpy(hostU, devU, size,
  19. cudaMemcpyDeviceToHost);
  20. cudaFree(devV);
  21. cudaFree(devU);
  22. return 0;
  23. }
  24. //static
  25. __device__ float devU[4];
  26. __device__ float devV[4];
  27. __global__ addUV() {
  28. int i=threadIdx.x;
  29. devU[i]+=devV[i];
  30. }
  31. int main() {
  32. float hostU[4] = {1, 2, 3, 4};
  33. float hostV[4] = {1, 2, 3, 4};
  34. size_t size = sizeof(float)*4;
  35. cudaMemcpyToSymbol(devU, hostU, size, 0, cudaMemcpyHostToDevice);
  36. cudaMemcpyToSymbol(devV, hostV, size, 0, cudaMemcpyHostToDevice);
  37. addUV<<<1,4>>>();
  38. cudaMemcpyFromSymbol(hostU, devU, size, 0, cudaMemcpyDeviceToHost);
  39. return 0;
  40. }

   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

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

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

TNE END

CUDA内存类型memory相关推荐

  1. 明明有内存报错CUDA out of memory

    RuntimeError: CUDA out of memory. Tried to allocate 2.42 GiB (GPU 0; 24.00 GiB total capacity; 113.8 ...

  2. 【Pytorch】内存够用但还是 RuntimeError: CUDA out of memory 问题解决

    这里简述一下我遇到的问题: 可以看到可用内存是大于需要被使用的内存的,但他依旧是报CUDA out of memory的错误 我的解决方法是:修改num_workers的值,把它改小一点,就行了,如果 ...

  3. python pytorch爆显存,内存溢出问题解决方法(总结)RuntimeError: CUDA out of memory.

    问题描述 在运行python程序时,随运行时间增长,内存疯狂增加,直至运行内存爆满,出现以下错误: RuntimeError: CUDA out of memory. 解决方法: 1.在模型验证和测试 ...

  4. CUDA内存管理一文理清|参加CUDA线上训练营

    CUDA 内存概述 GPU的内存包括: 全局内存(global memory) 常量内存(constant memory) 纹理内存核表面内存(texture memory) 寄存器(register ...

  5. 通过设置PYTORCH_CUDA_ALLOC_CONF中的max_split_size_mb解决Pytorch的显存碎片化导致的CUDA:Out Of Memory问题

    问题的出现 最近在基友的带动下开始投身ai绘画的大潮,于是本地部署了stable diffusion web ui,利用手上的24G显存开始了愉快的跑高分辨率图片之旅.然而某天在用inpaint功能修 ...

  6. CUDA 内存统一分析

    CUDA 内存统一分析 关于CUDA 编程的基本知识,如何编写一个简单的程序,在内存中分配两个可供 GPU 访问的数字数组,然后将它们加在 GPU 上. 本文介绍内存统一,这使得分配和访问系统中任何处 ...

  7. 计算机内存与内置类型,笔记本内存种类有哪些 笔记本常见内存类型介绍

    此前经常有电脑小白咨询我"128GB内存够不够"之类的问题,很明显这是将内存和硬盘搞混了.如果你也分不清内存和硬盘,那么很有必要看下去.本文主要介绍目前笔记本中常见的内存类型,并且 ...

  8. GPU(CUDA)学习日记(十三)------ CUDA内存简介

    GPU(CUDA)学习日记(十三)------ CUDA内存简介 标签: cuda存储线程结构 2012-12-07 16:53 2902人阅读 评论(0)收藏 举报 分类: GPU(16) CUDA ...

  9. CUDA out of memory. Tried to allocate 392.00 MiB (GPU 0; 10.76 GiB total capacity; 652.77 MiB alread

    在使用Pytorch中,出现CUDA out of memory. Tried to allocate 392.00 MiB (GPU 0; 10.76 GiB total capacity; 652 ...

最新文章

  1. OSGI企业应用开发(二)Eclipse中搭建Felix运行环境
  2. qlist length 函数讲解_读《JavaScript 轻量级函数式编程》
  3. Asp.Net 2.0 发布问题(转)
  4. IE浏览器GET请求中文乱码
  5. 网络抖动、丢音、卡顿
  6. Alt+Shift+NumLock
  7. 【电脑操作】【鼠标】无线鼠标无反应怎么办?
  8. winforms 文本框_在禁用的VB.Net WinForms文本框中自定义颜色的新方法
  9. VMware 虚拟机 linux执行 ifconfig 命令 eth0没有IP地址(intet addr、Bcast、Mask) UP BROADCAST MULTICAST 问题
  10. 科技新品 | 索尼全画幅电影摄影机FX6;数字健康管理专业品牌Zepp智能手表;彩色视频电子纸显示器取得重大突破...
  11. ps制作苹果中的返回按钮
  12. 影响信用贷款的四大条件
  13. wms仓库管理系统的订单处理及流程
  14. python和verilog对接_用这个库居然可以使用Python进行FPGA逻辑开发
  15. alin42490怎样解除_我们应该如何思维42490
  16. kerberos认证
  17. 搭建企业级别nexus私服
  18. 机械设计基础B【1】自由度
  19. 2019全国大学生信息安全大赛线下初体验 --体验黑客的儿童节
  20. 通达信板块监控指标_「600503」通达信主力监控系统指标公式

热门文章

  1. marting mate 是真的香喷喷的 学术英语必备
  2. 如果不知道做什么,那应该做什么呢?
  3. 洗被套的时候洗衣机里面不要再放其他东西
  4. C#抽象类与接口的区别【转】
  5. 近期在看的一段JS(谁能看出我想实现什么功能)
  6. PHP大文件分片上传
  7. Android中Dialog与DialogFragment的对比
  8. puts(char *) gets(char *)
  9. 毕业后的五年拉开大家差距的原因在哪里?
  10. 提取DVD视频盘的资源