CUDA内存访问(一)提高篇------按部就班 ------GPU的革命

谈到内存的访问,其实也就是几个API函数的调用,感觉也没什么好讲的,知道cudaMalloc,知道cudaMemcpy,还有cudaFree,就应该可以对device上的内存进行分配,然后就可以在device上使用内存。但是就像我们看运动会一样,只看100米的那不到10秒的时间,也许你只会说,他跑得真快。又有多少人能清楚其过程中的磨炼啦?要真正理解device上内存的调度访问,让我们的程序达到更快的速度,就得对内存访问的情况做更深入的了解,明白其中的过程。

我记得大学刚开始上编程语言的课程的时候,都会讲到内存的分配和内存的释放,但是一般都是在书的最后面才会讲内存的对齐,内存的空间布局。就像C++一样,或许你学习了好几年,用了它好多年,但是你是否清楚class的内存布局?知道虚表是怎么一个内存访问过程?就像做网络,当做到一定地步的时候,才会发现数据从一段传递到另一段的时候数据发生了变化,内容不对了,定义的结构体传递到另一边的时候就错位了。当在使用SSE对数据处理加速的时候,是否为内存对齐的问题头疼?说了这么多,或许有人在烦了~~~讲正题吧,这些部分或许只有自己真正在实际运用中遇到问题,才会去考虑的,不过还是希望大家能在遇到问题之前,就能掌握解决问题的能力。不是在遇到美女的时候才开始刮胡子,平时的习惯就要养好。

前面这一段话或许只是生活的一些经历,其实可以跳过,当遇到的时候再回来看看:)我们还是按部就班的来讲解device上内存的访问吧。这么多年的发展,内存的价格是越来越便宜,但是有谁知道当你做编织内存的时候,很多人的眼睛都被弄瞎过啦,为她们当年为计算机作出的贡献bless一下。

还记得小时候经常看枪战片,看到小马哥端着枪一个劲的扫射,哪个帅啊~~不过后来稍微大一些以后,心理面一直有一个疑问,子弹用不完?一次能装多少子弹啊~就那么小的弹夹。8发子弹的左轮手枪在帅哥哥手里可以搞定十几个人~还不装弹- 囧!一般的自动手枪一般都是8发,14发,最多的驳壳枪(毛瑟枪)也才能装20发子弹。你要说人家是《第一滴血4》里面的史泰龙可以开着战车上面的M2HB12.7mm重机枪,子弹不用弹夹,一次可以装几千发的弹;对,人家是DMA直接内存访问,不是通过弹夹访问的,不需要处理器来中转数据。G80支持的内存访问的能力是一次访问4bytes,8byets或者16bytes,G80有三种弹夹,一种可以一次装4发子弹,一种是8发子弹,还有16发的。

Global Memory 在访问过程中没有Cache,就像以前的火枪一样,打一枪以后,装药,然后才能打下一枪。每次的访问时间是400-600个clock(core 跑的时钟)延迟。所以在CUDA编程中,其中一个瓶颈就是内存访问。利用SDK提供的bandwidthTest可以测试到host到device,device到host,device到device的传输性能。虽然PCIE有3.2G/s的理论值,但实际达不到这么多。Device to Device的传输能达到89G/s(GTX260)左右,理论值是90G/s(GTX260)也达到差不多了。这个地方每个人显卡不一样,主板不一样,设置环境不同,也不一定一样。

Device上active的一个warp有32个线程,但是实际是16个thread同时在运行,就是half warp。当half warp的16个threads访问内存的时候,最好让16个thread依次对着相对应的内存地址,这样的时候才能保证Coalesced Access。如下图http://www.isi.edu/~ddavis/GPU/Course/Slides/GPU+CUDA.pdf:

时间: 2024-10-03 18:34:13

CUDA内存访问(一)提高篇------按部就班 ------GPU的革命的相关文章

非一致性内存访问的读写锁

原文地址,译文地址,译者: 李杰聪,校对:郑旭东 原文作者: Irina Calciu         Brown University        irina@cs.brown.edu Dave Dice          Oracle Labs             dave.dice@oracle.com Yossi Lev           Oracle Labs             yossi.lev@oracle.com Victor Luchangco    Oracle

CUDA编程接口(一)------一十八般武器------GPU的革命

