Mercurial > hg > Papers > 2015 > yuhi-master
annotate paper/chapter4.tex @ 67:a63c2d9d7db9
fix slide
author | Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 18 Feb 2015 08:29:48 +0900 |
parents | 7956856211c5 |
children | f9b73e12a52f |
rev | line source |
---|---|
7 | 1 \chapter{マルチコアへの対応} |
8
8fa7b93195cf
multicore(benchmark is not yet)
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
7
diff
changeset
|
2 Cerium は Cell 上で並列に動作するフレームワークであったが、 Mac OS X 、 Linux 上でも並列に実行させることを可能にした。 |
8fa7b93195cf
multicore(benchmark is not yet)
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
7
diff
changeset
|
3 |
7 | 4 \section{マルチコア上での実行の機構} |
12 | 5 Cell には MailBox という機能がある。 |
15 | 6 Cell は Shared Memory でないので、 Memory に直接アクセスできない。 |
7 そこで MailBox を用いて双方向のデータの受け渡しを可能にしている。 | |
8 MailBox は FIFO キュー構造になっており、Device と Host で | |
12 | 9 この MailBox に対応させる形で Synchronized Queue を用いて MacOSX 、 |
10 Linux 用の TaskManager へ MailBox を移植した。 | |
11 | |
12 Syncronized Queue はバイナリセマフォで管理されており、Queue を操作しているスレッドは常に一つになる。 | |
8
8fa7b93195cf
multicore(benchmark is not yet)
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
7
diff
changeset
|
13 各スレッドは Input 用と Output 用として Synchronized Queue を2つ持っており、管理スレッドから Task を受けて |
8fa7b93195cf
multicore(benchmark is not yet)
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
7
diff
changeset
|
14 並列に実行する。 |
8fa7b93195cf
multicore(benchmark is not yet)
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
7
diff
changeset
|
15 |
15 | 16 \section{DMA} |
17 Cell ではデータの受け渡しとして MailBox 以外に DMA 転送を使用する方法がある。 | |
18 CPU を介さずに周辺装置とメモリ間でデータ転送を行う方式である。 | |
10
1519674c30ab
dragon and firefly spec
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
8
diff
changeset
|
19 |
15 | 20 Cerium も DMA 転送を用いている箇所がある。 |
21 しかしマルチコア CPU 上で実行する場合は各 CPU で同じメモリ空間を利用できる。 | |
22 よって DMA 転送を用いていた部分をポインタ渡しを行うように修正し、 | |
23 メモリに直接アクセスさせることで速度の向上が見込める。 | |
33
417431560eed
benchmark data parallel
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
15
diff
changeset
|
24 |
417431560eed
benchmark data parallel
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
15
diff
changeset
|
25 更に、DMA には prefetch 機能がある。 |
417431560eed
benchmark data parallel
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
15
diff
changeset
|
26 DMA の転送効率を向上させるため、 DMA で転送する送信データを予め取り込むことができる。 |
417431560eed
benchmark data parallel
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
15
diff
changeset
|
27 Cerium では DMA によるprefetch、DMA を用いないポインタ渡し、更に明示的なコピーによるデータ転送をサポートする。 |
35
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
28 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
29 \section{データ並列} |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
30 \label{sec:multicore_dataparallel} |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
31 並列プログラミングを行う際、並列化の方式としてタスク並列とデータ並列の2つがある。 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
32 Cerium における並列処理は、タスク並列により実現されている。 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
33 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
34 タスク並列は1つのデータに対して異なる処理方法を適用し、それぞれ独立して実行させるものである。 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
35 一方で1つの Task に対して多くのデータを与え、データごとに独立した処理を行わせる事をデータ並列という。 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
36 プログラムを並列化する際はどちらの並列化手法が適しているか考える必要がある。 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
37 独立した Task が充分にある場合はタスク並列が有効となる。 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
38 処理対象となるデータが充分な数のサブデータへ分割することが可能で、 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
39 サブデータへの処理を行うことが元のデータへの処理と同じになる場合、データ並列が有効となる。 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
40 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
41 本研究で Cerium でデータ並列による実行を可能にした。 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
42 Cerium でデータ並列実行を行う場合、Task を spwan API でなく iterate API で生成すればよい。 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
43 iterate API は複数の length を引数とし、 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
44 length の値がデータ分割後に各 Task が担当するサイズ、length の個数がデータの次元数となる。 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
45 これを元にScheduler が各 Task が担当する index を計算し、Task に set\_param する。 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
46 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
47 index の割り当ての例を表:\ref{table:dataparallel_index}に示す。 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
48 データ数10個の入力を持つ Task に対して CPU 数4、 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
49 一次元における分割でデータ並列実行した場合の index の割り当ては表:\ref{table:dataparallel_index}になる。 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
50 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
51 この例だと各 CPU に対する index の割り当ては CPU0 は index 0、4、8、 CPU1 は index 1、5、9、 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
52 CPU2 は index 2、6、CPU3 は index 3、7となる。 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
53 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
54 \begin{tiny} |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
55 \begin{table}[htpb] |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
56 \begin{center} |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
57 \small |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
58 \begin{tabular}[htpb]{c||c|c|c|c} |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
59 \hline |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
60 stage & CPU0 & CPU1 & CPU2 & CPU3 \\ |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
61 \hline |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
62 \hline |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
63 1 & 0 & 1 & 2 & 3 \\ |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
64 \hline |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
65 2 & 4 & 5 & 6 & 7 \\ |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
66 \hline |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
67 3 & 8 & 9 & & \\ |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
68 \hline |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
69 \end{tabular} |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
70 \caption{データ並列実行時の index の割り当て} |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
71 \label{table:dataparallel_index} |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
72 \end{center} |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
73 \end{table} |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
74 \end{tiny} |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
75 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
76 並列プログラミングだと、並列化部分が全て同一の Task であるということは少なくない。 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
77 その際、 Task 生成部分をループで回すことなく、iterate API により簡単な Syntax で記述することができる。 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
78 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
79 マルチコア CPU 上でデータ並列実行する場合、ソースコード:\ref{src:multiply_cpu}のように Task を記述する。 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
80 なお、2つの input データの積を output データに格納する例題、 multiply を用いた。 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
81 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
82 \begin{lstlisting}[frame=lrbt,label=src:multiply_cpu, caption=Multiply(CPU),numbers=left] |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
83 static int |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
84 run(SchedTask *s, void *rbuf, void *wbuf) { |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
85 float *indata1, *indata2, *outdata; |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
86 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
87 indata1 = (float*)s->get_input(rbuf, 0); |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
88 indata2 = (float*)s->get_input(rbuf, 0); |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
89 outdata = (float*)s->get_output(wbuf, 0); |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
90 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
91 long id = (long)s->get_param(0); |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
92 outdata[id] = indata1[id] * indata2[id]; |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
93 return 0; |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
94 } |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
95 \end{lstlisting} |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
96 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
97 Task 間で共有する Input/Output データと自分が計算を行う index は Scheduler により送られてきている。 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
98 get\_input 、get\_output API を用いて Input/Output データを取得し、get\_param API で担当する index を取得する。 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
99 後は各自担当範囲に対して計算を行うだけでよい。 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
100 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
101 データ並列で実行する場合、1つの Input と Output を各 Task 間で共有し、 |
7956856211c5
move data multicore-parallel from GPGPU-chapter to Multicore-chapter
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
33
diff
changeset
|
102 各 Task は自分が担当する index に対してのみ計算を行うため、少ないコピーに抑えられる。 |