网站大量收购独家精品文档,联系QQ:2885784924
  1. 1、本文档共109页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
GPU_Computing

Nd Md Pd WIDTH WIDTH WIDTH WIDTH 内核函数 Cont. //每个线程计算一个元素 for (int k = 0; k Width; ++k) { float Melement = Md[ty * Width + k]; float Nelement = Nd[k * Width + tx]; Pvalue += Melement * Nelement; } // 将计算结果写入设备存储器中 Pd[ty * Width + tx] = Pvalue; } ty tx ty tx k k 2.1.4 只使用了一个线程块 一个线程块中的每个线程计算Pd中的一个元素 每个线程 载入矩阵Md中的一行 载入矩阵Nd中的一列 为每对Md和Nd元素执行了一次乘法和加法 缺点: 计算和片外存储器存访问比例接近1:1,受存储器延迟影响很大; 矩阵的大小受到线程块所能容纳最大线程数(512个线程)的限制 Grid 1 Block 1 48 Thread (2, 2) WIDTH Md Pd Nd 2.1.5 处理任意大小的方形矩阵 让每个线程块计算结果矩阵中的一个大小为(TILE_WIDTH)2的子矩阵 每个线程块中有 (TILE_WIDTH)2 个线程 总共有(WIDTH/TILE_WIDTH)2 个线程块 Md Nd Pd WIDTH WIDTH WIDTH WIDTH ty tx by bx 需要注意的是:当WIDTH/TILE_WIDTH大于最大的网格数量(64K)时,需要在内核函数附近设置一个循环! TILE_WIDTH * Grid Global Memory Block (0, 0) Shared Memory Thread (0, 0) Registers Thread (1, 0) Registers Block (1, 0) Shared Memory Thread (0, 0) Registers Thread (1, 0) Registers Host Constant Memory 2.1.6 G80显卡的存储器瓶颈 所有的线程都要访问全局存储器获取输入矩阵元素 每一次的单精度浮点乘法和加法需要两次的内存访问 (8 bytes) 全局存储器的访问带宽为86.4 GB/s 每秒钟可以读取21.6G个浮点数 每秒钟最多可以完成21.6GFlops G80显卡的峰值速度为346.5GFlops 效率仅为6% 全局存储器成为计算瓶颈 要充分使用高带宽的片上局部存储器 Part Ⅴ Example: Matrix Multiplication 1. 串行的矩阵乘法在CPU上的实现 2. 并行的矩阵乘法在GPU上的实现 2.1. 没有使用shared memory的实现 2.2 使用了shared memory的实现 M * 2.2.1 使用共享存储器以便重用 全局存储器中的数据 每个输入元素都需要被WIDTH个线程读取 将每个元素都装载到共享存储器中,让很多线程都使用本地数据以便减少存储带宽 使用分片算法 N P WIDTH WIDTH WIDTH WIDTH ty tx * Md Nd Pd Pdsub TILE_WIDTH WIDTH WIDTH TILE_WIDTH TILE_WIDTH bx tx 0 1 TILE_WIDTH-1 2 0 1 2 by ty 2 1 0 TILE_WIDTH-1 2 1 0 TILE_WIDTH TILE_WIDTH TILE_WIDTHE WIDTH WIDTH 2.2.2 将矩阵进行分块 每个线程块计算一个大小为TILE_WIDTH的方形子矩阵Pdsub 每个线程计算Pdsub子矩阵中的一个元素 假设Md和Nd的大小都是TILE_WIDTH 的倍数 2.2.3 G80中首先需要考虑的事项 每个线程块内应该有较多的线程 TILE_WIDTH=16时有 16*16 = 256 个线程 分解为若干个线程块 一个1024*1024大小的Pd矩阵有64*64 = 4096 个线程块 每个线程块从全局存储器将矩阵M和N的一小块读入到共享存储器中,然后完成计算 从全局存储器中读出2*256 = 512个单精度浮点数; 完成 256 * (2*16) = 8,192 次浮点计算操作; 浮点操作:全局存储器读出操作=16: 1 全局存储器不再是性能瓶颈! * 2.2.4 内核函数线程数配置 //每个线程块有TILE_WIDTH2个线程 dim3 dimBlock(TI

文档评论(0)

cj80011 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档