1. 程式人生 > >OpenBLAS簡介及在Windows7 VS2013上原始碼的編譯過程

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工程