数量线程SM,SP和GRID,BLOCK,THREAD之间的对应关系是什么?

摘要:
最近,在应用程序开发过程中出现了一个小问题。顺便记录一下原因和方法——线程数SM,SP是硬件结构GRID,BLOCK,THREAD是软件概念。从硬件角度来看,GPU由多个SM组成,SM包含多个SP,1.x硬件,SM包含八个SP,2.0为32,2.1为48,3.0和3.5为192。这是CUDA的两级并行结构。

最近应用开发的过程中出现了一个小问题,顺便记录一下原因和方法--数量线程

    SM,SP是硬件构结

    

    GRID,BLOCK,THREAD是软件念概

    

    

    

    从硬件度角讲,一个GPU由多个SM构成(当然还有其他部份),一个SM含包有多个SP(以及还有寄存器资源,shared memory资源,L1cache,scheduler,SPU,LD/ST单元等等),1.x硬件,一个SM含包8个SP,2.0是32个,2.1是48个,3.0和3.5是192个。以及SP现在也称为CUDA CORE,而SM现在也称为MP,在KEPLER构架(SM3.0和3.5)下也称为SMX。

    

    

    

    从软件度角讲,CUDA因为是SIMT的式形,GRID,block,thread是thread的组织式形。小最的逻辑单位是一个thread,小最的硬件执行单位是thread warp(简称warp),若干个thread(典型值是128~512个)构成一个block,block被加载到SM上行运,多个block构成团体的GRID。

    

    

    这里为什么要有一个间中的次层block呢?这是因为CUDA通过这个念概,供给了细粒度的通信段手,因为block是加载在SM上行运的,所以可以利用SM供给的shared memory和__syncthreads()能功现实线程同步和通信,这带来了很多处好。而block之间,除了结束kernel外之是没法同步的,一般也不证保行运先后顺序,这是因为CUDA序程要证保在不同范围(不同SM数量)的GPU上都可以行运,必须备具范围的可扩展性,因此block之间不能有依附。

    

    

    这就是CUDA的两级行并构结。

    

    

    总而言之,一个kernel对应一个GRID,该GRID又含包若干个block,block内含包若干个thread。GRID跑在GPU上的时候,是能可占独一个GPU的,也是能可多个kernel并发占用一个GPU的(要需fermi及更新的GPU构架持支)。

    

    

    block是resident在SM上的,一个SM可能有一个或多个resident blocks,要需体具根据资源占用分析。

    

    

    每日一道理
古人云:“海纳百川,有容乃大。”人世间,不可能没有矛盾和争吵,我们要以磊落的胸怀和宽容的微笑去面对它 。哈伯德也曾说过:“宽恕和受宽恕的难以言喻的快乐,是连神明都会为之羡慕的极大乐事。”让我们从宽容中享受快乐,从谅解中体会幸福吧!

    thread以warp为单位被SM的scheduler 发射到SP或者其他单元,如SFU,LD/ST unit执行关相操纵,要需等待的warp会被切出(仍然是resident 状态),以空出执行单元给其他warps。

    

    那么有问题 

    1. 1个block是不是只能resident在1个SM里
2. GTX660ti的cuda core是1344,kepler构架,所以应该有7个SM,每一个SM有192个SP,这么懂得对吗?
3. 在GTX660ti上跑一个kernel,如果block number为1,是不是gpu最多载负1/7,这么懂得对吗?

    

    ice大神这样复兴

    

    1:是的,您可以这样帮助斟酌,如果一个block要应用shared memory,此时注意到shared memory是SM上的资源,不同的SM上shared memory是不通信的,也不能互相借用。所以,可以反证,一个block只能resident在一个SM上。

2:kepler构架下的SM(又称SMX)是具有192个SP(又称CUDA CORE)没错,因而应用总的SP数量除以192即得 SM数量。您的懂得是确正的。

3:这个问题说起来略微有点庞杂,因为这个和该block应用资源的情况有关,一般情况下,是没法到达1/7的,也就是说只上一个block的话极可能一个SM都跑不满,(比如这个block面里线程数量非常少,或者线程数量中等但是仍然没法盖掩其他的迟延等)同时一个block最大只能有1024个线程,这对于GPU算计还是少了些。
单简地借用一个数学的念概来说明可能更为明白:“1/7是您GPU占用率的‘上界’,但可能不是‘上确界(小最上界)’,同时,这样做一般来说线程数量太少,没有意义。”

文章结束给大家分享下程序员的一些笑话语录: PC软件体积大,是因为一个PC软件功能往往较多,能够满足你一个方面的需求,而一个iphone软件往往没几行代码,干一件很小的事情,自然需要的软件就多。就像吃西瓜和吃瓜子的来比数目,单位不同啊。

免责声明:文章转载自《数量线程SM,SP和GRID,BLOCK,THREAD之间的对应关系是什么?》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇delphi 操作xml示例(DelphiBBS)python爬虫学习笔记(二十七)-Splash的使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JAVA多线程提高十三:同步集合类的应用

 1.引言   在多线程的环境中,如果想要使用容器类,就需要注意所使用的容器类是否是线程安全的。在最早开始,人们一般都在使用同步容器(Vector,HashTable),其基本的原理,就是针对容器的每一个操作,都添加synchronized来进行同步,此种方式尽管简单,但是其性能是非常地下的,所以现在已经不怎么使用了。人们普遍会使用并发的容器,在JDK1....

竞态与线程安全

竞态 对于同样的输入,程序的输出有时候正确而有时候却是错误的。这种一个计算结果的正确性与时间有关的现象就被称为竞态(RaceCondition) 导致竞态的常见原因是多个线程在没有采取任何措施的情况下并发更新、读取同一个共享变量。 竞态往往伴随着数据的脏读问题,即线程读取到一个过时的数据;丢失更新问题,即一个线程丢失数据所做的更新没有体现在后续其他线程对该...

Linux下C编程2--线程的练习

先挖坑,周末再补== 对于多线程的demo,主要在尝试封装 thread类来简化创建多线程的步骤: 主要参考文章:跳转1 线程基类  BaseThread:主要提供接口 自己的功能线程类  MyThread: 主要去实现你的线程中希望执行的操作 #ifndef CTHREAD_HH #define CTHREAD_HH #include <stdi...

springboot配置 Druid , yml格式

datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/mp?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai u...

多线程调用有参数的方法---c# Thread 与 Task

  C#实现多线程的方式:Task——任务       简介   .NET 4包含新名称空间System.Threading.Tasks,它 包含的类抽象出了线程功能。 在后台使用ThreadPool。 任务表示应完成的某个单元的工作。 这个单元的工作可以在单独的线程中运行,也可以以同步方式启动一个任务,这需要等待主调线程。 使用任务不仅可以获得一个抽象...

关于对JMM(java内存模型)的个人理解

java内存模型是一种虚拟机规范,它定义了Java内存模型,用于屏蔽各种不同硬件和操作系统访问内存差异,以实现让java程序在各种平台下都能达到一致的并发效果.JMM规范了java虚拟机与计算机内存是如何协同工作的,规定了一个线程如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量. 关于主内存与工作内存之间的具体交互协...