一、安装开源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接口的库)。