(四)、硬件实现——CUDA Programming Guide

4.1 SIMT架构

多个线程执行同一条指令

当thread block分配到SM上时,SM会将block中的连续id的thread按照32个为一组划分成多个warp。

SM创建、管理、调度和执行warp。
同一warp中的32个threads都有各自的instruction address counter和register state,因此可以独立地进行分支和执行。

在Volta之前,一个warp内的线程共用一个PC(程序计数器),并配备一个32位的active mask来标识某个线程是否处于active状态。但是,来自相同warp内的不同分支内的线程之间不能通信或者交换数据,因为使用锁(或互斥锁)时会导致死锁。

从Volta开始,独立线程调度(Independent Thread Scheduling)允许线程之间完全并发。GPU维护每个线程的执行状态(包括PC和调用栈)。但是仍旧采用warp划分方式。

4.2 硬件多线程

由SM处理的每个warp的执行上下文(包括PC和寄存器等)在维护在on-chip。因此,从一个执行上下文切换到另一个执行上下文是没有成本的,并且在每次指令发出时,warp调度程序都会选择一个有准备好线程的warp执行其下一条指令(warp的活动线程),并向这些线程发出指令。

特别是,每个多处理器都有很多个32位的寄存器,这些寄存器被划分给在warp。一个并行数据缓存或共享内存,被划分给在线程块。

对于给定的kernel,可以驻留在SM上的Block和warp的数量取决于kernel使用的register和shared memory的数量,以及SM上可用的register和shared memory的数量。每个SM还有最的驻留block数和最大的驻留warp数。如果每个SM没有足够的register和shared memory来处理至少一个block,kernel将无法启动。

一个Block中的warp总数:
在这里插入图片描述

  • T T T是Block中的线程总数,
  • W s i z e W_{size} Wsize是warp大小,等于32,
  • c e i l ( x , y ) ceil (x,y) ceil(x,y)等于x向上取整到y的倍数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值