[教程] fortran循环如何快速使用CUDA

简介:
fortran中成为性能瓶颈的很多时候是OpenMP,而在OpenMP中多重循环最容易成为性能瓶颈,在不考虑更深层次的优化的时候,如何快速的将多重循环移植到GPU上呢?  使用CUDA FORTRAN快速的实现Fortran的循环移植遵循三步:
  第一步,设计CUDA线程结构
  线程结构的设计一般采用映射的办法,将各层循环分别映射到CUDA的线程维度上。由于block的维度为3维,grid维度为3维,因此最多可以表示成9维对应9重循环(实际中一般遇不到这么深的循环),但是block的维度比较小,万一不够呢?所以我们这里只讨论最多三维的情况(维度过多可以考虑循环合并,这里不展开)。再说block的设计,block在CUDA中意味着block内的通信和同步,这就需要对程序背后的算法的深入理解,不理解算法的话就不好掌控block,这篇文章讨论的是快速移植,那些需要根据算法设计block的就不在讨论之类了。那block该多大呢?我推荐128或者256,这个尺寸的block是最能发挥线程级别并行的,设计的过大,一个SMX上的最大线程数固定,不容易接近最大的线程数,设计的过小,一个SMX上的block数也是有限制的,也容易使得SMX上的线程不够多。128或者256也是经验数字,老一辈高人传授的,说这个好
  有了block的大小,接下来怎么设计线程的维度呢?比如说,我有二层循环,那我就分别把第一层、第二层分别对应CUDA线程的x维度、y维度。拿第一层和x维度举例,假如我的第一层循环的次数为4096,而我的block的维度为16*16=256,也就是说我的block在x维度上的大小为16,所以我需要的设计grid在x维度上的大小为4096/16,假如这个时候不是4096,而是什么4095呢,不能整除的话那就取大于该除法结果的最大整数了。同样的可以设计出y维度和z维度。那总的grid的大小就有两种算法了,第一用算出来的它的x维度*它的y维度,第二就是直接把各层循环的乘积/block的大小,这两个得到的结果其实是一样的。
  第二步,分配线程任务
  线程设计好了,那哪个线程干哪条活呢?在多重循环中,我们一般用控制循环的变量i,j,k在循环体内控制任务的执行,在CUDA里面,我们依然保留这三个变量用来给线程分配任务。比如说,i,j,k分别对于第一,二,三重循环,在kernel里面,i要等于线程在x维度的绝对维度,即i = (blockIdx%x-1)*blockDim%x + threadIdx%x,j要等于线程在y维度上的绝对维度,即j = (blockIdx%y-1)*blockDim%y + threadIdx%y,同样的k可以等线程在z维度上的绝对维度,这样在其他部分代码不变(甚至连后面的i,j,k都不用变)的情况下,完成了任务的重新分配。
  第三步,控制线程边界
  循环的步数总不可能刚刚除的“干净”,那些超了边的线程就让他歇着不干活,在上面的grid设计中有时候不能整除,所以我们要“修边”,就是用一个if语句表示该线程是否干活,只有满足条件的(即那些i,j,k比对于的循环次数小的)才去干活。

  综合上面三步,基本上就完成了一个“粗糙”的移植了。至于效果,本人亲自试验过,还是不错的,只要数据的并行度高的话,基本上和精确优化差的不是太多。

原文发布时间为:2017-4-8 18:44:06
原文由:LGZ 发布,版权归属于原作者 
本文来自云栖社区合作伙伴NVIDIA,了解相关信息可以关注NVIDIA官方网站
目录
相关文章
|
机器学习/深度学习 人工智能 监控
AI威胁检测与识别
AI在网络安全中扮演关键角色,实现实时监控、异常检测、高级威胁识别和自动化响应。通过机器学习和深度学习,AI能分析大量数据,预测攻击,智能支持决策,并评估风险。然而,随着攻击手段进化,AI系统的抗攻击性研究和持续升级至关重要。
572 2
|
5月前
|
存储 关系型数据库 BI
如何开发ERP系统中的财务管理板块(附架构图+流程图+代码参考)
本文深入解析ERP系统中财务管理模块的设计与实现,涵盖核心功能、业务流程、开发技巧及代码示例,助力企业打造高效、智能的财务管理系统。
|
4月前
|
算法 数据挖掘 API
《拼多多 API 助力,拼多多店铺商品好评率快速提升》
本文介绍如何利用拼多多开放平台API自动化管理商品评论,提升店铺好评率。通过获取评论数据、自动回复差评、数据分析与批量操作,商家可高效优化好评率,提升店铺曝光与转化。内容涵盖API使用步骤、优势及注意事项,助力商家实现数据驱动的精准运营,提升顾客满意度。
275 0
|
10月前
|
数据采集 JSON 监控
速卖通商品列表接口(以 AliExpress Affiliate 商品查询 API 为例)
以下是使用 Python 调用速卖通商品列表接口(以 AliExpress Affiliate 商品查询 API 为例)的代码示例。该示例包含准备基础参数、生成签名、发送请求和处理响应等关键步骤,并附有详细注释说明。代码展示了如何通过公共参数和业务参数构建请求,使用 HMAC-SHA256 加密生成签名,确保请求的安全性。最后,解析 JSON 响应并输出商品信息。此接口适用于商品监控、数据采集与分析及商品推荐等场景。注意需通过 OAuth2.0 获取 `access_token`,并根据官方文档调整参数和频率限制。
|
9月前
|
传感器 人工智能 监控
反向寻车系统怎么做?基本原理与系统组成解析
本文通过反向寻车系统的核心组成部分与技术分析,阐述反向寻车系统的工作原理,适用于适用于商场停车场、医院停车场及火车站停车场等。如需获取智慧停车场反向寻车技术方案前往文章最下方获取,如有项目合作及技术交流欢迎私信作者。
635 2
|
缓存 JavaScript 前端开发
vue中使用keep-alive的问题
vue中使用keep-alive的问题
444 59
|
Kubernetes 容器 Perl
Kubernetes网络插件体系及flannel基础
文章主要介绍了Kubernetes网络插件体系,特别是flannel网络模型的工作原理、配置和测试方法。
351 3
Kubernetes网络插件体系及flannel基础
|
JSON API 数据格式
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(2)
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(2)
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(2)
|
关系型数据库 MySQL Java
译 | Off-CPU Flame Graphs
译 | Off-CPU Flame Graphs
446 0