CUDA存储器模型:

GPU片内:register,shared memory;

host 内存: host memory, pinned memory.

板载显存:local memory,constant memory, texture memory, texture memory,global memory;

register: 訪问延迟极低;

基本单元:register file (32bit/each)

计算能力1.0/1.1版本号硬件:8192/SM。

计算能力1.2/1.3版本号硬件: 16384/SM;

每一个线程占有的register有限。编程时不要为其分配过多私有变量。

shared memory:訪问速度与寄存器相似。

实现线程间通信的延迟最小。

保存公用的计数器或者block的公用结果。

硬件1.0~1.3中。16KByte/SM,被组织为16个bank。

声明keyword _shared_  int sdata_static[16];

host内存:分为pageable memory 和 pinned memory

pageable memory: 通过操作系统API(malloc()。new())分配的存储器空间;、

pinned memory:始终存在于物理内存中,不会被分配到低速的虚拟内存中,可以通过DMA加速与设备端进行通信。

cudaHostAlloc(), cudaFreeHost()来分配和释放pinned memory。使用pinned memory长处:主机端-设备端的传输数据带宽高;  某些设备上能够通过zero-copy功能映射到设备地址空间。从GPU直接訪问,省掉主存与显存间进行数据拷贝的工作; pinned memory 不能够分配过多:导致操作系统用于分页的物理内存变。 导致系统总体性能下降。通常由哪个cpu线程分配,就仅仅有这个线程才有訪问权限;

cuda2.3版本号中,pinned memory功能扩充:

portable memory:让控制不同GPU的主机端线程操作同一块portable memory,实现cpu线程间通信;使用cudaHostAlloc()分配页锁定内存时。加上cudaHostAllocPortable标志。

write-combined Memory:提高从cpu向GPU单向数据传输的速度;不使用cpu的L1,L2 cache对一块pinned memory中的数据进行缓冲。将cache资源留给其它程序使用。在pci-e总线传输期间不会被来自cpu的监视打断。在调用cudaHostAlloc()时加上cudaHostAllocWriteCombined标志。cpu从这样的存储器上读取的速度非常低。

mapped memory:两个地址:主机端地址(内存地址),设备端地址(显存地址)。  能够在kernnel程序中直接訪问mapped memory中的数据。不必在内存和显存之间进行数据拷贝,即zero-copy功能;在主机端能够由cudaHostAlloc()函数获得。在设备端指针能够通过cudaHostGetDevicePointer()获得;通过cudaGetDeviceProperties()函数返回的canMapHostMemory属性知道设备是否支持mapped
memory;在调用cudaHostAlloc()时加上cudaHostMapped标志,将pinned memory映射到设备地址空间。必须使用同步来保证cpu和GPu对同一块存储器操作的顺序一致性;显存中的一部分能够既是portable memory又是mapped memory。在运行CUDA操作前,先调用cudaSetDeviceFlags()(加cudaDeviceMapHost标志)进行页锁定内存映射。

constant memory:仅仅读地址空间;位于显存,有缓存加速;64Kb。用于存储须要频繁訪问的仅仅读參数 。仅仅读;使用_constant_ keyword。定义在全部函数之外。两种常数存储器的用法:直接在定义时初始化常数存储器。定义一个constant数组。然后使用函数进行赋值;

texture memory:仅仅读。不是一块专门的存储器,而是牵涉到显存、两级纹理缓存、纹理拾取单元的纹理流水线;数据常以一维、二维或者三维数组的形式存储在显存中;缓存加速;能够声明大小比常数存储器大得多;适合实现图像树立和查找表。对大量数据的随机訪问或非对齐訪问有良好的加速效果;在kernel中訪问纹理存储器的操作成为纹理拾取(texture fetching)。纹理拾取使用的坐标与数据在显存中的位置能够不同,通过纹理參照系约定二者的映射方式。将显存中的数据与纹理參照系关联的操作,称为将数据与纹理绑定(texture
binding)。显存中能够绑定到纹理的数据有:普通线性存储器和cuda数组;存在缓存机制;能够设定滤波模式,寻址模式等;

local memory:寄存器被使用完成,数据将被存储在局部存储器中;

大型结构体或者数组。

无法确定大小的数组;

线程的输入和中间变量;

定义线程私有数组的同一时候进行初始化的数组被分配在寄存器中。

global memory:存在于显存中。也称为线性内存(显存能够被定义为线性存储器或者CUDA数组)。

cudaMalloc()函数分配,cudaFree()函数释放,cudaMemcpy()进行主机端与设备端的传输数据。

初始化共享存储器须要调用cudaMemset();

二维三维数组:cudaMallocPitch()和cudaMalloc3D()分配线性存储空间,能够确保分配满足对齐要求;

cudaMemcpy2D()。cudaMemcpy3D()与设备端存储器进行拷贝;

