CBLASの設置と使用

4374 ワード

CBLASの設置と使用
システム
[email protected]
 
 
CBLASはBLASのC言語インターフェースです.BLASのフルネームはBaic Linear Algebra Subprogramsです.中国語は基本的な線形代数子プログラムと呼ぶことができます.主にベクトルとマトリックス計算に用いられる高性能数学ライブラリである.自分のBLASはFortranで書いています.C/C++プログラムの使用を便利にするために、BLASのCインターフェースライブラリCBLASがあります.BLASのホームページはhttp://www.netlib.org/blas/CBLASのダウンロード先もこのページで見つけられます.
 
CBLASのインストールは先にBLASを詰めなければならなくて、ホームページの上からBLas.tgzをダウンロードして、解凍して、システムによってmake.incとMakefileを改正して、make、1つのblas〓を形成します.LINUX.aファイルです.それから、cblas.tgzをダウンロードして、解凍して、カタログの下でMakefile.*ファイルを名前を変えたり、リンクファイルを作ったりします.例えば、linuxの下でln-s Makefile.LINUX Makefile.inです.具体的な状況によって、Makefile.inファイルを変更します.すべてのファイルを生成するにはmake allを使います.CBDIRディレクトリの下で$CBLIBRAIRはCBLASのライブラリファイルを生成します.LINUX.a
 
CBLASのインストールディレクトリ$(CBDIR)のsrcディレクトリには、CBLASの関数とボリュームのヘッダファイルが含まれています.CBLASを使うときはこのヘッダファイルが必要です.BLASのライブラリファイル$(BLLIB)とCBLASのライブラリファイル$(CBLIB)が必要です.
 
CBLAS/BLASは3つのlevelに分けられ、level 1はベクトルの計算に用いられ、level 2はベクトルと行列の間の計算に用いられ、level 3はマトリックス間の計算である.たとえば、計算行列の乗算は、level 3に属します.ここでは、CBLASの使用をマトリックス乗算で学びます.
 
マトリックス乗算の関数の一つはcblas_です.sgemmは、単精度実数を使用し、また、複精度実数、単精度複素数、複精度複素数に対応する関数があります.ここでcblas_sgemmを例にとる
 
関数の定義:
void cblas_sgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,
                 const enum CBLAS_TRANSPOSE TransB, const int M, const int N,
                 const int K, const float alpha, const float  *A,
                 const int lda, const float  *B, const int ldb,
                 const float beta, float  *C, const int ldc)
この関数の詳細な定義はhttp://www.netlib.org/blas/sgemm.f見つかったのは、fortran言語にすぎないです.このC言語版はちょっと違っています.
この関数はC=アルファ*op(A)*op(B)+beta*Cを計算します.
 
const enum CBLAS_ORDER Orderとは、データの格納形態を指し、CBLASの関数では1次元でも2次元でも1次元の配列で保存されています.これは、行の主順か列の主順かに関係します.C言語では配列は行の主順、fortraでは列の主順です.私はやはり行主序を使うことに慣れていますので、このパラメータはCblasRowMajorを使います.列主順ならばCblasColMajorです.
 
const enum CBLAS_TRANSPOSE TransAとconst enum CBLAS_TRANSPOSE TransBは、この2つのパラメータの影響はop(A)とop(B)であり、オプションパラメータはCblasNoTrans=111、CblasTrans=112、CblasConjTrans=113であり、TransA=CblasNoTrans、  op(A)=A、TransA=CblasTrans、  op(A)=A',TransA=CblasConjTrans,  op(A)=A'TransBは似ています
 
const int M,マトリクスAの行,マトリクスCの行
const int N,マトリクスBの列,マトリクスCの列
const int K,マトリクスAの列,マトリクスBの行
const float alpha、const float beta、数式中の二つのパラメータ値を計算します.C=A*Bだけを計算するなら、alpha=1、beta=0
 
const float  *A、const float  *B,const float  *C,マトリクスABCのデータ
 
const int lda、const int ldb、const int ldcは、BLASの文書では、この3つのパラメータはそれぞれABCの行数ですが、実際に使ってみると、CBLASでは列数であるべきです.
 
ここで二つの単純行列の乗算を計算します.
A:
1,2,3
4,5,6
7,8,9
8,7,6
 
B:
5,4
3,2
1,0
 
プログラムコード:
//     C++, CBLAS C    ,      extern   
extern"C"
{
    #include<cblas.h>   
} 
#include<iostream>
usingnamespace std;
int main(void) {
    constenum CBLAS_ORDER Order=CblasRowMajor;
    constenum CBLAS_TRANSPOSE TransA=CblasNoTrans;
    constenum CBLAS_TRANSPOSE TransB=CblasNoTrans;
    constint M=4;	//A   ,C   
    constint N=2;	//B   ,C   
    constint K=3;	//A   ,B   
    constfloat alpha=1;
    constfloat beta=0;
    constint lda=K;	//A  
    constint ldb=N;	//B  
    constint ldc=N;	//C  
    constfloat A[K*M]={1,2,3,4,5,6,7,8,9,8,7,6};
    constfloat B[K*N]={5,4,3,2,1,0};
    float C[M*N]; 
    cblas_sgemm(Order, TransA, TransB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
    for(int i=0;i<M;i++)
    {
       for(int j=0;j<N;j++)
       {
           cout<<C[i*N+j]<<"\t";
       }
       cout<<endl;
    }

    return EXIT_SUCCESS;
}
コンパイルするときはcblas_を持参しなければなりません.LINUX.aとblas_LINUX.a、例えば、
g++man.cblas_LINUX.a blas_LINUX.a-o main
もちろん、ここではこの二つと仮定します.aファイルは直接にアクセスできる場所に置くか、あるいは全パスを書いてもいいです.
 
このようなやり方はCentOST.5で順調に通過しましたが、私のUbuntu.7.10で問題が発生しました.LINUX.aは正常にコンパイルして生成しましたが、リンクの際にエラーが発生しましたので、ソースからatlas、sudo appt-get install atlas 3-baseをインストールしました./usr/lib/atlas/ディレクトリの下でliblas.*とliblapack.ライブラリファイルがあります.リンクする時にここのblasファイルを使って上記のBLASを置き換えるだけで正常にコンパイルできます.
 
また、GSLの下にもBLASとCBLASがあり、bootの中にはBullasもCBLAS/BLASの機能を提供しています.時間があれば、研究をしています.