gpu显存(全局内存)在使用时数据对齐的问题

全局存储器,即普通的显存,整个网格中的任意线程都能读写全局存储器的任意位置。

存取延时为400-600 clock cycles  非常容易成为性能瓶颈。

访问显存时,读取和存储必须对齐,宽度为4Byte。如果没有正确的对齐,读写将被编译器拆分为多次操作,降低访存性能。

多个warp的读写操作如果能够满足合并访问,则多次访存操作会被合并成一次完成。合并访问的条件,1.0和1.1的设备要求较严格,1.2及更高能力的设备上放宽了合并访问的条件。

1.2及其更高能力的设备支持对8 bit、16 bit、32 bit、64 bit数据字的合并访问,相应的段的大小为:32Byte 64Byte 128Byte,大于128Byte,分两次传输。

在一次合并传输的数据中,不要求线程编号和访问的数据字编号相同。

当访问128Byte数据时,如果地址没有对齐到128Byte时,在GT200会产生两次合并访存。根据每个区域的大小,分为两次合并访存,如图所示32Byte和96Byte。

全局存储器在使用的时候,主要注意的两个问题:

1. 数据对齐的问题。一维数据使用cudaMalloc()开辟gpu全局内存空间,多维数据建议使用cudaMallocPitch()建立内存空间,以保证段对齐。cudaMallocPitch函数分配的内存中,数组的每一行的第一个元素的开始地址都保证是对齐的。因为每行有多少个数据是不确定的widthofx*sizeof(元素)不一定是256的倍数。故此,为保证数组的每一行的第一个元素的开始地址对齐,cudaMallocPitch在分配内存时,每行会多分配一些字节,以保证widthofx*sizeof(元素)+多分配的字节是256的倍数(对齐)。这样,y*widthofx*sizeof(元素)+x*sizeof(元素)来计算a[y][x]的地址就不正确了。而应该是y*[widthofx*sizeof(元素)+多分配的字节]+x*sizeof(元素)。而函数中返回的pitch的值就是widthofx*sizeof(元素)+多分配的字节。

2. 合并访问。关键就是要理解,GPU是以half-warp(1.2及更高设备为warp)进行访存时,即16个线程一起访问存储器,到这16个线程的访问的地址在同一块区域(指硬件上可以一起传送宽度)时,并且没有冲突产生时,则这块区域的数据可以被线程同时,提升了访存的效率。

时间: 2024-07-30 10:19:07

gpu显存(全局内存)在使用时数据对齐的问题的相关文章

gpu显存(全局内存)在使用时数据对齐问题解析

全局存储器,即普通的显存,整个网格中的任意线程都能读写全局存储器的任意位置. 存取延时为400-600 clock cycles  非常容易成为性能瓶颈. 访问显存时,读取和存储必须对齐,宽度为4Byte.如果没有正确的对齐,读写将被编译器拆分为多次操作,降低访存性能. 多个warp的读写操作如果能够满足合并访问,则多次访存操作会被合并成一次完成. 合并访问的条件,GT200放宽了合并访问的条件. 支持对8 bit.16 bit.32 bit.64 bit数据字的合并访问 相应传输32Byte

tensorflow中使用指定的GPU及GPU显存

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本文目录 1 终端执行程序时设置使用的GPU 2 python代码中设置使用的GPU 3 设置tensorflow使用的显存大小 3.1 定量设置显存 3.2 按需设置显存 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6591923.html 参考网址: http://stackoverflo

Ubuntu-Tensorflow 程序结束掉GPU显存没有释放的问题

笔者在ubuntu上跑Tensorflow的程序的时候,中途使用了Win+C键结束了程序的进行,但是GPU的显存却显示没有释放,一直处于被占用状态. 使用命令 nvidia-smi 显示如下 两个GPU程序都在执行中,实际上GPU:0已经被笔者停止了,但是GPU没有释放,进程还在继续,所以只有采用暴力手段了,将进程手动关闭掉,进程编号如图中红线部分,由于笔者在两个GPU跑的程序一样,很难从程序名称上找到自己,却可以从GPU:num上找到自己的PID. 关闭命令如下: sudo kill -9 P

