【fortran】开源BLAS库矩阵乘法的简单Fortran示例

一、安装开源BLAS库OpenBLAS

安装 OpenBLAS 可以通过几个步骤来完成,这些步骤因操作系统的不同而有所变化。以下是为几种常见系统下的安装。

在 Ubuntu/Debian Linux 上安装 OpenBLAS

在基于 Debian 的系统(如 Ubuntu)上,可以使用 apt-get 来安装 OpenBLAS:

sudo apt-get update
sudo apt-get install libopenblas-dev

这将安装 OpenBLAS 库及其开发文件,允许编译和运行 OpenBLAS 的程序。

在 Fedora/Red Hat Linux 上安装 OpenBLAS

在 Fedora 或基于 RHEL 的系统上,可以使用 dnf 或 yum 来安装 OpenBLAS:

sudo dnf install openblas-devel

或者

sudo yum install openblas-devel

在 macOS 上安装 OpenBLAS

在 macOS 上,可以使用 Homebrew 来安装 OpenBLAS:

brew install openblas

Homebrew 会自动处理安装过程和路径设置。

在 Windows 上安装 OpenBLAS

在 Windows 上,可以从 OpenBLAS 的官方网站下载预编译的二进制文件。需要下载与系统架构相对应的版本(32位或64位),并按照提供的说明解压缩和设置环境变量。

打开 OpenBLAS : An optimized BLAS library 并跟随下载链接。

二、进行矩阵乘法的简单Fortran示例

确保已经安装了OpenBLAS。

program matrix_multiplyimplicit noneinteger :: i, jexternal :: dgemminteger, parameter :: n = 3double precision :: alpha, betadouble precision :: A(n, n), B(n, n), C(n, n)! Initialize matrices A and B with some valuesA = reshape((/1.0d0, 2.0d0, 3.0d0, &4.0d0, 5.0d0, 6.0d0, &7.0d0, 8.0d0, 9.0d0 /), shape(A))B = reshape((/9.0d0, 8.0d0, 7.0d0, &6.0d0, 5.0d0, 4.0d0, &3.0d0, 2.0d0, 1.0d0 /), shape(B))! Initialize matrix C to zeroC = 0.0d0! Coefficients for the matrix multiplication (typical values are 1.0 for both)alpha = 1.0d0beta = 0.0d0! Perform matrix multiplication C = alpha * A * B + beta * C! dgemm parameters: (transa, transb, m, n, k, alpha, A, lda, B, ldb, beta, C, ldc)call dgemm('N', 'N', n, n, n, alpha, A, n, B, n, beta, C, n)! Output the resultprint *, 'Matrix C after multiplication:'do i = 1, nprint *, (C(i, j), j = 1, n)end do
end program matrix_multiply

这个示例程序是一个使用 Fortran 语言编写的矩阵乘法程序。该程序演示了如何使用 dgemm 子程序来计算两个矩阵 A 和 B 的乘积,并将其存储在矩阵 C 中。`dgemm` 是 BLAS (Basic Linear Algebra Subprograms) 库中的一个例程,用于双精度实数矩阵的通用矩阵乘法。以下是程序中各部分的详细说明。
程序开头定义了一些变量:
- implicit none 强制所有变量必须显式声明,以防止隐式类型声明导致的错误。
- integer :: i, j 声明了变量`i`和`j`用于后续的循环。
- external :: dgemm 指出 dgemm 是一个外部过程(在 BLAS 库中定义,矩阵乘法函数)。
- integer, parameter :: n = 3 定义了一个名为 n 的参数(常数)并将其设置为 3,表示矩阵的行数和列数,矩阵的大小(这里是3x3矩阵)。
- double precision 定义了一些双精度实数变量。其中 alpha 和 beta 是矩阵乘法中用到的标量,`A(n, n)`, B(n, n), C(n, n) 是三个 n x n 矩阵。
- double precision :: alpha, beta 声明了`alpha`和`beta`作为`dgemm`操作的标量参数。
- double precision :: alpha, betadouble precision :: A(n, n), B(n, n), C(n, n) 声明了三个双精度矩阵`A`、`B`和`C`。。
程序下一部分初始化矩阵 A 和 B 的值:
- 使用 reshape 与 / 运算符结合数组元素,将一维数组变换为矩阵 A 和 B 的二维形状。
矩阵 C 被初始化为零矩阵:
- 矩阵 C 被设置为双精度 0.0d0,后续的矩阵乘法将要把结果存入这个矩阵。
变量 alpha 和 beta 被设置成乘法的系数:
- 这些常数通常设置为 1 和 0。`alpha = 1.0d0` 表示 不改变`A`和`B`相乘的结果,A 和 B 的乘积将直接存储在 C 中,`beta = 0.0d0` 意味着原始的`C`矩阵不会对结果产生影响。
调用 dgemm 进行矩阵乘法。`dgemm`函数的参数如下:
    - 'N'和`'N'`: 表示不对A或B进行转置操作。
    - n, n, n: 分别表示矩阵A的行数,矩阵B的列数和共同的维度(A的列数和B的行数,这里A和B都是3x3矩阵)。
    - alpha: 标量乘子。
    - A, n: 矩阵A及其前导维度(行数)。
    - B, n: 矩阵B及其前导维度(行数)。
    - beta: 另一个标量乘子。
    - C, n: 结果矩阵C及其前导维度(行数)。
