一、安装开源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_multiply
    implicit none
    integer :: i, j
    external :: dgemm
    integer, parameter :: n = 3
    double precision :: alpha, beta
    double precision :: A(n, n), B(n, n), C(n, n)
    ! Initialize matrices A and B with some values
    A = 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 zero
    C = 0.0d0
    ! Coefficients for the matrix multiplication (typical values are 1.0 for both)
    alpha = 1.0d0
    beta = 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 result
    print *, 'Matrix C after multiplication:'
    do i = 1, n
        print *, (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 update
     sudo 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接口的库)。
 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