CUDA学习笔记(四)——CUDA性能
转自:http://blog.sina.com.cn/s/blog_48b9e1f90100fm5h.html
四、CUDA性能
CUDA中的block被划分成一个个的warp,在GeForce8800GTX上,一个warp有32个线程。若不够32个线程,则padding相应数目的线程。Warp中的线程ID是连续且递增的。对于二维组织的线程来说,先把threadIdx.y为0的线程按照threadIdx.x从小到大排,然后把threadIdx.y为1的线程按照threadIdx.x从小到大的顺序排列成warp。对于三维组织的线程来说,先排列threadIdx.z为0的二维线程,再排列threadIdx.z为1的二维线程,以此类推。
任何时刻,硬件都只能一次选择执行一个warp。
下面2个图是执行元素总和的操作,不同的算法实现,其效率不同。第二种方法使得线程没有分支。
全局内存性能
Memory coalescing技术能够大大提高全局内存访问的速度。硬件会检测线程所访问的位置是否是在全局内存中的相邻位置,如果是相邻位置,硬件会把这些访问合并成一个相邻访问。
SM资源的动态划分
1. thread限制:一个SM最多768个
2. block限制:一个block最多512个thread,如果block有256个thread,根据线程数目的限制,一个SM最多只能有3个block了。
3. register限制:一个SM最多8192个register
资源之间的分配和权衡对性能影响非常大。
例如,假设在矩阵乘中,block事16*16线程的,每个thread使用10个register,那么一个block需要使用2560个register,那么3个block就要用8120个register,小于8192的寄存器数目限制。但是如果再加一个block的话,寄存器数目就到达10240了,超过了寄存器数目的限制。假设每个thread使用11个register,那么一个block需要使用16*16*11=2816个寄存器,3个block需要8448个寄存器,超过了寄存器限制。所以一个SM只能容纳2个block了。那么SM上的线程数目就从768减少为512了。线程并行度减少了1/3!
另一个例子:假设在全局内存load和使用之间有四条独立的指令,在G80中,每条指令要4cyle,所以4条指令需要16个cycle。而200内存延迟需要调度200/16=14个warps来保证执行单元的利用率。若把指令数从4增加到8,那么就只需要200/(4*8)=7个warps。也就是说,即使我们把block数目从3减少到2,因此warps数目从24(768/32)减少到16(512/32),我们有足够的warps来完全地利用执行单元,性能最后还提高了!参考[RyooCGO08]
数据预取
Prefetch techniques are often combined with tiling to simultaneously address the problems of limited bandwidth and long latency
循环展开
减少分支指令和循环计数器的更新。
线程粒度
线程粒度通常是程序调优中一个重要的标准。
2009-11-9
做了一些实验,问题:
如果不设置足够多的thread,处理器是怎样处理的,实验结果是否会出错?
若thread数目不足以计算矩阵乘,那么剩下的就不会计算
编程:
gridDim.x, gridDim.y, gridDim.z表示Grid的三个维度
blockDim.x, blockDim.y, blockDim.z表示block的三个维度
对于GeForce8800来说,由于一个block的shared memory大小为 16K字节,所以对于float型(8个字节)的矩阵乘来说,tile 块最大不能超过2048
CUDA学习笔记(四)——CUDA性能的更多相关文章
- CUDA学习笔记-1: CUDA编程概览
1.GPU编程模型及基本步骤 cuda程序的基本步骤如下: 在cpu中初始化数据 将输入transfer到GPU中 利用分配好的grid和block启动kernel函数 将计算结果transfer到C ...
- kvm虚拟化学习笔记(四)之kvm虚拟机日常管理与配置
KVM虚拟化学习笔记系列文章列表----------------------------------------kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51 ...
- openresty 学习笔记四:连接mysql和进行相关操作
openresty 学习笔记四:连接mysql和进行相关操作 毕竟redis是作为缓存,供程序的快速读写,虽然reidis也可以做持久化保存,但还是需要一个做数据存储的数据库.比如首次查询数据在red ...
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
- IOS学习笔记(四)之UITextField和UITextView控件学习
IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...
- java之jvm学习笔记四(安全管理器)
java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(四) indigo devices
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Typescript 学习笔记四:回忆ES5 中的类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- ES6学习笔记<四> default、rest、Multi-line Strings
default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...
- muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制
目录 muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制 eventfd的使用 eventfd系统函数 使用示例 EventLoop对eventfd的封装 工作时序 runInLoo ...
随机推荐
- POJ2823 Sliding Window
Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 53086 Accepted: 15227 Case Time Limi ...
- 洛谷P2024 食物链
挺神奇 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种 ...
- 获取Trustedinstalled权限.reg
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT*\shell\runas] @="获取TrustedInstaller权限&q ...
- Android学习笔记02-Mac下编译java代码
在Mac OS上配置JDK 1.7. 一 下载 Mac版本的JDK1.7 从以下下载地址,下载Mac版本的JDk1.7 安装文件 jdk-7u79-macosx-x64.dmg. http://www ...
- js的基础学习
alert() 函数在 JavaScript 中并不常用,但它对于代码测试非常方便. <!DOCTYPE html> <html> <body> <h1> ...
- Fedora下安装ORACLE 11g
一.硬件检测 1.内存检测 oracle11g要求最低1GB内存 命令: grep MemTotal /proc/meninfo 2.交换空间检测 通常交换空间是内存1.5倍 命令: grep ...
- mongo操作
详细使用网址:http://blog.csdn.net/xinghebuluo/article/details/7050811 MongoDB基本使用 成功启动MongoDB后,再打开一个命令行窗口输 ...
- 弱键(Weak Key, ACM/ICPC Seoul 2004, UVa1618)
I think: 给出k(4≤k≤5000)个互不相同的整数组成的序列Ni,判断是否存在4个整数Np.Nq.Nr和Ns(1≤p<q<r<s≤k),使得Nq>Ns>Np&g ...
- Python socket编程之三:模拟数据库循环发布数据
1. f1.py # -*- coding: utf-8 -*- import socket import struct import sqlalchemy import pandas ####### ...
- 去除DedeCms 5.7后台版权广告链接的方法
织梦DedeCms 5.7后台有很多的织梦官方的广告链接,下面我们来将这些广告去掉吧. 一.去处后台登陆页login.php广告链. 1.找到登录界面模板文件/dede/templets/login. ...