Goからmklを呼び出してみたいと思い試行錯誤したので記録しておきます。
環境はmacOS Mojaveです。
TL;DR;
- Step1: mklをインストール
- Step2:
/opt/intel/mkl/bin/pkgconfig/*.pc
ファイルを修正 - Step3: 環境変数
PKG_CONFIG_PATH
を設定 - Step4: cgoで呼び出すコードを書く
- Step5:
go build
詳細
Step1: mklをインストール
Intelのページからmklをダウンロード・インストールします。
ダウンロードにはユーザー登録が必要でした。
Step2: /opt/intel/mkl/bin/pkgconfig/*.pc
ファイルを修正
私がインストールした環境ではデフォルト値が間違っていました。
以下のように修正しました。
diff /opt/intel/mkl/bin/pkgconfig/mkl-static-lp64-iomp.pc /opt/intel/mkl/bin/pkgconfig/mkl-static-lp64-iomp.pc.back
14c14
< prefix=/opt/intel/compilers_and_libraries_2019.4.233/mac/mkl
---
> prefix=/opt/intel/compilers_and_libraries_2019.4.233/mac/mkl/bin/pkgconfig/mkl
Step3: 環境変数 PKG_CONFIG_PATH
を設定
cgoでは内部で pkg-config
を実行するため設定ファイルの在りかを教えてあげる必要がありそうです。
私はGoLandを使っているので以下のようにビルド設定しました。
Step4: cgoで呼び出すコードを書く
cgoで呼び出しましょう。今回は練習としてblasに含まれているasumを呼び出しました。
コード例
package main
import (
// #cgo pkg-config: mkl-static-lp64-iomp
// #include "mkl.h"
"C"
"fmt"
)
func main() {
n := 10
vec := make([]float32, n)
for i := 0; i < n; i++ {
vec[i] = float32(i) + 1.0
}
result := C.cblas_sasum((C.int)(n), (*C.float)(&vec[0]), 1)
fmt.Printf("result=%v", result)
}
Step5: go build
ビルドして実行できるようになっているはずです。
感想
package-configの設定が間違っていたところでハマりました。