热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

CUDAFortran环境的搭建和第一个CUDAFortran程序

目录CUDAFortran环境的搭建和第一个CUDAFortran程序前言背景什么是CUDA编译器CUDAFortran环境的搭建确定设备环境CUDAToolkitHPC_SDK第

目录



  • CUDA Fortran环境的搭建和第一个CUDA Fortran程序

    • 前言

    • 背景

      • 什么是CUDA

      • 编译器



    • CUDA Fortran环境的搭建

      • 确定设备环境

      • CUDA Toolkit

      • HPC_SDK



    • 第一个CUDA Fortran程序

      • hello world






CUDA Fortran环境的搭建和第一个CUDA Fortran程序

前言

工作中需要用到CUDA Fortran对原有的Fortran程序做并行化,那么第一步就是要完成环境的搭建,总体来说过程并不是特别繁琐,但初次安装还是会遇到一些问题,因而在此概要性地做一下总结和整理.


背景


什么是CUDA

CUDA(Comute Unified Device Architecture),统一计算架构,是由NVIDIA公司所推出的一种结合CPU与GPU进行计算的架构.CUDA给程序开发人员提供直接访问CUDA GPU中虚拟指令集和存储器的接口.利用CUDA,GPU可以实现通用处理,而不仅仅是图形,这种方法被称为GPGPU(General-Purpose Graphic Processing Unit),与CPU不同的是,GPU侧重以较慢的速度执行大量并发的线程,而非快速执行单一线程,因而CUDA近些年来在并行计算中大放异彩.


详细内容请阅:

https://zh.wikipedia.org/wiki/CUDA



编译器

一开始NVIDIA官方只提供了CUDA C/C++ 的接口和编译器,因此可以很方便地将C/C++代码移植到GPU上,但对于科学与工程即使算中的重要编程语言Fortran,无法直接改写为CUDA C/C++,为了使Fortran应用能够使用GPU进行加速,与NVIDIA公司合作的PGI(The Portland Group)小组设计了CUDA Fortran语言,并在自家的PGI Fortran编译器中支持了CUDA Fortran程序的编译.直到2013年,NVIDIA收购了PGI,并在2020年将PGI Fortran编译器整合到了NVIDIA官方推出的HPC_SDK中,其编译器名称也有了统一的命名.

现在CUDA架构中常见的编译器有:



  • nvc: 可以编译CUDA C程序

  • nvc++: 可以编译CUDA C++程序

  • nvfortran: 可以编译CUDA Fortran程序

  • nvcc: 可以编译CUDA C/C++程序


CUDA Fortran环境的搭建


确定设备环境

截至目前,CUDA Fortran尚且不支持Windows,因此以下所有内容均基于Linux操作系统进行:

操作系统

首先用cat /etc/os-release的方式来查看操作系统的版本并记录下来,后面会用到,我这里用的是ubuntu 20.04.

查找可用GPU

lspci | grep -i nvidia来查找是否有可用的NVIDIA GPU,AMD的显卡是无法安装CUDA环境的.


CUDA Toolkit

当完成第一步的准备工作后,我们就可以开始安装CUDA环境了,CUDA Toolkit是一个整合了CUDA C/C++编译器,cuda-gdb调试器,nvprof性能监测工具,NVIDIA显卡闭源驱动,各种库文件的一个集成工具包.因此我们无需从安装驱动开始,而是直接安装CUDA Toolkit.

首先我们需要访问CUDA Toolkit下载页面,然后逐层选择适配自己设备环境的安装方式.我的环境所选内容如下图:

image

需要注意的是此页面是目前最新版的CUDA Toolkit下载页面,如果你所用的发行版没有被支持,可以寻找更早的CUDA Toolkit release版本.

选择完成后,按照其下方给出的 installation instructions 进行安装即可.

安装过程中只需要按照提示进行一些简单的操作即可,但需要注意的是,安装过程最好在非图形化界面下进行,否则可能会引发一些不必要的错误,图形界面用户可以用sudo init 3的方式进入纯命令行界面进行安装.另外,有些发行版中可能会默认安装了NVIDIA开源版本的显卡驱动nouveau,在安装前需要将其禁用,比较新的CUDA Toolkit会自行将其禁用而不需要我们手动进行,但若是安装一些比较古早的版本时,可能需要手动进行这一操作.