并行程序设计---cuda memory的更多相关文章

  1. 【CUDA并行程序设计系列(1)】GPU技术简介

    http://www.cnblogs.com/5long/p/cuda-parallel-programming-1.html 本系列目录: [CUDA并行程序设计系列(1)]GPU技术简介 [CUD ...

  2. 《CUDA并行程序设计:GPU编程指南》

    <CUDA并行程序设计:GPU编程指南> 基本信息 原书名:CUDA Programming:A Developer’s Guide to Parallel Computing with ...

  3. OpenMP并行程序设计

    1.fork/join并行执行模式的概念 2.OpenMP指令和库函数介绍 3.parallel 指令的用法 4.for指令的使用方法 5 sections和section指令的用法 1.fork/j ...

  4. 《并行程序设计导论》——MPI(Microsoft MPI)(1):Hello

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...

  5. OpenMP并行程序设计——for循环并行化详解

    在C/C++中使用OpenMP优化代码方便又简单,代码中需要并行处理的往往是一些比较耗时的for循环,所以重点介绍一下OpenMP中for循环的应用.个人感觉只要掌握了文中讲的这些就足够了,如果想要学 ...

  6. CUDA ---- Memory Model

    Memory kernel性能高低是不能单纯的从warp的执行上来解释的.比如之前博文涉及到的,将block的维度设置为warp大小的一半会导致load efficiency降低,这个问题无法用war ...

  7. openMP编程(上篇)之并行程序设计

    openMP简介 openMP是一个编译器指令和库函数的集合,主要是为共享式存储计算机上的并行程序设计使用的. 当计算机升级到多核时,程序中创建的线程数量需要随CPU核数变化,如在CPU核数超过线程数 ...

  8. OpenMP 并行程序设计入门

    OpenMP 是一个编译器指令和库函数的集合,主要是为共享式存储计算机上的并行程序设计使用的. 0. 一段使用 OpenMP 的并行程序 #include <stdio.h> #inclu ...

  9. CUDA并行程序设计 开发环境搭建与远程调试

    课题需要用到GPU加速.目前使用的台式电脑只有核心显卡,而实验室有一台服务器装有NVIDIA GTX980独显.因此,想搭建一个CUDA的开发环境,来实现在台式机上面开发cuda程序,程序在服务器而不 ...

随机推荐

  1. day03 set集合,文件操作,字符编码以及函数式编程

    嗯哼,第三天了 我们来get 下新技能,集合,个人认为集合就是用来list 比较的,就是把list 转换为set 然后做一些列表的比较啊求差值啊什么的. 先看怎么生成集合: list_s = [1,3 ...

  2. loj2027 「SHOI2016」黑暗前的幻想乡

    矩阵树定理+模意义下整数高斯消元 #include <algorithm> #include <iostream> #include <cstring> #incl ...

  3. SVM用于线性回归

    SVM用于线性回归 方法分析 在样本数据集()中,不是简单的离散值,而是连续值.如在线性回归中,预测房价.与线性回归类型,目标函数是正则平方误差函数: 在SVM回归算法中,目的是训练出超平面,采用作为 ...

  4. Leetcode 423.从英文中重建数字

    从英文中重建数字 给定一个非空字符串,其中包含字母顺序打乱的英文单词表示的数字0-9.按升序输出原始的数字. 注意: 输入只包含小写英文字母. 输入保证合法并可以转换为原始的数字,这意味着像 &quo ...

  5. 【bzoj3251】树上三角形 朴素LCA+暴力

    题目描述 给定一大小为n的有点权树,每次询问一对点(u,v),问是否能在u到v的简单路径上取三个点权,以这三个权值为边长构成一个三角形.同时还支持单点修改. 输入 第一行两个整数n.q表示树的点数和操 ...

  6. 【Luogu】U16325小奇的花园(树链剖分)

    题目链接 学了学动态开点的树链剖分,其实跟动态开点的线段树差不多啦 查询的时候别ssbb地动态开点,如果没这个点果断返回0就行 只要注意花的种类能到intmax就行qwq!!!! #include&l ...

  7. ubuntu安装jdk<服务器>

    服务器 阿里云服务器Ubuntu安装jdk7 2014-08-25 16:44 |  coding云 |  5825次阅读 | 6条评论   一.下载jdk 可以先下载到本地,然后ftp到服务器 官方 ...

  8. HDU——1799循环多少次(杨辉三角/动态规划/C(m,n)组合数)

    循环多少次? Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  9. HUST-1407 郁闷的小J

    离线做法:分别处理每个编号上的各种询问和操作,接着就能用树状数组维护. #include <cstdlib> #include <cstdio> #include <cs ...

  10. mybatis学习(九)——动态sql

    MyBatis 的强大特性之一便是它的动态 SQL.可以根据不同条件拼接 SQL 语句. 动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似.主要由以下几种元素. if wh ...