7
|
1 <!DOCTYPE html>
|
0
|
2 <html>
|
1
|
3 <head>
|
|
4 <meta charset='utf-8'>
|
|
5 <title>Seminar</title>
|
0
|
6
|
1
|
7 <!--
|
|
8 Notes on CSS media types used:
|
|
9
|
|
10 1) projection -> slideshow mode (display one slide at-a-time; hide all others)
|
|
11 2) screen -> outline mode (display all slides-at-once on screen)
|
|
12 3) print -> print (and print preview)
|
|
13
|
|
14 Note: toggle between projection/screen (that is, slideshow/outline) mode using t-key
|
|
15
|
|
16 Questions, comments?
|
|
17 - send them along to the mailinglist/forum online @ http://groups.google.com/group/webslideshow
|
|
18 -->
|
0
|
19
|
1
|
20 <!-- style sheet links -->
|
|
21 <link rel="stylesheet/less" href="themes/blank/projection.css.less" media="screen,projection">
|
|
22 <link rel="stylesheet/less" href="themes/blank/screen.css.less" media="screen">
|
|
23 <link rel="stylesheet/less" href="themes/blank/print.css.less" media="print">
|
|
24
|
|
25 <link rel="stylesheet/less" href="blank.css.less" media="screen,projection">
|
|
26
|
|
27 <!-- Notes about less css support
|
|
28 - all less stylesheets (*.css.less) need to get listed/loaded first (before the less.js script)
|
|
29 - find more info about less.js online @ http://lesscss.org
|
0
|
30
|
1
|
31 ***** NOTE:
|
|
32 less.js browser script currently won’t work if you’re using Google Chrome
|
|
33 and the path to your page starts with "file:///" due to a known Chrome issue.
|
|
34 (In the developer/js console you will see:
|
|
35 XMLHttpRequest cannot load file:///../s6/shared/projection.css.less.
|
|
36 Cross origin requests are only supported for HTTP.)
|
|
37 -->
|
0
|
38
|
1
|
39 <!-- add js libs (less, jquery) -->
|
|
40 <script src="js/less-1.1.4.min.js"></script>
|
|
41 <script src="js/jquery-1.7.min.js"></script>
|
0
|
42
|
1
|
43 <!-- S6 JS -->
|
|
44 <script src="js/jquery.slideshow.js"></script>
|
|
45 <script src="js/jquery.slideshow.counter.js"></script>
|
|
46 <script src="js/jquery.slideshow.controls.js"></script>
|
|
47 <script src="js/jquery.slideshow.footer.js"></script>
|
|
48 <script src="js/jquery.slideshow.autoplay.js"></script>
|
|
49 <script>
|
|
50 $(document).ready( function() {
|
|
51 Slideshow.init();
|
|
52
|
|
53 // Example 2: Start Off in Outline Mode
|
|
54 // Slideshow.init( { mode: 'outline' } );
|
|
55
|
|
56 // Example 3: Use Custom Transition
|
|
57 // Slideshow.transition = transitionScrollUp;
|
|
58 // Slideshow.init();
|
0
|
59
|
1
|
60 // Example 4: Start Off in Autoplay Mode with Custom Transition
|
|
61 // Slideshow.transition = transitionScrollUp;
|
|
62 // Slideshow.init( { mode: 'autoplay' } );
|
|
63 } );
|
|
64 </script>
|
|
65
|
|
66 <!-- Better Browser Banner for Microsoft Internet Explorer (IE) -->
|
|
67 <!--[if IE]>
|
|
68 <script src="js/jquery.microsoft.js"></script>
|
|
69 <![endif]-->
|
0
|
70
|
1
|
71 </head>
|
|
72 <body>
|
0
|
73
|
1
|
74 <div class="layout">
|
|
75 <div id="header"></div>
|
|
76 <div id="footer">
|
|
77 <div align="right">
|
|
78 <img src="images/concurrency.png" width="200">
|
|
79 </div>
|
|
80 </div>
|
|
81 </div>
|
|
82
|
|
83 <div class="presentation">
|
0
|
84
|
1
|
85 <!-- add slides here; example -->
|
|
86
|
|
87 <div class='slide cover'>
|
|
88 <table width="90%" height="90%" border="0" align="center">
|
|
89 <tr>
|
|
90 <td><div align="center">
|
7
|
91 <h1><font color="#808db5">CeriumにおけるGPGPUの最適化</font></h1>
|
1
|
92 </div></td>
|
|
93 </tr>
|
|
94 <tr>
|
|
95 <td><div align="left">
|
|
96 Yuhi TOMARI
|
|
97 <script>
|
|
98 var date = new Date();
|
|
99 var year = date.getFullYear();
|
|
100 var month = date.getMonth();
|
|
101 var day = date.getDate();
|
|
102
|
|
103 var monthList = new Array("January","February","March","April","May","June",
|
|
104 "July","August","September","October","November","December");
|
|
105
|
|
106 document.write(monthList[month]+" "+day+", "+year);
|
|
107
|
|
108 </script>
|
|
109 <hr style="color:#ffcc00;background-color:#ffcc00;text-align:left;border:none;width:300%;height:0.2em;">
|
|
110 </div></td>
|
|
111 </tr>
|
|
112 </table>
|
|
113 </div>
|
|
114
|
|
115 <div class='slide'>
|
|
116 <h2>研究目的</h2>
|
7
|
117 <p>
|
|
118 当研究室ではCellおよびLinux、
|
|
119 Mac OSX上で動く並列プログラミングフレームワーク、
|
|
120 Ceriumの開発・改良を行っている。
|
|
121 </p>
|
|
122 <p>本研究では新たにGPU上での並列実行に対応し、
|
|
123 ヘテロジニアス(異種混合)環境下でのプログラミングをサポートする
|
|
124 </p>
|
|
125 <p>
|
|
126 GPGPUでは通常のマルチコア<font color="red">CPUとは異なる並列プログラミング</font>
|
|
127 と<font color="red">特別なチューニング</font>が必要となる。
|
|
128 そこでCeriumを用いてその差を吸収し、自動的なチューニングを可能にする。
|
|
129 </p>
|
|
130 <p>
|
|
131 しかし、GPUのみで並列計算を行った場合、Taskによっては並列度が出ない場合がある。
|
|
132 そこでチューニングの一環として、MultiCoreとGPU上での同時実行を可能にする。
|
|
133 </p>
|
|
134 </div>
|
|
135
|
|
136 <!-- h1.hidden => use heading just for table of contents (toc) -->
|
|
137 <div class='slide'>
|
|
138 <h2>進捗</h2>
|
|
139 <dl>
|
|
140 <dt>Scalaで遊んでた</dt>
|
|
141 <dt>mallocのお勉強</dt>
|
|
142 <dd>kernel reading party(小崎さん)</dd>
|
|
143 <dd><a href="http://shelby.tv/video/youtube/0-vWT-t0UHg/the-67th-yokohama-kernel-reading-party">動画</a></dd>
|
|
144 <dd><a href="http://www.slideshare.net/kosaki55tea/glibc-malloc">資料</a></dd>
|
|
145 </div>
|
|
146
|
|
147 <div class='slide'>
|
|
148 <h2>mallocってなんだっけ……?</h2>
|
|
149 <pre class="code">
|
|
150 void *malloc(size_t size);</pre>
|
|
151 <img src="images/malloc.png" width="500">
|
1
|
152 <ul>
|
7
|
153 <li>mallocはsizeバイト分のメモリを割り当て、ポインタを返す</li>
|
|
154 <li>返ってくるのはvoidのポインタなので、戻り値を型でキャストする必要がある</li>
|
|
155 <li>中身は初期化されていない</li>
|
|
156 <li>確保した領域はfreeを忘れずに</li>
|
2
|
157 </ul>
|
7
|
158 <pre class="code">
|
|
159 char *str = (char*)malloc(length); // 使う型でキャストする</pre>
|
2
|
160 </div>
|
|
161
|
|
162 <div class='slide'>
|
7
|
163 <h2>古典的malloc(K&R malloc)</h2>
|
|
164 <img src="images/heap.png" width="700">
|
|
165 <ul>
|
|
166 <li>使用可能なブロックを繋げたリスト構造、free list (freeされているブロックのlist?)
|
|
167 <li>listを使ってメモリを管理
|
|
168 <li>管理領域(header)分だけ多くallocateして、先頭に管理領域を付加
|
|
169 <li>first fit
|
|
170 </ul>
|
|
171 <hr>
|
|
172 <pre class="code">
|
|
173 union header {
|
|
174 struct {
|
|
175 union header *ptr; // 空きリストの上なら次のブロック
|
|
176 unsigned size; // このブロックの大きさ
|
|
177 } s;
|
|
178 };</pre>
|
|
179 </div>
|
|
180
|
|
181 <div class='slide'>
|
|
182 <h2>First Fit</h2>
|
|
183 <p>
|
|
184 リストを頭から見ていって、最初に見つけたものを使用するというすごいシンプルな方法。
|
|
185 </p>
|
|
186 <img src="images/firstfit.png" width="500">
|
4
|
187 </div>
|
|
188
|
|
189 <div class='slide'>
|
7
|
190 <h2>First Fit</h2>
|
|
191 <img src="images/firstfit2.png" width="500">
|
|
192 <p>実は、もう一個先にもっと適切なブロックがあった。こんな場合に対応できない…というか、対応しないのがfirst fit。</p>
|
|
193 <p>あまりよくない……</p>
|
|
194 </div>
|
|
195
|
|
196 <div class='slide'>
|
|
197 <h2>free</h2>
|
|
198 <pre class="code">
|
|
199 void free(void *ptr);</pre>
|
|
200 <p>
|
|
201 メモリの開放自体は、使用中のブロックをfree listに追加するだけで良い。
|
|
202 引数で受け取ったポインタ部分を開放したら良い……かに思える。
|
|
203 でもそれだけじゃダメで、開放したい領域と隣接しているブロックが空きブロックなら併合しないといけない。
|
|
204 </p>
|
|
205 <img src="images/free_merge.png" width="700">
|
|
206 </div>
|
|
207
|
|
208 <div class='slide'>
|
|
209 <h2>free</h2>
|
|
210 <img src="images/free1.png" width="700">
|
|
211 <p>
|
|
212 listから最初のポインタと、その次のポインタを取得。prev < p < nextを満たすまで走査していく
|
|
213 </p>
|
|
214 </div>
|
|
215
|
|
216 <div class='slide'>
|
|
217 <h2>free</h2>
|
|
218 <img src="images/free2.png" width="700">
|
|
219 <p>あった!!</p>
|
|
220 <p>
|
|
221 開放後に前後のメモリと併合する必要がある場合があるので、prevとp・pとnextが隣接してるか判定する。
|
|
222 </p>
|
|
223 <ul>
|
|
224 <li>(prev+prev-> size) != p なので、隣接していない </li>
|
|
225 <li>(p+p-> size) = next なので、隣接している</li>
|
|
226 <p>ブロックが隣接している場合は併合する。</p>
|
|
227 </div>
|
|
228
|
|
229 <div class='slide'>
|
|
230 <h2>free</h2>
|
|
231 <img src="images/free_after.png" width="700">
|
|
232 <p>チェックに引っかかったところをマージする。</p>
|
|
233 </div>
|
|
234
|
|
235 <div class='slide'>
|
|
236 <h2>古典的malloc & freeまとめ</h2>
|
|
237 <p>フラグメンテーションが頻発する。</p>
|
|
238 <ul>
|
|
239 <li>このmallocが主流だった時は「メモリはプログラムの最初に一気に確保するもの」だった</li>
|
|
240 <li>メモリが充分に空いている状態で、
|
|
241 必要なメモリを一気に確保するならフラグメンテーションは起きにくい</li>
|
|
242 <li>今はJava・C++のようなオブジェクト指向言語、
|
|
243 Rubyのようなスクリプト言語等、小さいmallocが頻発するものが多い</li>
|
|
244 <li>それをfirst fitでやるのはよくない</li>
|
|
245 </ul>
|
|
246
|
|
247 </div>
|
|
248
|
|
249
|
|
250 <div class='slide'>
|
|
251 <h2>mallocの改良</h2>
|
|
252 <p>そもそも、一つのfree listで管理することが無理がある</p>
|
|
253 <p>サイズ16Byte用のリスト、サイズ24Byte用のリスト……というようにリストを複数作ってやる</p>
|
|
254 <table border="0">
|
5
|
255 <tr>
|
|
256 <th>
|
7
|
257 <img src="images/free_list_list.png" width="400">
|
|
258 </th>
|
|
259 <th valign="top" align="left">
|
|
260 <ul>
|
|
261 <li>mallocで要求されたsizeを8で割れば自分が使用するindexとなる</li>
|
|
262 <li>無限にリストを増やすわけにはいかないので、このリストを使うのは512バイト以下の場合のみ</li>
|
|
263 <li>512バイト以上の大きいデータの場合は、特殊な管理を行う</li>
|
|
264 <li>大きいデータと小さいデータを一緒に管理するからフラグメンテーションが進むんだ<br>
|
|
265 →大きいデータ用の領域がもう一個欲しい<br>→そうだ、mmapを使おう</li>
|
5
|
266 </th>
|
|
267 </tr>
|
|
268 </table>
|
|
269 </div>
|
|
270
|
|
271
|
|
272 <div class='slide'>
|
7
|
273 <h2>mmapってなんだっけ……?</h2>
|
|
274 <ul>
|
|
275 <li>ファイル(fdで指定したもの)をメモリにマップする</li>
|
|
276 <li>fdで"/dev/zero"を指定することでmmapをメモリ確保APIとして使用</li>
|
|
277 <li>このAPIを使ってHuge Blockはmmapで直接kernelから取得する</li>
|
|
278 </ul>
|
|
279 <pre class="code">
|
|
280 void *alloc_mmap(size_t size) {
|
|
281 int fd = open("/dev/zero", O_RDONLY);
|
|
282 void *ret = mmap(addr, length, prot, flags, fd, offset);
|
|
283 return ret;
|
|
284 }</pre>
|
|
285 <table border="1" >
|
|
286 <tr bgcolor="dbffa3">
|
|
287 <th align="left" style="margin:10px 10px 10px;">addr</th><th align="left">mapするメモリアドレス。NULLを渡せばkernelがアドレスを選択する。</th>
|
5
|
288 </tr>
|
|
289
|
7
|
290 <tr bgcolor="palegreen">
|
|
291 <th align="left">length</th><th align="left">addrから何バイトマッピングするか。</th>
|
|
292 </tr>
|
|
293
|
|
294 <tr bgcolor="dbffa3">
|
|
295 <th align="left" >prot</th><th align="left">マッピングのメモリ保護の指定。Read Write Exec None等がある。</th>
|
|
296 </tr>
|
|
297 <tr bgcolor="palegreen">
|
|
298 <th align="left">flags</th><th align="left">マップを要求された時、共有するかコピーを渡すか。</th>
|
|
299 </tr>
|
|
300 <tr bgcolor="dbffa3">
|
|
301 <th align="left">offset</th><th align="left">ファイルの何バイト目からをメモリにマップするか。</th>
|
|
302 </tr>
|
5
|
303 </table>
|
4
|
304 </div>
|
|
305
|
|
306 <div class='slide'>
|
7
|
307 <h2>Huge Block</h2>
|
|
308 <p>mmapで確保するので、free listからは独立している。
|
5
|
309 <table>
|
|
310 <tr>
|
7
|
311 <th>
|
|
312 <img src="images/huge_block.png" width="500">
|
|
313 </th>
|
|
314 <th valign="top" align="left">
|
5
|
315 <p>
|
7
|
316 listを使って管理しているわけではないので、listをたどったりしなくて良い。</p>
|
5
|
317 <p>
|
7
|
318 ほしかったらmmapして、いらなくなったらmunmapすればよい。
|
5
|
319 </p>
|
|
320 </th>
|
|
321 </tr>
|
|
322 </table>
|
7
|
323 <ul>
|
|
324 <li>free list上でフラグメンテーションが起きにくくなった(当たり前)</li>
|
|
325 <li>メモリの無駄が少ない<br>
|
|
326 大きなメモリは同じサイズでもう一度mallocされる可能性は低いので、
|
|
327 使わなくなったらすぐOSに返却するのは正しい</li>
|
|
328 </ul>
|
3
|
329 </div>
|
|
330
|
1
|
331 </div> <!-- presentation -->
|
|
332 </body>
|
0
|
333 </html>
|