程序最后部分打印乘法结果:
- 使用循环遍历矩阵 C 的每一行并打印。

三、编译运行

 Windows 系统

在Windows 上,`gfortran`不是系统默认提供的命令。需要手动安装它,通常作为GNU Fortran编译器的一部分。GNU Fortran是GNU编译器集合(GCC)的一部分,因此需要安装GCC来获取`gfortran`。以下是安装`gfortran`的几种常见方法:

1. MinGW-w64 或 MSYS2:
   这两个是提供Windows上运行的GCC编译器(包括gfortran)的环境。
   - MinGW-w64 提供了适用于32位和64位Windows系统的预构建的工具链。
     可以从这里下载:MinGW-w64
   - MSYS2 是一个包含软件集合的命令行环境,其中包括GCC。
     安装步骤如下:
     - 访问MSYS2 官网,并按照指引下载安装。
     - 通过MSYS2终端安装`gfortran`,使用以下命令:       

       pacman -Syu           # 更新软件包数据库并升级所有包pacman -S mingw-w64-x86_64-gcc-fortran  # 安装64位的gfortran

2. Cygwin:
   Cygwin为Windows提供了类UNIX的环境,并提供了`gfortran`。
   - 访问 Cygwin 官网,下载安装程序。
   - 在安装过程中,选择包含`gfortran`的`gcc-fortran`包进行安装。
3. WSL (Windows Subsystem for Linux):
   如果希望在类似Linux的环境下使用`gfortran`,可以安装WSL,并在其中安装一个Linux发行版,如Ubuntu。
   - 首先,启用WSL功能并安装选择的Linux发行版(如Ubuntu)。
   - 然后,在Linux环境中,使用包管理器安装`gfortran`,例如,在Ubuntu中:     

     sudo apt updatesudo apt install gfortran

   - 这样,就能在WSL环境中使用`gfortran`。
MinGW-w64和MSYS2提供了更加原生的Windows体验,而Cygwin提供了类UNIX环境。如果熟悉Linux且需要与Linux更相似的开发环境,WSL可能是最好的选择。在安装完成后,就能够使用Windows的命令行界面(如CMD或PowerShell)中或者在MSYS2、Cygwin的终端,或在WSL的Linux终端中调用`gfortran`。
Windows的命令行界面CMD的编译运行

gfortran -o matrix_multiply matrix_multiply.f90 -LD:\libs\OpenBLAS\lib -lopenblas -ID:\libs\OpenBLAS\include -static
matrix_multiply.exe

在Windows系统上,链接到OpenBLAS库时需要注意库文件的具体命名。通常,`.a`扩展名用于静态库,而`.dll.a`用于动态库(即动态链接库的导入库)。链接静态库`libopenblas.a`,在编译命令中添加`-static`标志。`-L`标志后面需要跟库文件所在目录的路径。这个案例实际并不需要指定`-I`选项,因为没有包含头文件。

Linux系统

以Ubuntu/Debian Linux 为例,用apt安装OpenBLAS和gfortran后,就可以编译运行:

gfortran -o matrix_multiply matrix_multiply.f90 -lopenblas
./matrix_multiply

这个程序会执行矩阵乘法并打印结果矩阵C。

如果想要进行更复杂的线性代数操作或者处理更大的矩阵,OpenBLAS提供了一系列的优化过的数学函数。除了`dgemm`用于双精度矩阵乘法,BLAS还包含其他函数如矩阵向量乘法(gemv),向量加法(axpy)等等,都可以在相同的框架内使用。对于单精度浮点运算,可以使用对应的单精度函数,如`sgemm`。

