博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
gpu显存(全局内存)在使用时数据对齐的问题
阅读量:7044 次
发布时间:2019-06-28

本文共 1023 字,大约阅读时间需要 3 分钟。

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

存取延时为400-600 clock cycles  很easy成为性能瓶颈。

訪问显存时,读取和存储必须对齐,宽度为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个线程的訪问的地址在同一块区域(指硬件上能够一起传送宽度)时,而且没有冲突产生时,则这块区域的数据能够被线程同一时候,提升了訪存的效率。

转载地址:http://vtqal.baihongyu.com/

你可能感兴趣的文章
poj2871
查看>>
将字符串切割成数组 componentsSeparatedByString
查看>>
HDU-4472 Count 递推
查看>>
大型网站核心技术
查看>>
吸收遍历Google Code jam 2013 Round 1B A题
查看>>
Android获取设备型号、SDK版本及其系统版本
查看>>
windows中如何在命令行启动启动程序
查看>>
布局文件Android ListView入门知识--各种Adapter配合使用
查看>>
项目文件跟Google学习Android开发-工具篇-Android Studio入门
查看>>
最火的Android开源项目(1)
查看>>
C#中winform窗体常用设置
查看>>
win8 sqlserver2008 附加数据库错误: 5120
查看>>
HTML <div> 标签的 align 属性
查看>>
SQL Server2008附加数据库之后显示为只读时解决方法 .
查看>>
Lazy Load, 延迟加载图片的 jQuery 插件【备忘】
查看>>
Linux下nagios网络监控与/proc/net/tcp文件详解
查看>>
JavaBean 基础概念、使用实例及代码分析
查看>>
(转)typedef 函数指针的用法
查看>>
谈Mysql索引
查看>>
锁标记
查看>>