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 で終了しました