狠狠撸
Submit Search
経済学のための并列分散処理1
?
Download as PPTX, PDF
?
0 likes
?
711 views
Masa Kato
Follow
経済学のための并列分散処理1
Read less
Read more
1 of 30
Download now
Download to read offline
More Related Content
経済学のための并列分散処理1
1.
経済学のための并列分散処理1 Masa Kato August 4th,
2018 @ Ichimura-seminar 1
2.
コンテンツ ?目的 ? 経済学の研究者に並列分散処理について説明する. ? いくつかの具体的な実装例を紹介する. ?
Value Function Iterationに適用できるかを検討する. ?目次 1. 並列化とは何か 2. CPUとGPU 3. 並列計算の設計方法 4. 並列計算の評価 5. 並列アルゴリズム 6. Value Function Iteration 2
3.
参考資料 ?A Practical Guide
to Parallelization in Economics ?枝廣教授「コンピュータ科学特別講義Ⅳ」資料集(非公開) ?C/C++プログラマーのためのOpenMP並列プログラミング ?CUDA Cプロフェッショナルプログラミング ?Linuxとpthreadsによるマルチスレッドプログラミング入門 3
4.
並列処理に使われる言語 ?擬似コード:実装内容を抽象的に表したもの.現実の言語では無いが特定 の言語を暗に想定している場合が多い. ?C/C++:並列処理において主流の言語. ?CUDA C:C言語ベースのGPU用言語 ? 今日の発表は擬似コードとC言語の実装例を掲載. ?Fortran:使いづらいが物理系などの古い研究室にはFortranコードの積み重 ねがあるためにCへの移行ができない場所では今も使用されている. ?Python:機械学習分野での主流言語.GPUの主な使い道が深層学習でありた めにGPUを利用するためのライブラリが充実.単純な計算に関するGPUの利 用に限ればC/C++より使いやすい. ?Matlab,Stata,Juliaにも並列処理をサポートするためのライブラリがある. 4
5.
並列処理に使われるツール ?OpenMP:主にC/C++,Fortran言語で書かれたコードの並列化に用いられる API. ?CUDA:C/C++をベースに開発されたGPUコンピューティング用の言語. Fortran版も開発された(しかし,メインがC言語などで文献も少なく,おそ らく使うことはない). ?Cupy:日本の民間企業が開発したPython用ライブラリ.numpyというライ ブラリとほぼ同じ感じで使える. ?Numba,OpenACC :あまり使っている人はいない気がする. ?RやJuliaにも並列化用のライブラリが多数ある. ? 私見ではJuliaはMCMC用のライブラリが充実している.学部のときに MCMCの並列化をJuliaでしたときはとても楽だった記憶が. 5
6.
第1節:並列化とは何か 6
7.
並行処理と並列処理 ?コンピュータにおいてはプロセッサ(CPU)上でプログラムが実行される. ?プロセッサで実行されているプログラムはプロセスと呼ばれる. ?OSは複数のプロセスの生成?実行?消滅を管理する役割をもつ. ?複数のプロセスを見かけ上同時に実行することを並行処理という. ?複数のプロセスを実際に同時に実行することを並列処理という. ? コンピュータが複数のプロセッサを持つ場合は,複数のプロセスをそれぞれ 別のプロセッサ上で動作させることができる(並列処理). 7
8.
プロセスとスレッド ?前スライドでは「プロセス」の並行?並列処理を考えた. ?さらに一つのプロセス内で並行?並列処理を行うことが考えられる. ?プロセス内で並列処理を行うための機構としてスレッドが存在する. ? OSの立場からみるとスレッドがプログラム実行の最小単位であり,「計算 機資源を共有するいくつかのスレッドをまとめて取り扱う単位がプロセス である」ということもできる. 8 ネット販売において 需要を観測しながら 価格を変えたい プロセス1 売上状況の確認 プロセス2 価格の最適化 スレッド1 分割された計算 スレッド2 分割された計算 スレッド3 分割された計算
9.
マルチスレッドプログラミングの怖さ ?マルチスレッドプログラムでは原則として各スレッドは同じメモリ空間を 共有. ? 変数に値を代入するだけでスレッド間でデータを引き渡し可能. ?他のスレッドが使っているデータを容易に壊し得ることも意味する. ?「同期」や「排他制御」の問題. ?後のスライドでも同期の問題については詳しく説明する. 9
10.
並列処理の分類 ?命令とデータの流れに基づく分類(フリンの分類) ? SISD ? SIMD ?
MISD ? MIMD ?メモリ構成に基づく分類 ? 分散メモリを使用するマルチノード ? シェアードメモリを使用するマルチプロセッサ ?プログラムレベルでの分類 ? タスク並列化 ? データ並列化 10
11.
命令とデータの流れに基づく分類 ?フリンの分類 ?SISD (Single Instruction
Single Data) 従来のコンピュータ(逐次アーキテクチャ).搭載されているコアは1つ.実 行される命令ストリームは1つ.演算は1つのデータストリームで実行. ?SIMD (Single Instruction Multiple Data): 複数のコアが搭載されている.すべてのコアが常に同じ命令ストリームを実 行.演算はそれぞれ異なるデータストリームで実行. ?MISD (Multiple Instruction Single Data): 各コアが別々の命令ストリームを通じて同じデータストリームを処理する. ?MIMD (Multiple Instruction Multiple Data): 複数のコアが複数のデータストリームを処理し,それぞれ別個の命令を実行. 11
12.
フリンの分類 12 データ 命令 Single Instruction Single Data (SISD) Multiple
Instruction Single Data (MISD) Single Instruction Multiple Data (SISD) Multiple Instruction Multiple Data (MIMD) Single Multiple MultipleSingle MISDは珍しい.
13.
メモリ構成に基づく分類 ?メモリの構成に基づいてコンピュータアーキテクチャをさらに細かく分類 することもできる. ?分散メモリを使用するマルチノード ?シェアードメモリを使用するマルチプロセッサ 13 分散メモリを使用する マルチノードシステム 物理的に同じメモリに接続する マルチプロセッサアーキテクチャ シェアードメモリ
14.
マルチプロセッサアーキテクチャ ?通常はデュアルプロセッサから数十あるいは数百ものプロセッサに及ぶ. ?これらのプロセッサは物理的に同じメモリに接続されているか,PCI- Expressなどの低遅延リンクを共有する. ?マルチプロセッサにはマルチコアと呼ばれる複数のコアを搭載したCPUと 複数のCPUからなるコンピュータの両方が含まれる. ? 以下では特にマルチコアを念頭において話を進める. ?コアの数が特に多いマルチコアアーキテクチャを通常はメニーコアと呼ぶ. ?GPUはメニーコアアーキテクチャに相当する. 14
15.
プログラムレベルでの分類 ?タスク並列化 ? 個別に処理することが可能であり,かつ大部分を並行して実行できるタス クや関数が大量にある場合. ? タスク並列化では機能を複数のコアに分散させることに焦点を合わせる. ?データ並列化 ?
同時に処理できるデータ要素が大量にある場合. ? データ並列化ではデータを複数のコアに分散させることに焦点を合わせる. ?CUDAプログラミングはデータ並列化に関する処理として表現できる問題 に適している. 15
16.
第2節:CPUとGPU 16
17.
CPUコアとGPUコア ?CPUアーキテクチャとGPUアーキテクチャはメニーコア及びマルチコアと して分類されるがCPUコアとGPUコアは全く異なる. ?CPUコア ? CPUコアは比較的高度なコアであり,逐次プログラムの実行を最適化する ことを目的として,非常に複雑な制御ロジックのために設計されている. ?GPUコア ? GPUコアは比較的軽量なコアであり,並列プログラムのスループットに焦 点を合わせて,より単純な制御ロジックを持つデータ並列化タスクのため に最適化されている. 17
18.
ヘテロジニアスコンピューティング ?CPUだけを搭載するコンピュータから,複数の処理コンポーネント(GPUな ど)を搭載したコンピュータに. ? CPUとGPUは一般的には一つのコンピュータ内でPCI-Expressバスによって接 続される別々の処理コンポーネントである. ?ホモジニアス(同種)システムからヘテロジニアス(異種)システムへ. 18 DRAM DRAM キャッシュ CU ALU
ALU ALU ALU PCI Express CPU GPU CU:制御装置,ALU:算術論理演算回路,キャッシュ:主記憶装置,DRAM:半導体メモリの1種
19.
CUDA ?CUDAを利用すればCPUで従来行ってきたのと同じように,GPUをコンピュー ティングに活用できる. ?CUDAプログラムは以下の2つの部分で構成されている. ? CPUで実行されるホストコード ? GPUで実行されるデバイスコード ?NVIDIAのCUDAコンパイラであるnvccはコンパイルプロセスでデバイスコー ドをホストコードから切り離す. ?
ホストコードは標準のCコードでありCコンパイラによってコンパイルされる. ? デバイスコードはCUDA Cで記述され,データ並列化関数をラベル付けする ためのキーワードによって拡張される.これらのデータ並列化関数はカーネ ルと呼ばれる.デバイスコードはnvccによってコンパイルされる. 19
20.
Hallo World from
GPU 20
21.
Hallo World from
GPU ?nvccでコンパイル.基本的にはC言語と同じ. 21 ?しかし,CUDAを直接書くこ とは最近は少なくなってきた. ?Pythonライブラリの進化.
22.
Python+GPU ?Numba:CUDAに近い書き方. https://qiita.com/hoto17296/items/332da1d57173534c3aa7 ?cupy:numpyとほぼ変わらない仕様. https://github.com/ShigekiKarita/cupy-examples/blob/master/doc.org 22
23.
第3節:並列計算の設計方法 23
24.
Fosterによる設計方法論 ?既存のコードから時間のかかっている場所(Hotspot)を探す. ?Hotspotが並列化可能かを検討する ?並列化可能な領域に対して以下のような手順で並列化を検討する. 24 Problem Partition Communication Agglomeration Mapping
25.
Partitioning ?可能な限りの並列性を見つけ,要素タスクを抽出する. ?Domain Decomposition ? データを分割する. ?
分割されたデータに計算を関連づける方法を決める, ?Functional Decomposition ? 計算を分割する. ? 分割された個々の計算にデータを関連づける方法を決める. ?しばしばパイプライン手法が使われる. 25
26.
Partitioning:パイプライン手法 26 前のデータのDetermine image locationの処理が終わらないと次 のTrack
position of instrumentが始まらないように設計. ↑依存性を考慮.
27.
Communication ?局所的通信 ? ある計算実行において少数のタスクのみが関与する. ?大域的通信 ? ある計算実行において多くのタスクが関与する. ?大域的な通信は局所的通信と比べてオーバーヘッドが大きい. ?
アーキテクチャに依存する. ? 通信に分散メモリ型を使う場合は大きなオーバーヘッドとなる. 27
28.
Agglomeration ?性能やプログラム容易性を向上させるため,タスクのグループ化を行って より大きなタスクにする処理. ?通信オーバーヘッドの減少. ? 局所生の増大. ? 送信タスクや受信タスクのグループ化. ?並列設計のスケーラビリティの維持. ?タスクを分割しすぎると通信に時間がかかる(オーバーヘッド).した がって,適度な塊にタスクをまとめる必要がある. 28
29.
Agglomeration 29
30.
Mapping ?タスクをプロセスに割り当てる処理. ?プロセッサ利?率最?化かつプロセッサ間通信最?化を図る. ? プロセッサ利?率--- 現在考えている問題の解法において実際にプロセッサ が動作している時間の割合の平均値. ?プロセッサ利?率最?化とプロセッサ間通信最?化はしばしば競合する. (例)すべてのタスクを?つのプロセッサに割り付ければ? →
プロセッサ利?率は最悪(他のプロセッサが放置)であるが、プロセッサ 間通信は最善(0)となる 30
Download