GPU编程-Thread Hierarchy(3)
1. 如果处理的数据是二维的或者三维的,应该怎么办呢?
针对的,我们可以按照二维或者三维的方式,组织线程。老规矩,先代码、后解释
// Kernel definition
__global__ void MatAdd(float A[N][N], float B[N][N],
float C[N][N])
{
int i = threadIdx.x;
int j = threadIdx.y;
C[i][j] = A[i][j] + B[i][j];
}
int main()
{
...
// Kernel invocation with one block of N * N * 1 threads
int numBlocks = ;
dim3 threadsPerBlock(N, N);
MatAdd<<<numBlocks, threadsPerBlock>>>(A, B, C);
...
}
线程可以一维、二维或者三维的方式,组织成Block,在上述代码中,我们指定有一个Block,这个Block按照NxN的二维结构进行组织。如果N就是矩阵相应的维度,那么上述代码块完成的功能就是矩阵对应元素相加。
2.受GPU资源的限制,每一个Block所含线程个数有限(一般情况下,最多为1024个),如果矩阵的维度超过了线程个数上限,是不是就计算不了大型矩阵的对应元素相加了呢?
答案是否定的。如果将Block看做一个基本组成单元,Block又可以按照一维、二维或者三维的形式组织成grid。Blcok、grid、thread的关系如下图所示

如果矩阵的维度超过了Block能够包含线程的上限,我们可采取以下方式应对(先代码,后解释)
// Kernel definition
__global__ void MatAdd(float A[N][N], float B[N][N],
float C[N][N])
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
int j = blockIdx.y * blockDim.y + threadIdx.y;
if (i < N && j < N)
C[i][j] = A[i][j] + B[i][j];
}
int main()
{
...
// Kernel invocation
dim3 threadsPerBlock(, );
dim3 numBlocks(N / threadsPerBlock.x, N / threadsPerBlock.y);
MatAdd<<<numBlocks, threadsPerBlock>>>(A, B, C);
...
}
在上述代码中,N代表矩阵的维度,每一个Block按照16x16的二维结构组织,这样每一个Block只能够处理大型矩阵一个很小的patch。一般情况下,grid所有的thread是自然是顺序排列的(此时的Block索引可以理解为一种二级索引,一级索引指的是直接索引thread)。上述代码就是先将大型矩阵分解为Block,然后由Block里的线程完成具体的矩阵对应元素相加操作。
“The number of thread blocks in a grid is usually dictated by the size of the data being processed or the number of processors in the system, which it can greatly exceed.”
3. Block是并行执行的,假如所需Block数量超出GPU所能提供的Block的限制,会出现什么情况呢?

如上图所示,grid内的Block根据GPU的具体情况,选择顺序执行或者并行执行。
总结:线程的组织方式既能够匹配GPU硬件又能够处理大量数据,是一种很巧妙的安排。
GPU编程-Thread Hierarchy(3)的更多相关文章
- GPU 编程入门到精通(五)之 GPU 程序优化进阶
博主因为工作其中的须要,開始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识.鉴于之前没有接触过 GPU 编程.因此在这里特地学习一下 GPU 上面的编程. 有志同道合的小伙 ...
- GPU 编程入门到精通(四)之 GPU 程序优化
博主因为工作其中的须要,開始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GPU 编程.因此在这里特地学习一下 GPU 上面的编程.有志同道合的小伙伴 ...
- GPU编程自学5 —— 线程协作
深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题.这里主要记录自己的GPU自学历程. 目录 <GPU编程自学1 -- 引言> <GPU编程自学2 -- CUD ...
- GPU编程自学4 —— CUDA核函数运行参数
深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题.这里主要记录自己的GPU自学历程. 目录 <GPU编程自学1 -- 引言> <GPU编程自学2 -- CUD ...
- GPU 编程入门到精通(三)之 第一个 GPU 程序
博主因为工作其中的须要.開始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GPU 编程,因此在这里特地学习一下 GPU 上面的编程.有志同道合的小伙伴 ...
- GPU 编程相关 简要摘录
GPU 编程可以称为异构编程,最近由于机器学习的火热,很多模型越来越依赖于GPU来进行加速运算,所以异构计算的位置越来越重要:异构编程,主要是指CPU+GPU或者CPU+其他设备(FPGA等)协同计算 ...
- 第一篇:GPU 编程技术的发展历程及现状
前言 本文通过介绍 GPU 编程技术的发展历程,让大家初步地了解 GPU 编程,走进 GPU 编程的世界. 冯诺依曼计算机架构的瓶颈 曾经,几乎所有的处理器都是以冯诺依曼计算机架构为基础的.该系统架构 ...
- GPU编程--宏观理解篇(1)
GPU编程与CPU编程最大的不同可以概括为以下两点: "The same program is executed on many data elements in parallel" ...
- Point : GPU编程的艺术!一切的历史!
Point: 渲染渲染,神奇的渲染!! ———————————————— 只要你走的足够远,你肯定能到达某个地方. 1"GPU编程" History ————————— //由于笔 ...
随机推荐
- 使用nodejs进行WEB开发
这里,准备从零开始用nodejs实现一个微博系统.功能包括路由控制.页面模板.数据库访问.用户注册.登录.用户会话等内容. 将会介绍Express框架.MVC设计模式.ejs模板引擎以及MongoDB ...
- sptt规范介绍
相关资源 如何开发sptt工程的原子操作 移动端测试方案--sptt sptt规范 一个标准的sptt工程的目录如下: [sptt-project] | -- [ios] | | -- [atoms] ...
- Redis编码问题
最近搞redis存储对象出了点问题,大概说一下背景,项目原有的东东以前存的是redis,存储的直接是对象模型,没有问题,这里存储对象存储任何信息事都没有问题的.但是现在调整为存储序列化的json字符串 ...
- 用户登录(Material Design + Data-Binding + MVP架构模式)实现
转载请注明出处: http://www.cnblogs.com/cnwutianhao/p/6772759.html MVP架构模式 大家都不陌生,Google 也给出过相应的参考 Sample, 但 ...
- 为什么说B+-tree比B 树更适合实际应用中操作系统的文件索引和数据库索引?
B树: B+树 1) B+-tree的磁盘读写代价更低 B+-tree的内部结点并没有指向关键字具体信息的指针.因此其内部结点相对B 树更小.如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所 ...
- DFB系列 之 Clear清空surface缓存
1. 函数原型解析 函数声明: DFBResult Clear ( IDirectFBSurface * thiz, u8 r, u8 g, ...
- poj2100还是尺取
King George has recently decided that he would like to have a new design for the royal graveyard. Th ...
- ElasticSearch5在Ubuntu系统下的安装和Java调用
ElasticSearch是开源搜索平台的新成员,实时数据分析的神器.可以理解为作为搜索的数据库,可以提供搜索功能.对比关系型数据库,具有以下的相似关系: 关系型数据库 数据库 表 行 列 Elast ...
- 荣获MVP感想
感言 最近特别忙,除了工作之外最开心的算是收到了MVP的奖杯,从到申请到审批通过也不过一个礼拜的时间,从去年就开始想着是否应该一试,通过和张善友大哥的沟通抱着试一试的忐忑结果意外惊喜通过了,由于每月申 ...
- poj3067 Japan 树状数组求逆序对
题目链接:http://poj.org/problem?id=3067 题目就是让我们求连线后交点的个数 很容易想到将左端点从小到大排序,如果左端点相同则右端点从小到大排序 那么答案即为逆序对的个数 ...