CentOS 7 でblas(cblas)を使う方法
CentOS(wiki)はそのサポート期間の長さから、企業や大学のサーバによく用いられるOSです。
CentOSはパッケージ一つ入れるだけでも検索戦争に耐えねばなりません。というのも、シェアが少ない故に情報に乏しいことに加え、tensorflowなどの近代的なパッケージはubuntuでの利用を想定していることが多いからです。故にCentOSを個人が使う理由はないと思っているのですが、残念ながら上の人間(組織)からCentOSを使うことを強いられるシーンは多々あります。
以下のシンプルなcblasのc++用のサンプルコード(sample.cpp)を動かすことを考えましょう。
因みに筆者はこれで3時間ぐらいを溝に捨てました。
#include <cblas.h> #include <stdio.h> // based on https://github.com/xianyi/OpenBLAS/wiki/User-Manual int main(){ int i=0; double A[6] = {1.0,2.0,1.0,-3.0,4.0,-1.0}; double B[6] = {1.0,2.0,1.0,-3.0,4.0,-1.0}; double C[9] = {.5,.5,.5,.5,.5,.5,.5,.5,.5}; cblas_dgemm(CblasColMajor, CblasNoTrans, CblasTrans,3,3,2,1,A, 3, B, 3,2,C,3); for(i=0; i<9; i++){ printf("%lf ", C[i]); printf("\n"); } return 0; }
【openblasを使おう】
悪いことは言いません。以下のコマンドでopenblasを導入し、ライブラリとヘッダファイルへのリンクを貼りましょう。
sudo yum install openblas*
g++ sample.cpp -lopenblas -I/usr/include/openblas
【個人的アドバイス:atlasを使うのはよそう】
CentOS cblasで検索するとatlasを使う方法の記事が沢山でてきますが、atlasはオススメしません。
ベンチマークで負けていることが多く、CentOSのバージョンによって名称が変わってくれたり、undefined referenceを頻発するからです(私の手元のCentOS7ではsatlasやtatlasをリンクしてもundefined referenceが出続けた)。
【間違ったcblasをインクルードしていないか気をつけよう】
運悪く(または何らかの圧力、必要性に屈して)atlasを入れてしまった人はこれに気をつけなければなりません。openblasのcblas.hは/usr/include/openblas/cblas.h に、atlas由来のcblas.hは/usr/include/cblas.h に配置されます。openblasを使う際にatlas由来のcblas.hをインクルードしてしまうと(例えば上述のコンパイルから-Iを除去すると)コンパイルの最後でundefined referenceが出てきて心を砕かれる羽目になります。-Iでちゃんとどのディレクトリからcblasをインクルードするかを明記しておくと良いでしょう。
undefined referenceの一例
sample.cpp:(.text+0x1c1): `cblas_dgemm(CBLAS_ORDER, CBLAS_TRANSPOSE, CBLAS_TRANSPOSE, int, int, int, double, double cons\ t*, int, double const*, int, double, double*, int)' に対する定義されていない参照です collect2: エラー: ld はステータス 1 で終了しました