- 1、本文档共109页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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
您可能关注的文档
最近下载
- 石油化工产学研合作与创新体系建设进展.pptx
- 心理课:生涯决策力提升-《生涯决策力提升》.pptx
- (完整)婚介登记表.doc
- 浙江省宁波市区县社区街道乡镇村名称统计.pdf
- 法雷奥供应商手册supplierqualitymanual2104rev09资料.pdf
- 2023年汕头市潮阳区卫健系统招聘医学类专业技术人员笔试真题.docx VIP
- 2024年义务教育化学课程标准2022年版(多选题)考试专项题库及答案.docx
- 海阳市各级文物保护单位一览表(2024版).docx VIP
- 2025届高考英语模拟卷(新高考Ⅰ卷)两套(word版有答案).docx
- 2025年建设美丽乡村示范村实施方案.pdf VIP
文档评论(0)