此外,为了提升性能和稳定性,调用BLAS库的函数时需要确保所有的数组已经被正确初始化,且理解BLAS函数的输入参数。例如,`dgemm`函数的完整型式如下:

call dgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)

其中:
- TRANSA和TRANSB:指定矩阵A和B是否需要转置('N'代表不转置,'T'代表转置,'C'代表共轭转置)。
- M、N和K:指定操作的矩阵的维数。
- ALPHA和BETA:标量值用于缩放计算。
- A和B:输入矩阵。
- LDA和LDB:表示矩阵A和B的前导维度(leading dimensions),通常等于对应矩阵的行数。
- C:输出矩阵。
- LDC:输出矩阵C的前导维度。
请确保在实际工具链和环境中正确地安装和配置了相应的Fortran编译器和BLAS实现。一些系统可能已经预装了特定版本的BLAS库,比如Linux系统自带的`libblas`。此外,要记得根据系统上的库安装情况调整链接器标志(例如使用`-lblas`代替`-lopenblas`,如果使用的是另外一个提供BLAS接口的库)。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/465248.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FAST角点检测算法

FAST(Features from Accelerated Segment Test)角点检测算法是一种快速且高效的角点检测方法。它通过检测每个像素周围的连续像素集合,确定是否为角点。以下是 FAST 角点检测算法的基本流程: FAST 角点检测算法的基本过程主要包括…

内网安全-内网穿透

目录 内网渗透 Nc使用详解 Nc监听和探测 Nc传文件 termite内网穿透工具 ssh代理内网穿透 ssh配置socket代理 MSF多级网络穿透 内网渗透 Nc使用详解 Nc监听和探测 Nc传文件 termite内网穿透工具 1、termite 之前叫ew (可以进行正向连接,可以…

读千脑智能笔记11_保存人类遗产

1. 智能生物通常能延续多久 1.1. SETI和METI计划的可行性在很大程度上取决于智能生物通常能延续多久 1.1.1. 搜寻地外文明(以下简称SETI)计划的目标 1.1.1.1. 这是一个力图寻找宇宙其他地方智能生物存在证据的研究项目 1.1.1.2. SETI计划旨在寻找含有…

mac卸载被锁定的app

sudo chflags -hv noschg /Applications/YunShu.app 参考:卸载云枢(MacOS 版)

Java的接口

目录 1.接口的概念 2.语法规则 3.接口的使用 4.接口的特性 总结: 5.实现多个接口 6.接口间的继承 1.接口的概念 接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。 在Java中,接口可以看成…

Deepin基本环境查看(九)【被封印的创世神】

文章目录 - 相关文章目录1、概述2、Deepin中的创世神和管理员1)创世神root2)root被封印原因3)其他的神灵【管理员】 3、神殿管理【su与sudo】1)su(Switch User)2)sudo(Superuser Do&…

centos间文件传输

scp /home/vagrant/minio zx192.168.56.34:/home/zx /home/vagrant/minio 是你要传输的文件而且是当前机器登录用户有权限操作的文件 zx是目标机器的用户192.168.56.34是目标机器的地址 /home/zx是要传到这个文件夹下 要确保zx有/home/zx这个文件夹的操作权限 本质就是ssh文…

LeetCode Python -8.字符串转整数

文章目录 题目答案运行结果 题目 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C 中的 atoi 函数)。 函数 myAtoi(string s) 的算法如下: 读入字符串并丢弃无用的前导空格检查下一个…

如何把手机平板变为电脑的屏幕

文章目录 安装软件运行效果结尾 本文首发地址 https://h89.cn/archives/181.html 最新更新地址 https://gitee.com/chenjim/chenjimblog 闲置的手机平板、触屏音箱等,均可作为电脑的扩展屏,为电脑增加一块显示屏,本文介绍如何使用免费的软件s…

python基于flask的网上订餐系统769b9-django+vue

课题主要分为两大模块:即管理员模块和用户模块,主要功能包括个人中心、用户管理、菜品类型管理、菜品信息管理、留言反馈、在线交流、系统管理、订单管理等; 如果用户想要交换信息,他们需要满足双方交换信息的需要。由于时间有限…

通过Dynamo删除Revit中族参数探究

起因是这样的,有位同事想在项目中直接删除revit族的参数,而不打开族,避免因为重载族,造成一些管件连接断开,于是就有了下面这些研究,当然是因为我没办法实现这个想法,所以这次可以分享下研究的过…

AI:125-基于深度学习的航拍图像中地物变化检测

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…