1. 程式人生 > >CLAPACK在Windows上的編譯、安裝與使用

CLAPACK在Windows上的編譯、安裝與使用

至於LAPACK是什麼在這裡就不多說了,編譯,安裝的步驟如下

1、CLAPACK的編譯與安裝

以下連結是CLAPACK的官方網站,也可以根據官方網站進行配置、

http://icl.cs.utk.edu/lapack-for-windows/clapack/index.html#install

我用的是clapack-3.2.1  對應的CMake用的是3.0.2的版本----**注意:這個地方好像有版本的對應關係,開始用CMake2.9對clapack-3.2.1進行編譯時出現錯誤,後來換成CMake3.0.2版本後錯誤消失

1.下載clapack-3.2.1    

clapack-3.2.1-CMAKE.tgz and unzip.

2.下載CMake3.0.2      http://www.cmake.org/

3.開啟CMake

where is the source code:填寫clapack-3.2.1-CMAKE資料夾所在的路徑(例如 C:/clapack-3.2.1-CMAKE,該資料夾包含CMakeLists.txt檔案,用於CMake的編譯之用)

where to build the binaries:最好填寫一個與上面資料夾不同的資料夾,可以自己新建一個。也可以使用上面的資料夾,但後續的檔案會不方便找

點選configure,這時會讓你選擇visual studio solution,請選擇vs2010(也就是vs10),這裡如果用預設的vs2008,會出現錯誤

再次點選configure,直到下面的對話方塊程式設計白色為止


點選generate,顯示generate done,表示編譯成功

關閉CMake

4.開啟where to build the binaries所指向的資料夾,裡面會用vs2010的工程,用vs2010開啟它

5.build“ALL_BUILD”將會build解決方案

6.build“INSTALL”會把lib 和 .h檔案放到cmake建立的目錄中 一般在C:\Program Files\CLAPACK中

7.bulid“RUN_TEST” 執行測試檔案

如果沒修改CMAKE中的設定,那麼搞定第6個步驟後,你會在C:\Program Files\CLAPACK發現你所需要的*.h和*.lib

備註:在RUN_TESTS有部分不能通過,也不影響其餘功能的正常使用


2、CLAPACK的使用

      使用CLPACK前,要先清楚四點:

首先是Levels of Routines,即函式的層次。LAPACK將整個庫分為三大塊:driver, computional, auxiliary,具體哪塊是做什麼的,請自行看連結。

其次是Naming Scheme,即命名規則。LAPACK的driver 和 computational 的函式名通常為XYYZZZ,其中X指使用的資料型別,YY指矩陣型別,ZZZ指函式的功能。例如SGEBRD的意思是單精度(S)的在一般的矩陣(GE)上執行bidiagonal reduction(BRD)操作,還是那句,具體的,請自行看連結。

再次是CLAPACK的函式不接收二維陣列,即只能用一維陣列代替二維陣列,例如我想要個array[2][2] = { {1,2}, {3,4} },那麼正確的寫法是array[2*2] = { 1, 2, 3, 4}。

最後是行主序與列主序的問題。CLAPACK看一維陣列時會將其看成是按列存放的。所以習慣將一維陣列看成是按行存放的要特別注意了。如果說就是不爽按列存放呢?那麼可以在計算前,先將其轉置。

     這裡以使用dgemm_函式為例,對CLAPACK的使用方法進行說明。從dgemm_的命名可以看出,這是雙精度(d)的在一般矩陣(GE)執行matrix-matrix操作的函式,更具體來說,是執行C = alpha* op(A)* op(B) + beta * C操作。在clapack.h中的宣告如下:

int dgemm_(char *transa, char *transb, integer *m, integer *n, integer *k, doublereal *alpha, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *beta, doublereal *c__, integer *ldc);

其中

transa表示op(A)的操作,若transa = 'T',則表示對A進行轉置

transa表示op(B)的操作

m表示矩陣A的行數

n表示矩陣B的列數

k表示矩陣A的列數

alpha就是alpha的值

a就是矩陣A的一維儲存,注意呼叫的函式會認為其是列主序的

lda表示矩陣A的第一維(LDA specifies the first dimension of A),其值根據transa的值而變

b是矩陣B的一維儲存

ldb表示矩陣B的第一維,其值根據transb的值而變

c是矩陣C的一維儲存

ldc表示矩陣C的第一維。

       以下程式將計算


//author: Zero
#include "iostream"
#include "f2c.h"        
#include "clapack.h"

using namespace std;

int main() {
    char transa = 'T', transb = 'T';
    integer M = 2, N = 2, K = 2, LDA = K, LDB = N, LDC = M;
    double alpha = 1.0, A[4] = { 1, 2, 3, 4}, B[4] = { 5, 6, 7, 8 }, beta = 0.0, C[4]; //下面的函式的意思是C = 1.0 * T(A) * T(B) + 0 * C,其中T()表示將某個矩陣轉置
    //注意此時得到的C是按列存放的
    dgemm_(&transa, &transb, &M, &N, &K, &alpha, A, &LDA, B, &LDB, &beta, C, &LDC);
    
    cout<<C[0]<<" "<<C[2]<<endl;
    cout<<C[1]<<" "<<C[3]<<endl;

    return 0;
}

要成功執行此測試程式碼,請將vs2010設定成如下所示