等待一段时间,当你安装完成后,屏幕上会给出提示,让你将bin包和库文件添加到环境变量中.选择你喜欢的编辑器编辑/home/'username'/.bashrc文件,(用你的用户名替换'username'),在文件的末尾加上以下内容:

image

如果你安装的不是CUDA 11.7,那么你需要进入/usr/local目录中,查看相应的cuda目录名,并将与第一行中的cuda-11.7进行替换.

完成之后source /home/'username'/.bashrc或者重新打开一个shell进行一些测试.



  1. 检测驱动

    nvidia-smi命令来检测驱动是否存在.若存在,会显示出详细的显卡信息,如下图:

    image



  2. 编译器检查

    在安装完CUDA Toolkit之后,事实上我们已经可以进行CUDA C/C++的 开发了,我们可以输入nvcc --version命令来检查CUDA C/C++编译器的版本,或者用which nvcc来查看PATH中是否能找到nvcc编译器.然后我们可以简单地编写一个CUDA C程序cudahello.cu来验证编译器是否能够正常运行,注意文件名需要命名为.cu后缀,否则需要在编译时添加编译选项告诉编译器这是一个cuda程序,否则会在链接时因为找不到运行时库而报错:



#include
#include
__global__ void cuda_hello()
{
printf("hello world from GPU!\n");
}
int main()
{
cuda_hello<<<1,10>>>();
cudaDeviceReset();

return 0;
}

退出编辑器后输入nvcc cudahello.cu -o cudahello.out,观察是否能够编译成功.若成功,再./cudahello.out查看运行结果是否正确,若没有错误的话,会输出10条' hello world from GPU!'



  1. 检查调试器和性能监视器是否存在

    which cuda-gdb或者cuda-gdb --version来查看调试器是否存在, which nvprof或者nvprof --version查看性能监测工具是否存在.

若以上步骤都没有什么问题,那么我们就可以进行到下一步,进行CUDA Fortran的环境安装了.


HPC_SDK

首先需要根据你所安装的CUDA版本选择合适的HPC_SDK,然后在下载页面按照它的installation instruction进行安装.另外还有一些预先的准备事项和安装完成后配置环境变量等工作,其流程在官方安装指导中给出了详细的描述.按照官方文档中的方式进行安装.安装完成后,此时若是用which nvfortran命令会发现无法找到nvfortran编译器.是因为需要加载module文件.如果没有修改安装路径,那么sdk默认会安装到/opt/nvidia/hpc_sdk目录下,modulefile文件位于/opt/nvidia/hpc_sdk/modulefiles/nvhpc目录下,其中会有一个以你所安装的sdk版本命名的modulefile,我这里是22.5,然后需要module load ./22.5,这时再用which nvfortran发现已经可以找到nvfortran编译器了.

当然这样会存在一些麻烦,因为这样每次打开一个新的终端窗口,都需要重新输入这一长串的路径来加载module,为方便期间,我们可以给在usr/share/modules/modulefiles目录下给我们刚刚安装的module文件创建一个软链接文件,命令为:

sudo ln -s /opt/nvidia/hpc_sdk/modulefiles/nvhpc/22.5 /usr/share/modules/modulefiles/name

其中22.5需要根据你所安装的版本进行替换,最后的name则可以按照你的想法自定义一个名字.

完成以上的步骤后,我们可以用module avail查看可用的module,你所定义的name也会出现在列表中,此时我们可以直接module load name,就可以完成module的加载,而不用输入之前的一长串路径.

检查

完成以上步骤后,分别用nvfortran --versionman nvforrtran进行测试,若能够正确显示其版本及手册,说明配置无误.若不能,或者仅手册不能,则说明环境变量没有配置好,可以详读官方安装指导进行配置.若没有问题,则进入/opt/nvidia/hpc_sdk/Linux_x86_64/22.5/examples/CUDA-Fortran中,将SDK目录复制到你的家目录下.然后make,若结果显示为:

image

则说明环境没有问题,配置完成!


第一个CUDA Fortran程序


hello world

