Rustで数値計算してみた話

  • 19
    いいね
  • 0
    コメント

修士・博士課程時代

  • 流体の直接数値計算
  • C++でシミュレーションを実装
  • Pythonで可視化+統計量の解析(on Jupyter)
  • データはmsgpackで保存

データ同化の研究を始める

  • 既存のコードベースを廃棄
  • Pythonで実装を始める
    • NumPy/SciPy使用

Python遅い(´・ω・`)

  • Pythonでは関数の呼び出しがインライン展開できない
  • 汎用性高く実装できない
  • でも、もうC++は書きたくない
    • コンパイルに1分かかるのはちょっと・・・

何で書く?

  • Haskellで書いてみた
    • ものすごく遅いコードが出来上がった(涙)
    • 配列を部分的に書き換えていくコードが書きづらい
    • コンパイル遅い
  • GoかRustか
    • Goが流行ってるのでRustにした

Rustを覚える

  • C++の不満点が解消されている
    • ビルドシステム(cargo)
    • moveが自然に導入
    • template -> traits (concepts)
  • iterator周りの機能が豊富
  • 所有権はC++より簡単
    • ライフタイムはコンパイラが教えてくれる

Rustで実装開始

  • 線形代数ライブラリの選択(参考:Linear Algebra in Rust)
    • rusty-machine (rulinalg): Machine Learning library for Rust
    • ndarray : Arrays inspired by numpy.
    • nalgebra : Low dimensional linear algebra.
    • servo/euclid : Basic linear algebra used by Servo.
    • cgmath : Linear algebra for game development.
  • 一番単純そうなndarrayを選択
    • 純粋な線形演算ライブラリで、低次元に特化していない
    • もともとC++で実装してい自作ライブラリに似てた(Eigenは使っていなかった)

LAPACK相当の機能がndarrayにない

FFTできない

  • rust-fftw3を開発
  • Cのバインディングの作成を覚えた

現状の課題

  • データの管理
    • 現状msgpackに保存しているがMongoDBに保存したい
    • dieselで簡単にSQLサーバーに保存できるかも?
  • 並列化・大規模化
  • PythonからRustの関数を呼べるようにしたい