2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

goでmklを使ってみる

Posted at

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を使っているので以下のようにビルド設定しました。

image.png

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の設定が間違っていたところでハマりました。

参考文献

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?