一边学习一边记录(本文中英结合,专业名词统统不翻译)

在CUDA里,host和devices有不同的记忆体空间。

首先呢,CUDA的memory有很多种类啦

1. Global memory

2. Constant memory

这两种memory可以由CPU上运行的函数呼叫读写。

Global memory 这个,学过一点点CUDA的都知道,一般说device memory  指的就是它,

Constant memory 有低延迟,高带宽,但是device只能读它不能写它,并且所有线程可以同时访问同一地址。

3. Register

4. Shared memory

这两种memory是片上记忆体(on-chip),换句话说,读写速度要比前两种memory多很多,至于到底多多少,有空测试哈,而且可以以高度并行的模式读写。

Registers是被分配给单独的线程的,每个线程只能链接自己的register。

Shared memory 是被分配给block的。block里所有的线程都可以访问属于这个block的Shared Memory,共享记忆体是一个十分有效的工具,可以共享他们的输入信息和他们计算出来的中间结果。

各个记忆体的编程模型:

Global memory  VS Register

1. Global memory: "The von Neumann Model": 这个记忆体在cuda编程模型中可以映射到冯诺依曼结构中的记忆体。

global memory 是在处理器芯片之外独立的记忆体,且应用的是动态随机存取存储器(Dynamic Random Access Memory,DRAM)技术。

所以会有很长的链接延迟,和相对来说较低的带宽。

2. Registers: 它有点类似于The von Neumann Model 中的“register file”,它在处理器芯片里面,所以链接的延迟非常的低,以及非常高的带宽。一般器件的Register的综合接入带宽是global memory的两个数量级大。此外,无论何时,链接Register的带宽不占用个global的带宽。另外比起链接global memory, 所需要的执行的指令也要少很多。一般的处理器对于算数指令都有内嵌的寄存器运算数,例如,浮点加法指令:

fadd r1,r2,r3

其中 r2,r3是寄存器的编号,用来提取要做加法的数,最后存到r1中去 。

如果要做加法的数字存在global memory里,首先要从global memory中把数据提取到ALU中,然后在进行浮点运算。

load r2,r4,offset

fadd r1,r2,r3

load命令可以把数据从r4中提取出来,存入r2 再进行加法。

另外还有一个是建议把运算数值存在register的原因,在现代计算机中,从一个register里调用数据一般比从global memory中调用数据所消耗的能量要低一个数量级。

补充说明:执行单位和线程之间的关系,现在我们介绍一下冯诺依曼结构,现代计算机中的线程是一个虚拟化的冯诺依曼处理器,一个线程包含了程式的一部分代码,正要执行的那部分,还有涉及到的数据和数据结构。    在基于冯诺依曼模型的计算机中,代码是存储在记忆体中的,PC不停的访问程式正要进行的那部分,IR则用来存储正要执行的指令。而寄存器和记忆体贼存储数据和数据结构。    现代处理器允许

Shared memory VS Register

他们都是 on-chip 记忆体,但是当处理期要从Shared memory中调用数据时,需要有从记忆体载入数据这个操作,如同从global memory中调用数据一样。但是因为它是片上记忆体,所以无论延迟还是带宽,都比global memory有明显的优势。但因为有load这个步骤,所以无论带宽还是延时比较register都有明显的劣势。

Shared memory存储的变量是被一个block里所有线程共享的。但是register里的变量是线程私有的。Shared memory 能很好地支持thread之间资料共享。

参考书籍:《Programming Massively Parallel Processors》

《CUDA 5.0编程指南》

