gpu的架构分为streaming multiprocessors

每个streaming multiprocessors(SM)又能分步骤执行很多threads,单个SM内部能同时执行的threads叫做warp。一个warp能同时操作16个单精度浮点数/8个双精度(tesla),或者32个单精度浮点数/16个双精度浮点数(feimi)。

单个SM内部有local memory和16kb大小的share memory,后者是在做计算的时候要尽量利用好的东西。

根据gpu的架构,做cuda计算的时候基本上是这么一个流程

先把目标矩阵分块,8*8或者16*16等,具体多大要看所用gpu的配置

分块完以后,gpu会把每个块调度到每个SM上去执行。SM执行的时候按照warp大小起线程,直到运算完成。

资源限制:

每个GPU必须有16个以上的block(对应16个SM)。而每个SM最多只能有8个block(对应8个flag位)。

算法举例

拿矩阵乘法C=A*B举例,

在不使用share memory的时候,每计算C中的一个值就需要2*N*N的数值。所以不使用BLOCK算法的时候,一个N*N的矩阵算一次就需要读2*N^4的数据,起了N^2的threads。每次要读2*N的数,这个操作数就是2N。带宽显然不够。这是非常慢的。在使用share memory的时候,每计算BLOCK_SIZE*BLOCK_SIZE中的值就需要读2*BLOCK_SIZE*BLOCK_SIZE的数据,当BLOCK_SIZE是16的时候,那就是2k,16kb的share memory能允许8个block。

当BLOCK_SIZE是32的时候,大小是8k,就是2个block。

那回顾一下刚才的数据,我们能知道,大小是32*32的block在16kbshare memory的时候对SM的利用率不高,(只能放2个block),而大小是16*16的block在16kb sharememory的时候对SM的利用率高(到了8个block,到顶了)。

为什么不用2个block而是8个block呢?

因为在从local memory读到share memory的是要时间的,gpu可以在这一个warp读取share memory的时候切换到别的warp 让他们也读share memory。还记得吗?一个warp是16个线程,SM能同时保存8个BLOCK的状态。对于32*32这个大小的block,对于SM的调度没有利用好,所有线程全都卡在读取内存上了。

对于16*16的block,每次要读2*256=512个数,这256个数的操作是256*16*2=8192个浮点操作。这时带宽就足够了。

对于feimi架构来说,share memory翻了3倍成了48kb

BLOCK_SIZE等于16的时候,就是24个block,BLOCK_SIZE=32的时候就是6个block。gpu读取share memory大概要20个cycle。一个32*32的block有1024个线程,一个warp 32个线程。这样就至少32个cycle过去了,足够前面的线程读完。

而对于BLOCK_SIZE等于16的时候,24个block对于一个SM来说太多了(同时只能调度8个).

ps:

在调试矩阵乘法的时候掉进坑里了……给每个矩阵赋值10.0*i+j,两个矩阵互相乘。当矩阵比较小的时候100*100及以下,一点问题都没有。大到1000*1000的开始出现计算错误。找了大半天都没找出个所以然来。突然发现结果比较长,一数位数,都快7-8位了,原来是过了单精度浮点数的有效位数了。

cuda计算的分块的更多相关文章

  1. CUDA计算矩阵相乘

    1.最简单的 kernel 函数 __global__ void MatrixMulKernel( float* Md, float* Nd, float* Pd, int Width) { int ...

  2. CUDA 计算线程索引的一般公式

    CUDA thread index: int blockId = blockIdx.z * (gridDim.x*gridDim.y)                    + blockIdx.y ...

  3. BZOJ 4765 普通计算姬 (分块 + BIT)

    4765: 普通计算姬 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 1547  Solved: 329[Submit][Status][Discus ...

  4. [BZOJ4765]普通计算姬(分块+树状数组)

    4765: 普通计算姬 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 1725  Solved: 376[Submit][Status][Discus ...

  5. [bzoj4765]普通计算姬——分块

    Brief Description 给定一棵n个节点的带权树,节点编号为1到n,以root为根,设sum[p]表示以点p为根的这棵子树中所有节点的权 值和.支持下列两种操作: 1 给定两个整数u,v, ...

  6. CUDA 计算pi (π)

    通过简单的程序设计熟练CUDA的使用步骤 下面是cuda代码及相关注释 #include <stdio.h> #include <iostream> #include < ...

  7. BZOJ 4765: 普通计算姬 [分块 树状数组 DFS序]

    传送门 题意: 一棵树,支持单点修改和询问以$[l,r]$为根的子树的权值和的和 只有我这种不会分块的沙茶不会做这道题吗? 说一点总结: 子树和当然上$dfs$序了,询问原序列一段区间所有子树和,对原 ...

  8. BZOJ 4765: 普通计算姬 (分块+树状数组)

    传送门 解题思路 树上的分块题,,对于修改操作,每次修改只会对他父亲到根这条链上的元素有影响:对于查询操作,每次查询[l,r]内所有元素的子树,所以就考虑dfn序,进标记一次,出标记一次,然后子树就是 ...

  9. CUDA C Best Practices Guide 在线教程学习笔记 Part 1

    0. APOD过程 ● 评估.分析代码运行时间的组成,对瓶颈进行并行化设计.了解需求和约束条件,确定应用程序的加速性能改善的上限. ● 并行化.根据原来的代码,采用一些手段进行并行化,例如使用现有库, ...

随机推荐

  1. 简易购物车 --day2

    代码段 f =float(input('输入你的工资')) goods=['1.apple','2.mac','3.ph','4.python','5.php'] price=[35,26.5,14, ...

  2. 清除WKWebView的缓存

    OC写法: swift写法再下下面. 清除WKWebView的缓存,让H5页面一刷新就更新至最新的页面 要区分iOS9.0和8.0两种 - (void)deleteWebCache { if ([[U ...

  3. XE3随笔15:从XML中解析

    SuperObject 文件包中还有一个 SuperXmlParser 单元, 可以从 XML 中解析出 ISuperObject. SuperXmlParser 只有三个函数: XMLParseSt ...

  4. svn安装与其服务器搭建

    1.概述:SVN为程序开发团队常用的代码管理,版本控制软件. 2.工具: 1) TortoiseSVN-1.8.4.24972-win32-svn-1.8.5.msi  SVN安装包. 2)setup ...

  5. MySQLdb操作mysql的blob值

    一般情况下我们是把图片存储在文件系统中,而只在数据库中存储文件路径的,但是有时候也会有特殊的需求:把图片二进制存入数据库. 今天我们采用的是python+mysql的方式 MYSQL 是支持把图片存入 ...

  6. vim 查看文件二进制格式

    用vim打开文件,vim -b file,选项-b是二进制模式打开   然后输入 :%!xxd,就可看到二进制编码     其实在linux下,直接输入xxd file 也是可以看到的文件二进制格式的

  7. maven 三个基本插件 clean dependency compiler

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  8. oracle创建用户并导入dmp文件

    SQL命令行执行以下命令:SQL> conn sys/111111 as sysdba; SQL> CREATE USER TEST11 IDENTIFIED BY "11111 ...

  9. 【Java学习笔记】其他对象API

    System类 package p1; import java.util.Properties; import java.util.Set; public class SystemDemo { pri ...

  10. OD使用教程12

    载入程序输入关键字: 双击进入程序 仔细看发现并没有跳转直接跳到这个mov,往上看发现retn上面有一个push,在这种编写手法当中这种组合相当于一个jmp, 跳到离它最近的一个值(在这就是004A5 ...