当我们搭建好环境,就需要写一个程序来测试一下功能了,新建一个hello.cuf文件,同样要注意后缀名,若后缀名不是.cuf,则需要在编译选项中指定.在文件中添加一个简单的hello world代码块:

module hello_m
contains
attributes(global) subroutine hello()
implicit none

print*, 'hello world from GPU!'

end subroutine hello
end module hello_m
program main
use cudafor
use hello_m
implicit none

integer :: ierr
call hello<<<1,10>>>()
ierr = cudaDeviceReset()

end program main

然后进行编译:

nvfortran hello.cuf -o hello.out

然后./hello.out执行一下,若执行结果能正确显示十个hello world from GPU!,则说明没有问题,CPU和GPU之间可以正常通信.

以上



推荐阅读
  • 本文深入探讨了 Java 编程语言的基础,特别是其跨平台特性和 JVM 的工作原理。通过介绍 Java 的发展历史和生态系统,帮助初学者理解如何编写并运行第一个 Java 程序。 ... [详细]
  • 本文详细介绍了如何准备和安装 Eclipse 开发环境及其相关插件,包括 JDK、Tomcat、Struts 等组件的安装步骤及配置方法。 ... [详细]
  • 本文探讨了 C++ 中普通数组和标准库类型 vector 的初始化方法。普通数组具有固定长度,而 vector 是一种可扩展的容器,允许动态调整大小。文章详细介绍了不同初始化方式及其应用场景,并提供了代码示例以加深理解。 ... [详细]
  • 本文详细探讨了如何通过分析单个或多个线程在瓶颈情况下的表现,来了解处理器资源的消耗。无论是单进程还是多进程环境,监控关键指标如线程数量、占用时间及调度优先级等,有助于揭示潜在的性能问题。 ... [详细]
  • 为了解决不同服务器间共享图片的需求,我们最初考虑建立一个FTP图片服务器。然而,考虑到项目是一个简单的CMS系统,为了简化流程,团队决定探索七牛云存储的解决方案。本文将详细介绍使用七牛云存储的过程和心得。 ... [详细]
  • 本文介绍如何在Vue项目中配置Webpack,使JS代码作为入口文件直接嵌入到HTML中,而不是传统的HTML作为入口。 ... [详细]
  • 主调|大侠_重温C++ ... [详细]
  • 本文详细介绍如何使用 Python 集成微信支付的三种主要方式:Native 支付、APP 支付和 JSAPI 支付。每种方式适用于不同的应用场景,如 PC 网站、移动端应用和公众号内支付等。 ... [详细]
  • 本文探讨了在iOS平台上开发BLE(蓝牙低功耗)应用程序时遇到的挑战,特别是如何实现应用在后台模式下仍能持续扫描并连接蓝牙设备。文章提供了具体的配置方法和常见的问题解决方案。 ... [详细]
  • 本文旨在回顾并总结近期学习的.NET Core基础知识,通过具体的操作指南加深理解,并为初学者提供实用建议,避免常见的错误和陷阱。内容涵盖CentOS的安装配置、.NET Core环境搭建及网站部署等。 ... [详细]
  • 本文针对初学者在创建Android项目时遇到的R.java文件错误提供了解决方案,通过实际案例和详细的日志分析,帮助读者快速定位并解决问题。 ... [详细]
  • 本文探讨了在iOS项目中导入MKNetworkKit库时遇到的常见问题及其解决方案。 ... [详细]
  • Android Studio 中 Gradle 使用的常见问题与解决方案
    本文探讨了在使用 Android Studio 进行开发时,遇到的与 Gradle 相关的问题,包括每次打开项目都需要下载 Gradle 和 Gradle 插件依赖包下载失败或卡顿等问题,并提供了详细的解决方法。 ... [详细]
  • 本文详细介绍了如何在Python3环境中配置Appium1.4.6,并指导如何连接模拟器进行自动化测试。通过本文,您将了解从环境搭建到模拟器连接的完整流程。 ... [详细]
  • 在使用高德地图内置导航功能时遇到AMapNavi组件出现空指针异常,经过多次排查发现问题是由于so库的兼容性引起的。本文将详细介绍如何通过调整项目配置来解决这一问题。 ... [详细]
author-avatar
保佑麻木_711
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有