序言:所谓一十八般武器,不同的年代又有不同的说法,最早的汉武年间的:矛.镗.刀.戈.槊.鞭.锏.剑.锤.抓.戟.弓.钺.斧.牌.棍.枪.叉.到三国的:九长:刀.矛.戟.槊.镗.钺.棍.枪.叉:九短:斧.戈.牌.箭.鞭.剑.锏.锤.抓.再到明清的:弓.弩.枪.刀.剑.矛.盾.斧.钺.戟.黄.锏.挝.殳(棍).叉.耙头.锦绳套索.白打(拳术).<水浒传>里的:矛.锤.弓.弩.铳.鞭.锏.剑.链.挝.斧.钺.戈.戟.牌.棒.枪.扒.今天的武术届又有:刀.枪.剑.戟.斧.钺.钩.叉.鞭.锏.锤.抓.镗

CUDA硬件实现分析(二)------规行矩步------GPU的革命

序言:换位思考.当今的生活,节奏快,任务忙.慢慢的忽略了身边的很多事,很多人.再加上接受"高等"教育的人越来越多,"有自己思想的"人越来越多,慢慢的都习惯从自己的思维角度来思考问题,尤其是读工科的学生更是喜欢按照自己的角度来思考问题.慢慢的忽略了换位思考.有很多朋友说学工科的人都喜欢走极端.或许这个就像金庸小说里面少林高僧给两个偷学少林武功的人的建议.在忙碌的生活和紧张的工作中,找个时间,能让自己停下来,想想做过的事情,让自己忙碌的脚步,休息一会儿. 往往在team

内存访问模型的重要性

在高性能的计算中,我们常说缓存失效(cache-miss)是一个算法中最大性能损失点. 近些年来,我们的处理器处理能力的增长速度已经大大超过了访问主内存的延迟的缩短. 通过更宽的,多通道的总线,到主内存的带宽已经大大增加,但延迟并没有相应显著减少. 为了减少延迟,处理器采用愈加复杂的多层的高速缓存子系统. 在1994年的一篇论文"Hitting the memory wall: implications of the obvious"中描述了这个问题,并且认为由于缓存失效(cache-

CUDA Cuts: Fast Graph Cuts on the GPU

    原文出处: http://lincccc.blogspot.tw/2011/03/cuda-cuts-fast-graph-cuts-on-gpu_03.html 现在需要代理才能访问,所以就转载了.     [论文笔记] CUDA Cuts: Fast Graph Cuts on the GPU Paper:V. Vineet, P. J. Narayanan. CUDA cuts: Fast graph cuts on the GPU. In Proc. CVPR Workshop,

CUDA线程执行模型分析(二)大军未动粮草先行---GPU的革命

序:今天或许是比较不顺心的一天,从早上第一个电话,到下午的一些列的事情,有些许的失落.有的时候真的很想把工作和生活完全分开,但是谁又能真正的分得那么开,人非草木!很多的时候都想给人生下一些定义,添加一些注释.但是生活本来就是不需要添加注释的自解释的代码.用0来解释?还是用1来解释?0,天地之始,1,万物之源.谁又能说清楚,是先有0,还是先有1,他们本就是同体--要想成事,就应该拿得起,放得下.感叹人生的同时,人生的旅程是不会停止的--手下还有招来的那么多将士,都还等着啦! 正文:书接上回--<C

什么是英特尔快速内存访问

  英特尔快速内存访问是图形和内存控制器中枢(GMCH)骨干架构的更新;它通过优化对可用内存带宽的使用和降低内存访问延迟而提高系统性能.

《操作系统真象还原》——0.8 代码中为什么分为代码段、数据段?这和内存访问机制中的段是一回事吗

0.8 代码中为什么分为代码段.数据段?这和内存访问机制中的段是一回事吗 首先,程序不是一定要分段才能运行的,分段只是为了使程序更加优美.就像用饭盒装饭菜一样,完全可以将很多菜和米饭混合在一起,或者搅拌成一体,哈哈,但这样可能就没什么胃口啦.如果饭盒中有好多小格子,方便将不同的菜和饭区分存放,这样会让我们胃口大开增加食欲. x86平台的处理器是必须要用分段机制访问内存的,正因为如此,处理器才提供了段寄存器,用来指定待访问的内存段起始地址.我们这里讨论的程序代码中的段(用section或segme

Android内存泄漏终极解决篇(下)_Android

一.概述 在 Android内存泄漏终极解决篇(上)中我们介绍了如何检查一个App是否存在内存泄漏的问题,本篇将总结典型的内存泄漏的代码,并给出对应的解决方案.内存泄漏的主要问题可以分为以下几种类型: 静态变量引起的内存泄漏 非静态内部类引起的内存泄漏 资源未关闭引起的内存泄漏 二.静态变量引起的内存泄漏 在java中静态变量的生命周期是在类加载时开始,类卸载时结束.换句话说,在android中其生命周期是在进程启动时开始,进程死亡时结束.所以在程序的运行期间,如果进程没有被杀死,静态变量就会一