[教程] 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系统的抗攻击性研究和持续升级至关重要。
419 2
|
存储 缓存 弹性计算
2024年阿里云最便宜云服务器出炉:61元、165元、99元、199元
2024年截止目前阿里云最便宜的云服务器已经出炉,轻量应用服务器2核2G3M带宽61元1年、2核4G4M带宽165元1年;云服务器经济型e实例2核2G3M带宽99元1年;云服务器通用算力型u1实例2核4G5M带宽199元1年。除此之外,还有幻兽帕鲁Palworld专用服务器4核16G10M带宽只要26.52元/1个月、79.56元/3个月、149.00元/6个月,8核32G10M带宽只要90.60元/1个月、271.80元/3个月。本文为大家分享2024年阿里云最便宜的各个云服务器。
8298 4
2024年阿里云最便宜云服务器出炉:61元、165元、99元、199元
|
数据中心
Zerotier常用命令整理
Zerotier一款可以让您随时随地轻松连接云,移动,桌面和数据中心资源的工具。通过Zerotier可以轻松地将你的多台设备建立局域网,互联互通。本文主要整理Zerotier在日常使用中的命令,以备日常使用查询。
19201 1
Zerotier常用命令整理
|
7月前
|
数据采集 JSON 监控
速卖通商品列表接口(以 AliExpress Affiliate 商品查询 API 为例)
以下是使用 Python 调用速卖通商品列表接口(以 AliExpress Affiliate 商品查询 API 为例)的代码示例。该示例包含准备基础参数、生成签名、发送请求和处理响应等关键步骤,并附有详细注释说明。代码展示了如何通过公共参数和业务参数构建请求,使用 HMAC-SHA256 加密生成签名,确保请求的安全性。最后,解析 JSON 响应并输出商品信息。此接口适用于商品监控、数据采集与分析及商品推荐等场景。注意需通过 OAuth2.0 获取 `access_token`,并根据官方文档调整参数和频率限制。
|
12月前
|
缓存 JavaScript 前端开发
vue中使用keep-alive的问题
vue中使用keep-alive的问题
366 59
|
监控 项目管理
软件项目管理:从计划到成功的实践
【8月更文第20天】在快速变化的IT行业中,高效的软件项目管理是确保项目成功的关键。本文将探讨软件项目管理中的几个核心领域:项目计划与估算、风险管理、人员配置与团队建设以及进度控制与成本管理,并通过具体案例加以说明。
1011 2
|
机器学习/深度学习 存储 人工智能
【ACL2024】阿里云人工智能平台PAI多篇论文入选ACL2024
近期,阿里云人工智能平台PAI的多篇论文在ACL2024上入选。论文成果是阿里云与阿里集团安全部、华南理工大学金连文教授团队、华东师范大学何晓丰教授团队共同研发。ACL(国际计算语言学年会)是人工智能自然语言处理领域的顶级国际会议,聚焦于自然语言处理技术在各个应用场景的学术研究。该会议曾推动了预训练语言模型、文本挖掘、对话系统、机器翻译等自然语言处理领域的核心创新,在学术和工业界都有巨大的影响力。此次入选标志着阿里云人工智能平台PAI在自然语言处理和多模态算法、算法框架能力方面研究获得了学术界认可。
|
Rust JavaScript
Zed——Eslint配置支持Vue
Zed——Eslint配置支持Vue
186 0
|
算法 C# 数据安全/隐私保护
|
机器学习/深度学习 JSON Kubernetes
一篇文章讲明白k8s网络插件flannel模式剖析:vxlan、host
一篇文章讲明白k8s网络插件flannel模式剖析:vxlan、host
626 0