OpenBLAS簡介及在Windows7 VS2013上原始碼的編譯過程
OpenBLAS(Open Basic Linear Algebra Subprograms)是開源的基本線性代數子程式庫,是一個優化的高效能多核BLAS庫,主要包括矩陣與矩陣、矩陣與向量、向量與向量等操作。它的License是BSD-3-Clause,可以商用,目前最新的釋出版本是0.2.19。它的原始碼放在了GitHub上,由張先軼老師等持續維護。
OpenBLAS是由中科院軟體所並行軟體與計算科學實驗室發起的基於GotoBLAS2 1.13 BSD版的開源BLAS庫高效能實現。
BLAS是一個應用程式介面(API)標準,用以規範釋出基礎線性代數操作的數值庫(如向量或矩陣乘法)。該程式集最初發佈於1979年,並用於建立更大的數值程式包(如LAPACK)。在高效能運算領域,BLAS被廣泛使用。
OpenBLAS支援的作業系統包括:Windows、Linux、Mac OS X、FreeBSD、Android.
OpenBLAS支援CPU型別包括:Intel、AMD、MIPS64、ARM/ARM64、IBM Z13.
在Windows7上安裝Perl操作步驟:
1. 從https://www.perl.org/get.html下載Windows ActiveState Perl 5.22.3.2204 windows 64-bit;
2. 點選安裝,一直選擇預設設定即可;
3. 開啟命令提示符cmd,輸入: $ perl -v 如果提示This is perl5,version 22等資訊,說明安裝正確,如下圖:
OpenBLAS在VS2013上的編譯過程:(注:直接用VS2013編譯不如用MinGW編譯好,因為VS2013僅編譯C語言,沒有編譯AT&T組合語言。在效能上用MinGW編譯的庫要快於直接用VS2013編譯的庫。要通過CMake和VS2013編譯OpenBLAS原始碼,Windows作業系統上還需要安裝Perl)
2. 開啟CMake GUI:source code: D:/Download/OpenBLAS-0.2.19/OpenBLAS-0.2.19; build thebinaries: D:/Download/OpenBLAS-0.2.19/build;
3. 點選Configure;Specify the generator for this project: Visual Studio 12 2013 Win64,Finish;
4. 修改CMAKE_INSTALL_PREFIX路徑為:D:/Download/OpenBLAS-0.2.19/install;預設BUILD_WITHOUT_LAPACK是被勾選的,即不會產生Lapack庫;
5. 再次點選Configure,點選Generate,生成OpenBLAS.sln,如下圖;
6. 開啟OpenBLAS.sln:分別在Debug和Release下,重新生成解決方案,便會生成libopenblas.dll和libopenblas.lib(注:Debug和Release下,預設生成的庫的名字一樣,並且在同一個目錄下);
7. 新建一個控制檯工程,驗證其openblas庫的正確性,測試程式碼如下:
#include "funset.hpp"
#include <iostream>
#include <cblas.h>
int test_openblas()
{
int th_model = openblas_get_parallel();
switch (th_model) {
case OPENBLAS_SEQUENTIAL:
printf("OpenBLAS is compiled sequentially.\n");
break;
case OPENBLAS_THREAD:
printf("OpenBLAS is compiled using the normal threading model\n");
break;
case OPENBLAS_OPENMP:
printf("OpenBLAS is compiled using OpenMP\n");
break;
}
int n = 2;
double* x = (double*)malloc(n*sizeof(double));
double* upperTriangleResult = (double*)malloc(n*(n + 1)*sizeof(double) / 2);
for (int j = 0; j<n*(n + 1) / 2; j++)
upperTriangleResult[j] = 0;
x[0] = 1; x[1] = 3;
cblas_dspr(CblasRowMajor, CblasUpper, n, 1, x, 1, upperTriangleResult);
double*& A = upperTriangleResult;
std::cout << A[0] << "\t" << A[1] << std::endl << "*\t" << A[2] << std::endl;
free(upperTriangleResult);
free(x);
return 0;
}
執行結果如下:Note: 也可以用命令提示符定位到openblas根目錄下,執行:$ cmake -G "Visual Studio 12 Win64" 會直接生成OpenBLAS.sln工程