Movatterモバイル変換


[0]ホーム

URL:


PDF, PPTX27,437 views

できる!並列・並行プログラミング

現在のマルチスレッドプログラミングの抱える問題点と、代替案をわかりやすく解説いたします。最近登場したConcurrent Revisionsも解説します。

Embed presentation

Download as PDF, PPTX
できる!並列・並行プログラミング          田中英行 <tanaka.hideyuki@gmail.com>   Tech Talk@PFI 2011/10/20
“The Free Lunch is Over!”21世紀初頭、人類は岐路に立たされていた   永遠に続くかと思われたプロセッサ      高速化に陰りが見え始め   プロセスの微細化は物理的限界を        迎えようとしていた プロセッサメーカはマルチコアへと走り    プログラマに困難を押し付ける    上がらないクロック 下がるIPC    Out-of-OrderからIn-Orderに      フリーランチを取り戻せ    果報は寝て待つ時代を再び!
本日の内容• ぼーっと寝ているだけで、プログラムが  速くなる時代は終わってしまった• どげんかせんといかん!
並列・並行の違い• 並列(Parallel)  – タスクを高速化するために、プログラムを複    数のプロセッサで動作させる  – 目的は高速化(速くならないのなら意味は無    い)• 並行(Concurrent)  – 複数のタスクを同時に実行する  – タスクを同時に実行すること自体が目的          ※よく誤解されますが、インプリによる分類ではないです
分散• 物理的に独立した、複数のノードで  並列・並行を行う• 今回は扱いません
マルチスレッドプログラミング• 1ノード内での並列・並行プログラムに  用いる• 並列・並行はスレッドだけじゃない – OpenMP(プラグマ) – OpenCL/CUDA(DSL) – Implicit Parallelism(Parallel Haskell) – (Nested)Data Parallelism(DPH) – Automatic-Paralellisation(お餅) – これらの話は今回はしません
スレッドとは• ここでは次のようなものと想定 – メモリ空間を共有 – 固有のスタックを持つ – プリエンプティブ• 実装はいろいろ – OSスレッド(pthreadなど) – グリーンスレッド(処理系固有のスレッド) – 軽量スレッド(Erlang/Haskellなど)
マルチスレッドプログラミングは      難しい     スレッド
なんで難しいのか?• 複数のスレッドはやり取りする必要がある – そうでなければ、ただのタスクの集合• 複数のスレッドが同一のリソースにアクセ  スするとき、非決定状態が発生する
簡単な例• 次のプログラムにはバグがあります。  そのバグを指摘しなさい(1分で10級)
Race Condition(競合状態)• 複数のスレッドが同一のリソースにアク  セスする際、予期しない状態になること  がある• そのような状態をRace Conditionという• マルチスレッドプログラムは一般的に非  決定な計算になるので、この手のバグの  再現は困難を極めることが多い
Race Conditionの例
並行性制御・排他制御• ロック – あるリソースに同時にアクセスするスレッドが一   つであれば、Race Conditionは発生しない – リソースへのアクセス権を制御する仕組み – mutexへのロック・アンロックで実現• 排他制御 – 同一リソースに複数スレッドがアクセスしないよ   うにすること – 排他制御が必要なコード上の箇所を   「クリティカルセクション」という
さっきの解答• cnt_ にロックによる排他制御を追加する
そう彼は言葉巧みに私に近づいて来ました     手を変え品を変え   言語組み込みなら大丈夫     Boostなら大丈夫          ・・・    でも、待っていたのは   デバッグ地獄だったんです
第二章Locks Considered Harmful
ロックは害悪である• ロックを用いたすべてのプログラムは、  バグがあるか、もしくはまだバグが見つ  かっていないかのどちらかである        “Java Concurrency in Practice”• ロックによる並行プログラミングは、  アセンブリでプログラムするに等しい                        “出典不明”• トイレロックが取れない                        “P社社員”
ロックが難しいと見抜けないと (ロックを扱うのは)難しい• ロックのもたらすバグ・不具合一覧 – アンロックし忘れ – デッドロック – ロックの不足(Race Condition) – ロックの過剰(全然並列にならない) – モジュラリティの欠如
(1)アンロックし忘れ•   ロックしたmutexをアンロックし忘れる•   リソースに永久にアクセスできなくなる•   例外安全性とも関係•   解決法:    – 常にRAIIを用い、手動でのロック・アンロッ      クは“決して行なってはいけない”
(2)デッドロック• 複数のロックを複数のスレッドが同時に  獲得しようとする際に発生• スレッドが永久に停止• 解決法: – 必ず同じ順番でロックを取るようにする – ロックに順序を付け、これから獲得しようと   するロックを予め全て列挙、その順番でロッ   クしなければいけない
(3)ロックの不足• クリティカルセクションでロックを忘れ  る• 解決法: – ありません – 気をつけるしかない  \(^o^)/
(4)ロックの過剰• 必要のないところでロックを取る – 粒度の大きなロック  • ハッシュテーブルで全要素をロックするなど – 粒度の小さなロックを記述するのは、非常に   難しい• 解決法: – 本質的に困難  • 特定のほげほげをfine grainedに実装しましただけ    で国際学会レベル
(5)モジュラリティの欠如• ロックを用いたプログラミングは互いに  組み合わせることができない• 解決法: – 原理的に不可能\(^o^)/ \(^w^)/  \(^t^)/
ロックに潜む本質的欠陥• ロックを用いたルーチンは、Composable  でない – 互いに組み合わせることができない – 例で説明します
例:銀行システム• ストレートな実装
問題点• 例:振込関数を書く – 振込処理はトランザクション – ACI(D)が必要• これはだめ – 中間状態が見える
振込:修正• あらかじめ両方のロックをとっておく – ロック変数を暴露、カプセル化の崩壊• しかし、これで良いのか?
デッドロック• デッドロックの可能性 – ロックの順番を同じにしなければならない
モジュラリティの低下     ロック粒度の低下• すべての操作が、ロックする可能性のあ  るmutexを列挙しなければならない• これらすべてを一度にロックしなければ  ならないので、一部不要なものがあった  としてもロックを回避できない – ロックの獲得の順番は必ず守らなければなら   ないので
組み合わせ• 例題:銀行Aから銀行Cに振込を行う。た  だし、銀行Aに十分な残高がなかったら、  銀行Bから銀行Cに振込を試みる。
解答例:まちがい• 予めロックを全部取る(順番は今は不問) – aからの振込に成功した場合、   bのロックを行なってはいけない
解答例:まちがい(2)• 当然これはバグ
Q:どうすればいいのか?• A:どうにもできない – 状況に応じて必要なロックが変動する場合、   それらを安全にロックすることは不可能• これはすなわち – ロックを用いたプログラムにモジュラリティ   は存在しない – ロックを用いたプログラムを組み合わせるこ   とは不可能である
第三章Lock Must Go!
マルチスレッドプログラミングに    銀の弾丸なし• すべてを解決する夢の様なものはない – お餅うにょーん• 実装するものに対して適切なものを選ぶ  必要がある – 方法はいろいろある – 一長一短
でも、ロックだけは絶対に死んでもイヤ
ロックの代替物• メッセージパッシング• Software Transactional Memory(STM)• Concurrent Revisions  – 後で説明
メッセージパッシング• スレッドがそれぞれメッセージキューを  持ち、スレッド間の通信はメッセージの  やり取りに限る – そもそもリソースを共有しないので、Raceが   起きない• プログラミングモデルに制限がかかる
STM• メモリ操作をAtomicity、Consistency、Isolation  を満たすトランザクションとして記述する  – 各トランザクションは、シーケンシャルに実行さ    れた時と同一の結果にならなければならない• 実装方式はいろいろ  – 楽観的並行性制御にて実行、競合したらロール    バックするのが一般的  – 取り消し不可能な操作をトランザクションから排    除する必要がある
これらのものをサポートする         処理系• Erlang  – immutable  – メッセージパッシング(ScalaとかHaskellも)• Closure  – 共有資源が次のいずれか     • Transactional Variable     • Thread Local• Haskell  – STM(型レベルでロールバックの正しさを保証)
第四章Concurrent Revisions
Concurrent Revisions• 最近提唱された並行性制御のための手法 – ロック無し – Waitなし – ロールバックなし – ロールバックしないので取り消し不可能な操   作を行なっても良い
参考文献• Sebastian Burckhardt, Alexandro Baldassion,  and Daan Leijen, Concurrent Programming  with Revisions and Isolation Types, in  Proceedings of the ACM International  Conference on Object Oriented Programming  Systems Languages and Applications  (OOPSLA'10), ACM SIGPLAN, Reno, NV,  October 2010  – http://research.microsoft.com/en-    us/projects/revisions/
概要• バージョン管理のアナロジーで  共有リソースを扱う
コンポーネント• versioned<T>  – バージョン変数• revision  – リビジョンをあらわす変数• fork  – 並行に実行、子は別リビジョンに• join  – リビジョンをマージする
楽観的並行性制御• versioned変数はスレッドごとに領域が割  り当てられる – Raceが発生しない• Joinの際に決定的(Deterministic)に  コンフリクトを解消 – デフォルトでは、子の変更を優先
Deterministic• Deterministic Concurrency  – 非決定性がない
cumulative変数• コンフリクト解消の方法をカスタマイズ – λorig main child -> result
リビジョンツリーの形に制約• 直接の子供(もしくはそれをjoinしたリビ  ジョン)しかjoinできない – 正しいコンフリクト解消のため
Concurrent Revisions:Pros• Race Conditionが発生しない• 決定的であるので、再現性の低いバグに  悩まされる必要がない – 本質的に決定的である必要がある並列には   特に向いている• (Concurrent Revisionsの)仕組みが単純  実装が容易 – STMは難しい
Concurrent Revisions:Cons• 不正なjoin – OriginalのC#への実装はランタイムエラー – Haskellへの実装ではRank2Polymorphismを   用いて型エラーにすることが可能• Deterministicにコンフリクト解消ができる  必要がある – そうでないものには向かない
性能• オーバーヘッド – 非常に軽微
性能• ゲームの並列化 – 4コアマシンでのFPS
性能その他
You can try it NOW!$   git clone git://github.com/tanakh/concurrent_revisions.git$   cd concurrent_revisions.git$   ./waf configure$   ./waf build$   sudo ./waf install                                      Fork it!
デモ
まとめ• 並行性制御に銀の弾丸なし• でも、ロックはもう使ってはいけない• ロックの代替を状況に応じて使い分け – メッセージパッシング – STM – Concurrent Revisions

Recommended

PPT
Glibc malloc internal
PPTX
イベント駆動プログラミングとI/O多重化
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
PPTX
本当は恐ろしい分散システムの話
PDF
Pythonによる黒魔術入門
PDF
プログラムを高速化する話
PDF
いまさら聞けない!CUDA高速化入門
PPTX
AVX-512(フォーマット)詳解
PDF
高速な倍精度指数関数expの実装
PDF
例外設計における大罪
PDF
ゲーム開発者のための C++11/C++14
PDF
SQL大量発行処理をいかにして高速化するか
PDF
それはYAGNIか? それとも思考停止か?
PDF
世界でいちばんわかりやすいドメイン駆動設計
PPTX
近年のHierarchical Vision Transformer
PDF
暗号技術の実装と数学
PPTX
冬のLock free祭り safe
PDF
ウェーブレット木の世界
PDF
ネットワーク ゲームにおけるTCPとUDPの使い分け
PPTX
PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築
PDF
入門 シェル実装
PDF
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
PDF
マルチコアを用いた画像処理
PDF
TLS, HTTP/2演習
PDF
強化学習その3
 
PDF
【Unite Tokyo 2019】Understanding C# Struct All Things
PPTX
DockerコンテナでGitを使う
PPTX
イベント・ソーシングを知る
PPTX
非同期処理の基礎
PDF
[Basic 9] 並列処理 / 排他制御

More Related Content

PPT
Glibc malloc internal
PPTX
イベント駆動プログラミングとI/O多重化
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
PPTX
本当は恐ろしい分散システムの話
PDF
Pythonによる黒魔術入門
PDF
プログラムを高速化する話
PDF
いまさら聞けない!CUDA高速化入門
PPTX
AVX-512(フォーマット)詳解
Glibc malloc internal
イベント駆動プログラミングとI/O多重化
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
本当は恐ろしい分散システムの話
Pythonによる黒魔術入門
プログラムを高速化する話
いまさら聞けない!CUDA高速化入門
AVX-512(フォーマット)詳解

What's hot

PDF
高速な倍精度指数関数expの実装
PDF
例外設計における大罪
PDF
ゲーム開発者のための C++11/C++14
PDF
SQL大量発行処理をいかにして高速化するか
PDF
それはYAGNIか? それとも思考停止か?
PDF
世界でいちばんわかりやすいドメイン駆動設計
PPTX
近年のHierarchical Vision Transformer
PDF
暗号技術の実装と数学
PPTX
冬のLock free祭り safe
PDF
ウェーブレット木の世界
PDF
ネットワーク ゲームにおけるTCPとUDPの使い分け
PPTX
PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築
PDF
入門 シェル実装
PDF
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
PDF
マルチコアを用いた画像処理
PDF
TLS, HTTP/2演習
PDF
強化学習その3
 
PDF
【Unite Tokyo 2019】Understanding C# Struct All Things
PPTX
DockerコンテナでGitを使う
PPTX
イベント・ソーシングを知る
高速な倍精度指数関数expの実装
例外設計における大罪
ゲーム開発者のための C++11/C++14
SQL大量発行処理をいかにして高速化するか
それはYAGNIか? それとも思考停止か?
世界でいちばんわかりやすいドメイン駆動設計
近年のHierarchical Vision Transformer
暗号技術の実装と数学
冬のLock free祭り safe
ウェーブレット木の世界
ネットワーク ゲームにおけるTCPとUDPの使い分け
PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築
入門 シェル実装
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
マルチコアを用いた画像処理
TLS, HTTP/2演習
強化学習その3
 
【Unite Tokyo 2019】Understanding C# Struct All Things
DockerコンテナでGitを使う
イベント・ソーシングを知る

Similar to できる!並列・並行プログラミング

PPTX
非同期処理の基礎
PDF
[Basic 9] 並列処理 / 排他制御
PDF
async/await不要論
PPTX
Fork/Join Framework
PDF
並行実行制御の最適化手法
PDF
C++ マルチスレッド 入門
PDF
トランザクションの並行処理制御
PPTX
Introduction to conccrent_lock
PPTX
大規模分散システムの現在 -- Twitter
PPT
Transactional Information Systems入門
 
PDF
C++ マルチスレッドプログラミング
PPTX
JavaDayTokyo2015 [3-1]
PDF
トランザクションの並行実行制御 rev.2
ODP
SPIN で
PDF
これからの「async/await」の話をしよう
PDF
nakameguro_feature.cpp vol.8
 
PPTX
並列プログラミング 入門!&おさらい!
PDF
いまさら恥ずかしくてAsyncをawaitした
PDF
並行プログラミングと継続モナド
PDF
プログラミングNet framework3のお題
非同期処理の基礎
[Basic 9] 並列処理 / 排他制御
async/await不要論
Fork/Join Framework
並行実行制御の最適化手法
C++ マルチスレッド 入門
トランザクションの並行処理制御
Introduction to conccrent_lock
大規模分散システムの現在 -- Twitter
Transactional Information Systems入門
 
C++ マルチスレッドプログラミング
JavaDayTokyo2015 [3-1]
トランザクションの並行実行制御 rev.2
SPIN で
これからの「async/await」の話をしよう
nakameguro_feature.cpp vol.8
 
並列プログラミング 入門!&おさらい!
いまさら恥ずかしくてAsyncをawaitした
並行プログラミングと継続モナド
プログラミングNet framework3のお題

More from Preferred Networks

PDF
PodSecurityPolicy からGatekeeper に移行しました / Kubernetes Meetup Tokyo #57
PDF
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
PDF
Kubernetes + containerd で cgroup v2 に移行したら "failed to create fsnotify watcher...
PDF
深層学習の新しい応用と、 それを支える計算機の進化 - Preferred Networks CEO 西川徹 (SEMICON Japan 2022 Ke...
PDF
Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55
PDF
Kaggle Happywhaleコンペ優勝解法でのOptuna使用事例 - 2022/12/10 Optuna Meetup #2
PDF
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
PDF
Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2
PDF
スタートアップが提案する2030年の材料開発 - 2022/11/11 QPARC講演
PPTX
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
PPTX
PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)
PDF
自然言語処理を 役立てるのはなぜ難しいのか(2022/10/25東大大学院「自然言語処理応用」)
PDF
Kubernetes にこれから入るかもしれない注目機能!(2022年11月版) / TechFeed Experts Night #7 〜 コンテナ技術を語る
PDF
Matlantis™のニューラルネットワークポテンシャルPFPの適用範囲拡張
PDF
PFNのオンプレ計算機クラスタの取り組み_第55回情報科学若手の会
PDF
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
PDF
Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...
PDF
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
PDF
KubeCon + CloudNativeCon Europe 2022 Recap - Batch/HPCの潮流とScheduler拡張事例 / Kub...
PDF
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
PodSecurityPolicy からGatekeeper に移行しました / Kubernetes Meetup Tokyo #57
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
Kubernetes + containerd で cgroup v2 に移行したら "failed to create fsnotify watcher...
深層学習の新しい応用と、 それを支える計算機の進化 - Preferred Networks CEO 西川徹 (SEMICON Japan 2022 Ke...
Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55
Kaggle Happywhaleコンペ優勝解法でのOptuna使用事例 - 2022/12/10 Optuna Meetup #2
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2
スタートアップが提案する2030年の材料開発 - 2022/11/11 QPARC講演
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)
自然言語処理を 役立てるのはなぜ難しいのか(2022/10/25東大大学院「自然言語処理応用」)
Kubernetes にこれから入るかもしれない注目機能!(2022年11月版) / TechFeed Experts Night #7 〜 コンテナ技術を語る
Matlantis™のニューラルネットワークポテンシャルPFPの適用範囲拡張
PFNのオンプレ計算機クラスタの取り組み_第55回情報科学若手の会
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
KubeCon + CloudNativeCon Europe 2022 Recap - Batch/HPCの潮流とScheduler拡張事例 / Kub...
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50

できる!並列・並行プログラミング


[8]ページ先頭

©2009-2025 Movatter.jp