CUDA学习笔记(二)——CUDA线程模型
转自:http://blog.sina.com.cn/s/blog_48b9e1f90100fm5b.html
一个grid中的所有线程执行相同的内核函数,通过坐标进行区分。这些线程有两级的坐标,blockId和threadId,由CUDA runtime system指定。grimDim.x标识block在x维度上的数目,gridDim.y标识block在y维度上的数目。例如,
在启动内核时指定:
dim3 dimBlock(4,2,2);
dim3 dimGrid(2,2,1);
KernelFunction<<<dimGrid, dimBlock>>>(…);
其中,grid是二维的,所以,最后一个参数一般设置为1。
注意:一个block最多能有512个线程。
如果kernel function没有用到blockId,那么所有的线程都属于同一个block。
例如:
P=M* N,那么:Pd[Row][Col]=Sum{ Md[Row][k]*Nd[k][Col] }
同一个block中的线程通过syncthreads()进行同步。当内核函数调用syncthreads()时,block中的所有线程都在调用位置停留,直到block中的其他线程达到这个位置。Barrier synchronization是常用的协调线程并行行为的方法。
为了避免同一个block中的线程在同步的时候,会有长时间的等待。往往把相同的资源分配给一个block中的线程。不同的block可以以任意顺序执行,因为不同的block之间不存在同步问题。如图:
这样的话,同样的程序,可以以多种不同的方式执行。每种执行方式可能有不同的开销,功耗和性能。例如,一个mobile processor可以以很低的功耗慢速执行,一个desktop processor可以以高一些的功耗快速执行。程序相同,但是这种改变是透明的。
线程分配
一旦启动一个kernel,CUDA run-time系统就产生对应的grid。Grid中的线程分配到block上。GeForce 8800GTX有16个Streaming Multiprocessor,每个SM最多可以分配8个block,所以最多有128个block同时分配给Streaming Multiprocessor。系统维护一个block的list,当前面的block执行完成后,分配新的block给SM。
另一个资源限制是能够同时调度的线程数目。因为保留thread, block的ID并跟踪他们的执行状态需要硬件资源。在GeForce 8800GTX上,每个SM最多能分配768个线程。所以,整个GeForce 8800GTZX最多同时有12288(16*768)个线程。
线程调度
在GeForce 8800GTX中,一旦一个block指定给一个SM,这个block被分成32个线程的单位,叫做Warps。Warp的大小根据不同的平台实现而不同。
实际上,warp甚至不是CUDA语言定义中的一部分。但是,warp的概念可以帮助理解和优化GeForce-8系列处理器的CUDA程序。Warps是线程的调度单位。根据block中分配的线程数目,可以求出warp数目:warps=threads/32。总的来说,一个SM中最多有24(768/32)个warps。
而在一个时间点,只能有一个warp在真正的执行。如果一个warp中的线程执行一条指令时,需要等待前面的长延迟的操作,warp就被放在等待区域中。其他不用等待的warp可以开始执行。如果有多个warp处于备执行状态,有一个优先机制进行选择。如图:
调度单位是warp中的block。这样,如果每时每刻都有线程在执行,能够保持系统始终处于忙碌状态。这是一种零开销的线程调度。
CUDA学习笔记(二)——CUDA线程模型的更多相关文章
- CUDA学习笔记-1: CUDA编程概览
1.GPU编程模型及基本步骤 cuda程序的基本步骤如下: 在cpu中初始化数据 将输入transfer到GPU中 利用分配好的grid和block启动kernel函数 将计算结果transfer到C ...
- C#线程学习笔记二:线程池中的工作者线程
本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/18/ThreadPool.html,记录一下学习过程以备后续查用. 一.线程池基础 首先,创 ...
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
- muduo学习笔记(二)Reactor关键结构
目录 muduo学习笔记(二)Reactor关键结构 Reactor简述 什么是Reactor Reactor模型的优缺点 poll简述 poll使用样例 muduo Reactor关键结构 Chan ...
- Java学习笔记之---单例模型
Java学习笔记之---单例模型 单例模型分为:饿汉式,懒汉式 (一)要点 1.某个类只能有一个实例 2.必须自行创建实例 3.必须自行向整个系统提供这个实例 (二)实现 1.只提供私有的构造方法 2 ...
- JMX学习笔记(二)-Notification
Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...
- Django学习笔记二
Django学习笔记二 模型类,字段,选项,查询,关联,聚合函数,管理器, 一 字段属性和选项 1.1 模型类属性命名限制 1)不能是python的保留关键字. 2)不允许使用连续的下划线,这是由dj ...
- Linux内核学习笔记二——进程
Linux内核学习笔记二——进程 一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...
- MySQL学习笔记-数据库后台线程
数据库后台线程 默认情况下讲述的InnoDB存储引擎,以后不再重复声明.后台线程有7个--4个IO thread,1个master thread,1个锁监控线程,1个错误监控线程.IO thread的 ...
- python3.4学习笔记(二) 类型判断,异常处理,终止程序
python3.4学习笔记(二) 类型判断,异常处理,终止程序,实例代码: #idle中按F5可以运行代码 #引入外部模块 import xxx #random模块,randint(开始数,结束数) ...
随机推荐
- BZOJ2654 tree
Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...
- jquery无限级下拉框
非原创,已修改成通用版,效果如下: 下载:http://files.cnblogs.com/files/EasonJim/jquery.menu.rar 项目相关地址 源码:https://githu ...
- Linux /proc、/dev Principle
目录 . /proc简介 . 内核机制相关 . 进程信息 . 硬件设备相关 . 系统信息 . /dev简介 . 内存相关 1. /proc简介 在linux的根目录下有一个/proc目录,/proc文 ...
- 破解受保护的excel中的密码
今天朋友给我发了一张excel表,她说不能删除数据,让我帮忙弄弄,我当时就觉得这张表应该是受到保护了,就在视图选项中准备撤销保护,但是却需要密码,后来在网上查找了 下资料,发现有个方法可以将密码破解出 ...
- 轻量级应用开发之(06)Autolayout自动布局1
一 什么是Autolayout Autolayout是一种“自动布局”技术,专门用来布局UI界面的. 自IOS7 (Xcode 5)开始,Autolayout的开发效率得到很大的提高. 苹果官方也推荐 ...
- AndroidManifest File Features
http://www.android-doc.com/guide/topics/manifest/manifest-intro.html The following sections describe ...
- Oracle数据分页,并传出数据集
1.创建Package create or replace package forPaged is type my_csr is ref cursor; procedure getPaged(tabl ...
- JDK安装成功了,环境变量也配置好了,测试代码也可以运行,但是打不开eclipse
解决办法:删除eclipse,重新解压后,将JDK文件夹下的jre文件夹拷贝到eclipse文件夹下,OK
- 牛顿迭代法求n方根
一.简单推导 二.使用 借助上述公式,理论上可以求任意次方根,假设要求a(假设非负)的n次方根,则有xn=a,令f(x)=xn-a,则只需求f(x)=0时x的值即可.由上述简单推导知,当f(x)=0时 ...
- php 开启curl,重启php-fpm服务
1,找到php.ini配置 find / -name 'php.ini' /usr/local/php/etc/php.ini 找到extension=php_curl.dll 把前面的分号去掉即可. ...