GPU 显存释放

我们在使用tensorflow 的时候, 有时候会在控制台终止掉正在运行的程序,但是有时候程序已经结束了,nvidia-smi也看到没有程序了,但是GPU的内存并没有释放,那么怎么解决该问题呢? 首先执行下面的命令: fuser -v /dev/nvidia* #查找占用GPU资源的PID 因为我们只有一块显卡,所以显示如下图所示:  可以看到我们的nvidia0上还有一个python 2.7的PID 然后我们执行: kill -9 pid 然后再执行nvidia-smi就可以看到内存已经被释放

简谈packet tracer软件使用时数据包分叉状态

这种分叉的状态是我们在使用模拟模式时,会看到数据包发出后会分叉为多个,发送给很多终端,再一次发送时会发现这种状况又消失了.这是为什么呢? 首先我们会通过ping的命令去测试是否通信,ping发出的数据包类型是ICMP(网络控制消息协议). 交换机属于二层设备又称二层交换,代表OSI七层的前两层,不支持网络层. 当发送端给输出端发送数据包时,需要目标主机的MAC地址,发送端会查询本地的MAC地址列表,如果该列表中,没有目标主机的MAC地址,则会发送MAC地址请求包,我们又叫ARP,ARP经过交换设

关于内存与显存

内存 Memory DRAM-Dynamic Random Access Memory 基本原理 利用电容内存储的电荷多寡代表0与1 每个bit只用到一个晶体管加一个电容 但电容会漏电,因此内存需要周期性刷新 同时电容充放电需要过程,因此刷新频率不可能无限提升 因此DRAM频率很容易达到上限,即便工艺先进也收效甚微 内存的三种频率 核心/IO/等效 通常所说的DDR3-1600并非真正频率,而是等效频率 内存三种频率指标 核心频率.时钟频率.有效数据传输频率 核心频率:内存Cell阵列的刷新频率

D3D中的AGP内存、系统内存、显存的理解

转自 http://www.cnblogs.com/lancidie/archive/2011/05/20/2052094.html 学习D3D,应该对这三个内存理解,网上收集了一下相关资料,收藏下来. 三种内存AGP内存(非本地显存),显存(本地内存),系统内存,其中我们都知道系统内存就是咱那内存条,那这AGP内存是个啥玩意啊?其实是因为在以前显卡内存都很小,那时还是在显存是16M,32M为主流的时候,如果你运行一个需要很多纹理的3D程序,那么显存一会就不够用了,那该咋办呢?只好问系统内存借点

关于显卡的显存

显存,也被叫做帧缓存,它的作用是用来存储显卡芯片处理过或者即将提取的渲染数据.如同计算机的内存一样,显存是用来存储要处理的图形信息的部件. 作用 显存 如同计算机的内存一样,显存是用来存储要处理的图形信息的部件.我们在显示屏上看到的画面是由一个个的像素点构成的,而每个像素点都以4至32甚至64位的数据来控制它的亮度和色彩,这些数据必须通过显存来保存,再交由显示芯片和CPU调配,最后把运算结果转化为图形输出到显示器上.显存和主板内存一样,执行存贮的功能,但它存贮的对像是显卡输出到显示器上的每个像素

[Pytorch]深度模型的显存计算以及优化

原文链接:https://oldpan.me/archives/how-to-calculate-gpu-memory 前言 亲,显存炸了,你的显卡快冒烟了! torch.FatalError: cuda runtime error (2) : out of memory at /opt/conda/conda-bld/pytorch_1524590031827/work/aten/src/THC/generic/THCStorage.cu:58 想必这是所有炼丹师们最不想看到的错误,没有之一.