CUDA Memories--CUDA记忆体(翻译+整理+测试)的更多相关文章

  1. JavaScript 作用域和闭包——另一个角度:扩展你对作用域和闭包的认识【翻译+整理】

    原文地址 --这篇文章有点意思,可以扩展你对作用域和闭包的认识. 本文内容 背景 作用域 闭包 臭名昭著的循环问题 自调用函数(匿名函数) 其他 我认为,尝试向别人解释 JavaScript 作用域和 ...

  2. CUDA开发 - CUDA 版本

    "CUDA runtime is insufficient with CUDA driver"CUDA 9.2: 396.xx CUDA 9.1: 387.xx CUDA 9.0: ...

  3. 【CUDA学习】结构体指针复制

    内核函数中要用data结构作用参数 typedef struct { int* value; int* num; } data; //host端 data* h_input; h_input=(dat ...

  4. 【CUDA】CUDA框架介绍

    引用 出自Bookc的博客,链接在此http://bookc.github.io/2014/05/08/my-summery-the-book-cuda-by-example-an-introduct ...

  5. 【CUDA】CUDA开发环境搭建

    http://blog.csdn.net/tracer9/article/details/50484764 标签: CUDA并行计算NVIDIAlinux 2016-01-08 18:35 637人阅 ...

  6. CUDA并行计算 | CUDA算法效率提升关键点概述

    文章目录 前言 存取效率 计算效率 性能优化要点 展现足够的并行性 优化内存访问 优化指令执行 前言   CUDA算法的效率总的来说,由存取效率和计算效率两类决定,一个好的CUDA算法必定会让两类效率 ...

  7. 【好文翻译】测试必看:使用Spire.XLS来生成自动化报表!

    Download C# project - 7.1 KB 介绍  在我的编程博客中,我经常会比较不同算法或原理的性能特征.我常常会把性能日志(如花费时间)输出到控制台或者文本文件,然后复制到电子表格中 ...

  8. C#与C++数据类型比较及结构体转换[整理]

    //c++:HANDLE(void   *)                          ----    c#:System.IntPtr//c++:Byte(unsigned   char)  ...

  9. JavaScript:如何获得 Private、Privileged、Public 和 Static 成员(属性和方法)【翻译+整理】

    本文内容 背景 把我们的对象放在一起 添加一个私有(Private)的属性 添加一个特权(Privileged)的方法 添加一个公共(Public)的属性和方法 添加一个静态(Static)的属性 我 ...

随机推荐

  1. Cent OS5.2安装Hyper-V集成光盘

    一.Hyper-V安装windows系统没有问题,windows2000以后系统都可以,一切顺利. 驱动程序:IDE.SCSI.网络.视频和鼠标 要想实现更强的功能,宿主机需要安装Hyper-V集成光 ...

  2. JavaScript专业规则12条

    学习JavaScript是困难的.它发展的如此之快,以至于在任何一个特定的时刻,你都不清楚自己是否“做错了”.有些时候,感觉像是坏的部分超过了好的部分.然而,讨论这些并没有意义,JavaScript正 ...

  3. 9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路

    1,简介 毕业答辩搞定,总算可以闲一段时间,把这段求职经历写出来,也作为之前三个半月的求职的回顾. 首先说说我拿到的offer情况: 微软,3面->终面,搞定 百度,3面->终面,口头of ...

  4. Request、Request.Form、Request.QueryString 用法的区别

    Request.Form:获取以POST方式提交的数据. Request.QueryString:获取地址栏参数(以GET方式提交的数据). Request:包含以上两种方式(优先获取GET方式提交的 ...

  5. [Lua]入门教程

    什么是Lua Lua 是一个小巧的脚本语言.是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Rober ...

  6. flex中文说明手册

    http://help.adobe.com/zh_CN/Flex/4.0/UsingFlashBuilder/WS6f97d7caa66ef6eb1e63e3d11b6c4d0d21-7f07.htm ...

  7. Web Api 2 怎么支持 Session

    Add protected void Application_PostAuthorizeRequest() { System.Web.HttpContext.Current.SetSessionSta ...

  8. Principles of good RESTful API Design 好的 RESTful API 设计

    UPDATE: This post has been expanded upon and converted into an eBook. Good API design is hard! An AP ...

  9. c语言中用宏定义一个常量,数字后面带个U, L, F的含义

    转: c语言中数字后面带个U是什么意思?#define F_CPU 12000000U答:U表示该常数用无符号整型方式存储,相当于unsigned int;L表示该常数用长整型方式存储,相当于long ...

  10. Failed to load libGL.so in android

    使用命令:find / -name libGL.so 得到: /usr/lib/i386-linux-gnu/libGL.so /usr/lib/i386-linux-gnu/mesa/libGL.s ...