Skip to content

Instantly share code, notes, and snippets.

@kubo39
Created February 28, 2018 08:09
Show Gist options
  • Save kubo39/495f73528195b27a21e0217604c10dbb to your computer and use it in GitHub Desktop.
Save kubo39/495f73528195b27a21e0217604c10dbb to your computer and use it in GitHub Desktop.

並行並列スタック

並行並列スタック

  • 生スレッド・ロック
  • futures-rs
  • crossbeam-channel (メッセージパッシングによる並行処理)
  • rayon (タスクベースの並列処理ライブラリ)
  • Atomic・ロックフリーデータ構造

生スレッド・ロック

型システムによって安全に並行処理がかける. https://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/concurrency.html

  • ここがいい: 他の言語では得られない安全性, 自力で実装したいとき嬉しい
  • ここは気をつけよう: 資源問題やロードバランスをプログラマが考える必要がある, デッドロックや競合状態を作ってしまうことが比較的容易にできてしまう.(手動でロックを買いてはいけない)

futures-rs

https://github.com/rust-lang-nursery/futures-rs

処理結果の取得を後回しにする並列処理のデザインパターン. https://ja.wikipedia.org/wiki/Future

  • ここがいい: 非同期に結果をまてるのでそのあいだに他のタスクを処理できる.
  • ここは気をつけよう: 資源問題は考える必要がある.

crossbeam-channel

https://github.com/crossbeam-rs/crossbeam-channel

スレッド間のデータのやりとりを通信を通して行う. 効率的なMPMCキュー実装.

実際のベンチマーク https://github.com/crossbeam-rs/rfcs/blob/2e22d0ef3cec238e2dfc5a6554033515438ac6c2/text/2017-11-09-channel.md

  • ここがいい: 安全にスレッド間通信を扱える
  • ここは気をつけよう: ほとんど気にすることはないがコピーコストに気をはらう必要がある仕事だと不満が出るかも

rayon

https://github.com/rayon-rs/rayon

http://smallcultfollowing.com/babysteps/blog/2015/12/18/rayon-data-parallelism-in-rust/

work-stealingな仕組みを備えた並列処理ライブラリ.

  • ここがいい: 資源問題やロードバランスなどうまくやってくれるのでほとんど考えずともよい
  • ここは気をつけよう: たくさんの少タスクを扱うにはよいがI/Oでブロックする場合などで使うとブロックする.

Atomic・ロックフリーデータ構造

Rustのメモリオーダーを規定.

(今書いてる本から抜粋)

メモリオーダーとは直訳するとメモリの順番, 少し意訳するとメモリの読み出し/書き込みの順番という意味です. なぜこのような概念を取り上げる必要があるかというと, 現代においてプログラムは書いたとおりの順番で実行される保証がないためです. ひとつには, 現代のプロセッサはOoO(Out-of-Order)実行が主流になったことがあげられます. プロセッサはマイクロコードをパイプライン実行する際に逐次的に実行するのではなく, データ依存や命令のレイテンシなどの情報をもとに全体のスループットが最小になるような順序で実行するようになりました. このように実行時に命令実行が並び変わることをリオーダー(reorder)と呼びます. もうひとつに, コンパイラによる最適化によってリオーダーが発生するケースも考えられます. 例えばload命令を先に実行しstore命令を後に実行することによってデータがキャッシュに乗りやすい状態になるため, 高速化目的でこれらの命令を並べ替えるような最適化を言語仕様で許容するといったことは実際に存在しています. しかし命令実行順序が勝手に変わっては困るケースがあります. そのために実行順序が入れ替わらないような処理をプログラマが書くことができるように各言語ごとにメモリオーダーを定義しています. 指定したメモリオーダーの順序逆転を許さないという意味で, メモリバリアという言い方もされます.

(ここまで抜粋)

C++に似てる.

  • ここがいい: C++みたいにカリカリにチューニングすることが可能
  • ここは気をつけよう: あまりにも難しくあまりにも危険

お気持ち

  • これまではC++, Java, Goあたりがそれぞれに強みを持っていた. (ScalaとかErlangとかHaskellとかもあるけど経験上速度の問題にあたることがあり)
  • Rustという選択肢が加わった.
  • Rustは並行並列スタックのライブラリを揃えてきてる.

まとめ

  • Rustは並行並列スタックのライブラリを揃えてきてる. 実装も効率的で使いやすいデザインを目指している.
  • 用途によって使い分けよう.

資料

宣伝

今度の技術書展にて、サークル味噌煮研究所の会誌で「D言語で学ぶ並行並列プログラミング」という本を書きます.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment