🎲

Gomalish.jl: monolish を Julia から触りっしゅ! (動かします)

2021/10/17に公開

本日は

  • この記事を最初に公開している朝はいつもより冷え込んでおります.そういう時はゴマちゃんをもふもふするのが良いです.ごまごまーとしているうちに monolish というすべてのハードウェア、型、行列構造への依存を吸収することを目的として開発された、数値計算ライブラリを Julia から使える仕組みの雛形を PoC として作ることができました.
  • こちら gomalish リポジトリにて Gomalish.jl という名前の Julia パッケージとして触りっしゅ(動かすことが)できます.

Q: Gomalish.jl なんで作ったの?

A: たまたまそこにメンテナンスがされて,開発環境がDockerで提供されてて,手元でも気軽に動かせる程よい規模のC++プロジェクト monolish があって,そこにGomaをつけると名前の響きが可愛かったから. そしてCxxWrap.jlを使ってJuliaからの呼び出しが成功したから.

事前知識

  • ひとまず gomalish の話以前に C++ のライブラリとして monolish を触る方法は monolish がすでに梱包されている Docker のコンテナを立ち上げるのが楽です.その方法については

monolish 公式のドキュメントの Docker container with monolish installed または自分の書いた

monolish を触りっしゅ!(触ります)

をご覧ください.

  • Gomalish.jl をとりあえず触る場合も同様に Docker を動かす環境の知識があると良いです.

Gomalish.jl を触りっしゅ!

$ git clone https://github.com/AtelierArith/gomalish && cd gomalish
$ make # to build Docker image
$ docker-compose run --rm julia julia -e 'using Pkg; Pkg.build(); Pkg.test()'

特にエラーもなく処理が終了すればこれで皆さんも Gomalish.jl を完全理解できたことになります.やっていることは下記の通りです:

  1. リポジトリをクローン
  2. 開発・動作環境を整えた Docker イメージをビルドする
  • VSCodeのリモートコンテナ機能を使って開発もできるように .devcontainer/devcontainer.json も設定済みです.
  1. Gomalish.jl パッケージをビルドしテストスクリプトを実行します.
  • テストスクリプトは test/runtests.jl にあります. Gomalish.jl のサンプルコード
    だと思ってください.
  • Gomalish.jl は deps/build/lib にて作成される libgomalish.so をロードすることでラップ済みの機能を実行します. libgomalish.soPkg.build() とすることで作成できます. これは Julia スクリプトである deps/build.jl を実行することに相当します. (これは Julia のパッケージエコシステムの仕様)
  • さらに deps/build.jl の中身を見るとわかるように deps ディレクトリに移動して make コマンドを実行しているだけです.

Gomalish.jl 開発者向け

以下は C++ がチョットデキル人向け

  • test/runtests.jl は monolish 側の examples/cpu_only にあるサンプルコードと同様の機能を実行しています. 他の機能を Julia から呼べるようにするには deps 直下にある monolish_xxxx.cpp e.g. monolish_vector.cpp の中身を見てよしなに編集してください. 編集したら deps に移動して makeコマンドを実行してください.
  • 従って Gomalish.jl に対して開発を進める場合は一旦 Julia のことは忘れて deps を C++ のプロジェクトとしてみなし開発しすれば OK です.
  • ちゃんと Gomalish.jl が機能するかはターミナル上で
$ julia -e 'using Pkg; Pkg.test()'

と実行するか Pkg REPL で

$ julia
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.6.3 (2021-09-23)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |

julia> ] # ここで ] と入力することでプロンプトが切り替わる. 切り替わった後で `test` と入力する
(Gomalish) pkg> test

としてください.

  • 機能追加は monolish/include 以下をジーッと眺めてクラスとメソッドを libcxxwrap-julia のお作法に従って記述すれば OKです. ヘッダー解析して対応するクラス・メソッドを列挙してラッパーを自動生成するとmonolishの全ての機能を触りっしゅできることになります.

まとめ

  • C++ と格闘しながらごまごまーして Gomalish.jl を作りました.本家から Monolish.jl が出ると嬉しいな♪
GitHubで編集を提案

Discussion