# HG changeset patch # User Yutaka_Kinjyo # Date 1328603939 -32400 # Node ID 5dbcea03717e252cb85aa6beb213c21cc0e640dc # Parent 6d80c2c895e49b062d93898f3877f4021cd0b71c fix diff -r 6d80c2c895e4 -r 5dbcea03717e paper/Makefile --- a/paper/Makefile Sat Jan 14 00:16:39 2012 +0900 +++ b/paper/Makefile Tue Feb 07 17:38:59 2012 +0900 @@ -3,7 +3,7 @@ SRC = $(wildcard *.tex) LATEX = platex -BIBTEX = pbibtex +BIBTEX = jbibtex DVIPS = dvips DVIPDFM = dvipdfmx RM = rm -f diff -r 6d80c2c895e4 -r 5dbcea03717e paper/appendix.tex --- a/paper/appendix.tex Sat Jan 14 00:16:39 2012 +0900 +++ b/paper/appendix.tex Tue Feb 07 17:38:59 2012 +0900 @@ -2,5 +2,5 @@ \addcontentsline{toc}{chapter}{発表文献} \begin{itemize} -\item 河野研ゼミ +\item \end{itemize} diff -r 6d80c2c895e4 -r 5dbcea03717e paper/chapter1.tex --- a/paper/chapter1.tex Sat Jan 14 00:16:39 2012 +0900 +++ b/paper/chapter1.tex Tue Feb 07 17:38:59 2012 +0900 @@ -1,4 +1,248 @@ -\chapter{序論} +\chapter{Cell Broadband Engine} +本研究で実験題材の対象となった Cell アーキテクチャについて説明する。 + +Cell Broadband Engine \cite{cell} は、ソニー・コンピュータエンタテインメント、 +ソニー、IBM , 東芝によって開発されたマルチコア CPU である。 +Cell は、1基の制御系プロセッサコア PPE ( PowerPC Processor Element ) と +8基の演算系プロセッサコア SPE ( Synergistic Processor Element ) で構成される。 +各プロセッサコアは、EIB (Element Interconnect Bus) +と呼ばれる高速なバスで接続されている。また、EIB はメインメモリや +外部入出力デバイスとも接続されていて、 +各プロセッサコアは EIB を経由してデータアクセスをおこなう。 +本研究で用いた PS3Linux (Yellow Dog Linux 6.2) では、6 個の SPE を +使うことが出来る ( \figref{cell_arch} ) + +この PPE と SPE の2種類の CPU を、プログラマ自身が用途に +合わせて適切に使い分けるように考慮する必要がある。 + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.8]{./images/cell-main.pdf} + \end{center} + \caption{Cell Broadband Engine Architecture} + \label{fig:cell_arch} +\end{figure} + + +\section{PPE (PowerPC Processor Element)} + +PPE は Cell Broadband Engine のメインプロセッサで、複数の SPE を +コアプロセッサとして使用することができる汎用プロセッサである。 +メインメモリや外部デバイスへの入出力、SPEを制御する役割を担っている。 +PPU (PowerPC Processor Unit) は、 +PPE の演算処理を行うユニットで、PowerPC アーキテクチャをベースとした +命令セットを持つ。PPSS (PowerPC Processor Storage Subsystem) は +PPU からメインメモリへのデータアクセスを制御する +ユニットである (\figref{ppe}) 。 + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.6]{./images/PPE.pdf} + \end{center} + \caption{PPE (PowerPC Processor Element)} + \label{fig:ppe} +\end{figure} + +\section{SPE (Synergistic Processor Element)} \label{sec:spe} + +SPE には 256KB の Local Store (LS) と呼ばれる、SPE から唯一、 +直接参照できるメモリ領域があり、バスに負担をかける事無く +並列に計算を進めることが出来る。SPE からメインメモリへは、 +直接アクセスすることは出来ず、SPE を構成する一つである +MFC (Memory Flow Controller) へ、チャネルを介して DMA (Direct Memory Access) +命令を送ることで行われる (\figref{spe}) 。 + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.8]{./images/SPE.pdf} + \end{center} + \caption{SPE (Synergistic Processor Element)} + \label{fig:spe} +\end{figure} + +\section{Cell の基本性能} + +\subsection{DMA (Direct Memory Access)} + +\ref{sec:spe}節 で述べた通り、SPE は LS 以外のメモリに +直接アクセスすることができず、PPE が利用するメインメモリ上のデータに +アクセスするには DMA (Direct Memory Access) を用いる。 +DMA 転送とは、CPU を介さずに周辺装置とメモリとの間でデータ転送ことで、 +Cell の場合はメインメモリと LS 間でデータの転送を行う。手順としては以下の様になる。 + +\begin{enumerate} + \item SPE プログラムが MFC (Memory Flow Controller) に対して + DMA 転送命令を発行 + \item MFC が DMA Controller を介して DMA 転送を開始。 + この間、SPE プログラムは停止しない。 + \item DMA 転送の終了を待つ場合、SPE プログラム内で転送の完了を待つ +\end{enumerate} + +この時、DMA 転送するデータとアドレスにはいくつか制限がある。 +転送データが 16 バイト以上の場合、データサイズは 16 バイトの倍数で、 +転送元と転送先のアドレスが 16 バイト境界に揃えられている必要がある。 +転送データが 16 バイト未満の場合、データサイズは 1,2,4,8 バイトで、 +転送サイズに応じた自然なアライメントである (転送サイズのバイト境界に +揃えられている) ことが条件となる。 + +\subsection{SIMD (Single Instruction Multiple Data)} +Cell では、SPE に実装されている 128 ビットレジスタを用いて +SIMD を行うことが出来る。SIMD とは、1 つの命令で +複数のデータに対して処理を行う演算方式である (\figref{simd}) 。 + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.8]{./images/SIMD.pdf} + \end{center} + \caption{SIMD (Single Instruction Multiple Data)} + \label{fig:simd} +\end{figure} + +\figref{simd} のスカラ演算は以下のような式に当てはまる。 + +\begin{verbatim} +int a[4] = {1, 2, 3, 4}; +int b[4] = {5, 6, 7, 8}; +int c[4]; + +for (int i = 0; i < 4; i++) { + a[i] + b[i] = c[i]; +} +\end{verbatim} + +これに対し、SIMD 演算は以下のようになる。 + +\begin{verbatim} +vector signed int va = {1, 2, 3, 4}; +vector signed int vb = {5, 6, 7, 8}; +vector signed int vc; + +vc = spu_add(va, vb); +\end{verbatim} + +Cell の SIMD 演算では、vector 型の変数を用いる。 -\section{はじめに} -はじめに +このように、通常は 4 回計算するところを 1 回の計算で行うことが +できる反面、すべての演算を 128 ビットで計算するため、なるべく +効果的に行う様に工夫する必要がある。 + +\begin{verbatim} +int a, b, c; + +c = a + b; +\end{verbatim} + +この様な計算の場合でも 128 ビット同士の演算を行うため、無駄が生じる。 + +\subsection{Mailbox} \label{sec:mailbox} + +Mailbox とは SPE の MFC 内の FIFO キューであり、PPE と SPE 間の 32 ビット +メッセージの交換に用いられる。Mailbox では 3 つの振る舞いが +出来る様に設計されている (\figref{mailbox}) 。 + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.8]{./images/Mailbox.pdf} + \end{center} + \caption{Mailbox} + \label{fig:mailbox} +\end{figure} + +\begin{enumerate} +\item SPU Inbound Mailbox \\ + PPE から SPE へデータを渡すためのキュー。キューのエントリ数は + 実装依存による \cite{cell} が、研究環境では最大4個までのデータを蓄積できる。 + このキューが空の場合は、SPE は、データがメールボックスに書き込まれるまでは、 + 命令でストールする。読み出すデータの順番は書き込んだ順番に保証されている。 +\item SPU Outbound Mailbox \\ + SPE から PPE へのデータを渡すためのキュー。研究環境では最大1個までしか + データが蓄積できない。 +\item SPU Outbound interrupt Mailbox \\ + SPU Outbound Mailbox とほとんど同じだが、このキューでは SPE から + キューにデータが書き込まれると、PPE に対して割り込みイベントが + 発生し、データの読み出しタイミングを通知する事が出来る。 +\end{enumerate} + +\section{開発環境} + +\subsection{libSPE2} + +libSPE2 とは、PPE が SPE を扱うためのライブラリ群である \cite{libspe2} 。 +libSPE2 は SPE Context Creation、SPE Program Image Handling、 +SPE Run Control、SPE Event Handling、SPE MFC Problem State Facilities、 +Direct SPE Access for Applications という基本構成でできている。 +Cell の基本プログラムは次の様になる。 + +\begin{enumerate} +\item create N SPE context +\item Load the appropriate SPE executable object into each SPE context's local store +\item Create N threads +\item Wait for all N threads to terminate +\end{enumerate} + +\subsection{SPU C/C++ 言語拡張} +SPE では基本的な C 言語の機能の他に、Cell 特有の拡張が行われている +\cite{cell_cpp} 。 +\tabref{cell_cpp} に主な API を記す。 + +\begin{table}[htb] + \begin{center} + \caption{SPU C/C++ 言語拡張 API} + \label{tab:cell_cpp} + \begin{tabular}{|l|l|} + \hline + spu\_mfcdma32 & DMA 転送を開始する \\ + \hline + spu\_read\_in\_mbox & PPE からの mail を取得する \\ + \hline + spu\_write\_out\_mbox & PPE へ mail を送信する \\ + \hline + spu\_add、spu\_sub、spu\_mul & SIMD 演算 (加算、減算、乗算) \\ + \hline + \end{tabular} + \end{center} +\end{table} + +SPE を効率よく使う上で \tabref{cell_cpp} の様な Cell 特有の API や、 +SPE アセンブラ命令を学ぶことが必要となる。 + +\subsection{SPURS} + +ここでは、現在発表されている Cell の開発環境である SPURS について説明する。 + +SPURS \cite{spurs} は、閉じた並列分散と考えることができる Cell の環境で、 +いかに効率よく動作させるかということを考えたシステムである。 + +Cell の性能を存分に生かすためには SPE を効率よく使い切ることであり、 +SPE の動作を止めることなく、同期を最小限に行う必要がある。 +そこで SPURS では SPE を効率よく利用するために、PPE に依存せずに SPE コードを +選択し、実行することと機能は効率重視で割り切ることを挙げている。 +そのため、SPE 上にカーネルを組み込んでいる。 + +アプリケーションを複数 SPE で実行するとき、アプリケーションプログラムを +出来るだけ小さな単位(タスク)に分割し、通信ライブラリを用いて +タスク間を依存関係で結合する。 +LS 常駐のカーネルが、実行可能なタスクを選んで実行していく +(\figref{spurs}) 。 + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.6]{./images/spurs_task.pdf} + \end{center} + \caption{SPURS Task} + \label{fig:spurs} +\end{figure} + +これらの処理はデータを扱うため、SPURS はパイプラインで実行される +(\figref{spurs_pipeline}) 。 + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.6]{./images/spurs_pipeline.pdf} + \end{center} + \caption{SPURS Pipeline} + \label{fig:spurs_pipeline} +\end{figure} + +以上から、SPURS は複数の SPE を効率よく使うためのライブラリとして +優れた物であると思われるが、現在一般には公開されていない。 diff -r 6d80c2c895e4 -r 5dbcea03717e paper/chapter2.tex --- a/paper/chapter2.tex Sat Jan 14 00:16:39 2012 +0900 +++ b/paper/chapter2.tex Tue Feb 07 17:38:59 2012 +0900 @@ -1,4 +1,587 @@ -\chapter{議論} +\chapter{Cerium} \label{chapter:cerium} +Cerium \cite{gongo} は Cell 用の Fine-Grain Task Manager として同研究室の宮國が実装した。 +本章ではその実装について説明する + +\section{Cerium の概要} + +Cerium は、我々が提案したフレームワークで、TaskManager (\ref{sec:cerium_taskmanager}), +SceneGraph (\ref{sec:cerium_scenegraph}) と Rendering Engine (\ref{sec:cerium_renderingengine}) の +3つの要素から構成されており、PS3, Mac OS X, Linux 上でゲームフレームワークとして動作する。ゲーム中の +オブジェクトの振る舞いやルールは SceneGraph で管理し、それらの動きや Rendering の処理を動的に SPE に +割り振るカーネルとして、TaskManager が用いられる。PS3 の Graphics Engine の仕様は公開されておらず、 +Cerium は独自の Rendering Engine を有している。 + +\section{Cerium TaskManager} \label{sec:cerium_taskmanager} + +Task Manager は、 Task と呼ばれる、分割された各プログラムを管理する。 Task の単位は +サブルーチンまたは関数として、 Task 同士の依存関係を考慮しながら実行していく。 +先行研究において実装されていた TaskManager の API を \tabref{old_taskmanager_api} に示す。 +\begin{table}[htb] + \caption{旧Task Manager API} \label{tab:old_taskmanager_api} + \hbox to\hsize{\hfil + \begin{tabular}{|c|l|} \hline + create\_task & Task を生成する \\ \hline + run & 実行 Task Queue の実行 \\ \hline + allocate & 環境のアライメントを考慮した allocator \\ \hline + set\_inData & Task への入力データのアドレスを追加 \\ \hline + set\_outData & Task からのデータ出力先アドレスを追加 \\ \hline + set\_param & Task のパラメータ (32 bits) \\ \hline + wait\_for & Task の依存関係の考慮 \\\hline + set\_cpu & Task を実行する CPU の設定 \\ \hline + set\_post & Task が終了したら PPE 側で実行される関数の登録 \\ \hline + spawn & Task を実行 Task Queue に登録する \\ \hline + \end{tabular}\hfil} +\end{table} + +\section{Cerium における Task} \label{sec:task_depandency} + +Task は TaskManager を使って生成する。 Task を生成する際に、以下のような要素が設定可能 +である。 + +\begin{enumerate} +\item input data +\item output data +\item parameter +\item cpu type +\item dependency +\end{enumerate} + +input, output, data, parameter は関数でいうところの引数に価する。cpu type は Task が +PPE または SPE のどちらで実行されるかを示している。 dependency は他の Task との +依存関係を示している。依存関係の情報は PPE 側が持っており、 SPE, PPE の Task が終了 +すると、Task の終了が通知され、その通知に従って PPE が依存関係を処理していく(例: +Task A の終了通知を受け、 PPE は Task B を実行可能状態にする)。Task の依存関係の +処理を図を用いて説明する。\\ + +Task B は Task A の終了を待っている。他の Task の終了を待っている Task は、Wait Queue に、 +Task を待っていない Task は Active Queue に入れる。この時点で Task A が先頭にあるので +Task A が SPE に送られる(\figref{task-dependency1})。 + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.70]{./images/task-dependency1.pdf} + \end{center} + \caption{Task dependency 1} + \label{fig:task-dependency1} +\end{figure} + +\newpage + +そして、SPE に送られた Task A は SPE で処理が行われる(\figref{task-dependency2})。 + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.68]{./images/task-dependency2.pdf} + \end{center} + \caption{Task dependency 2} + \label{fig:task-dependency2} +\end{figure} + +Task A の処理が終了すると mail で Task B へ通知される。Task B はその通知を受け取ると +待ち状態が解除される(\figref{task-dependency3})。 + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.68]{./images/task-dependency3.pdf} + \end{center} + \caption{Task dependency 3} + \label{fig:task-dependency3} +\end{figure} + +待ち状態が解除された Task B は、Active Queue に追加され、 +この図(\figref{task-dependency4})では、Task C 終了後に +SPE に送られ処理が行われる。 + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.68]{./images/task-dependency4.pdf} + \end{center} + \caption{Task dependency 4} + \label{fig:task-dependency4} +\end{figure} + +\newpage + +\section{Task のスケジューリング} + +SPE は、Task を一つずつ受け取るのではなく、ある程度まとめて受け取る。それを TaskList +と呼んでいる。 TaskList は各 SPE 用に PPE側で生成される。(\figref{task_scheduler}) +SPE は 受け取ったTaskList に沿って Task を実行していき、 Task 毎に実行完了の Mail を送る。 +TaskList の Task をすべて実行すると、次の TaskList を要求する Mail を PPE 側に送る。 + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.61]{./images/scheduler.pdf} + \end{center} + \caption{Task scheduler} + \label{fig:task_scheduler} +\end{figure} + + +\section{Task の入出力} \label{sec:input_output} + +Task の入出力の API として、set\_inData, set\_param , set\_oudData がある。 +\begin{description} + +\item[set\_inData(index, addr, size)] は、 データを受け取る buffer の配列番号とデータのアドレス、そのデータのサイズを +引数として入力する。このデータは DMA 転送されるため、addr は 16 byte alignment が取れており、size は 16 byte の +倍数である必要がある。 + +\item[set\_param(index, param)] は、データを受け取る buffer の配列番号と 32bit のデータを渡す。set\_inData で渡すには +小さいデータを送るのに適している。 param はアドレスとしてではなく、値を Task オブジェクトが直接持っているので、 DMA +転送は行わない。 + +\item[set\_outData(index, addr, size)] は、Task のデータの出力先を指定する。使用方法は set\_inData と同じで、alignment, +byte 数に気をつける必要がある。 + +\end{description} +\section{SceneGraph} \label{sec:cerium_scenegraph} + +本研究では、ゲーム中の一つの場面 (Scene) を構成するオブジェクトやその振る舞い、ゲームのルールの集合を SceneGraph とする \cite{chiaki}。SceneGraph のノードは親子関係を持つ tree で構成される(\figref{scenegraph})。親子関係とは、親オブジェクトの +回転や平行移動などの行列計算による頂点座標の変更が、子オブジェクトにも反映する関係のことである。これは子に対して +スタックに積まれた親の変換行列を掛けることで実現できる。SceneGraph ノードは以下のようなデータと動作を持つ。 + +\begin{description} +\item[Vertex:] ポリゴンオブジェクトの頂点座標 +\item[Texture:] ポリゴンオブジェクトのテクスチャ座標 +\item[TextureImage:] テクスチャイメージ +\item[TransMatrix:] ポリゴンオブジェクトの変換行列 +\item[Coordinates:] オブジェクトの座標 +\item[Angle:] オブジェクトの角度 +\item[Move:] 自律的なオブジェクトの動き +\item[Collision:] 他のノードと衝突したときの動き +\end{description} + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.61]{./images/scenegraph.pdf} + \end{center} + \caption{SceneGraph} + \label{fig:scenegraph} +\end{figure} + +\subsection{Scene ポリゴンの生成} + +ゲーム中に登場するオブジェクトは、オープンソースの 3D モデリングツール +である Blender \cite{blender} を用いる。 +Blender で記述したポリゴンオブジェクトを、座標やテクスチャイメージを +埋め込んだ xml ファイルとして出力する。 +Blender にはPython インタプリタがあり、xml ファイルを生成する Python スクリプトを作成している。 +xml には、オブジェクトの名前、ポリゴン情報、ポリゴンに対応するテクスチャ座標、 +テクスチャイメージがある。 + +xml ファイル形式を採用している理由は、Cerium が MacOSX や PS3 Linux などの +複数の環境で動作することを目的としており、環境に依存しないテキスト形式での +データ構造を構築できるからである。また、Cerium は将来的にネットワークを +使用することを考えており、その際に有効なフォーマットであると考えたからである。\\ + +ネットワークを使用した例題として、Federated Linda \cite{akamine} +を用いた「水族館ゲーム」を赤嶺が作成した。 + +このゲームは、複数のクライアントのディスプレイを並べて使用する。各プレイヤーは1匹 +ずつ魚のオブジェクトが与えられ、それを自由に操作することができる。また、魚は画面の +端まで移動すると、自分の画面上からは消え、接続している他のプレイヤーの画面の端 +から出てくる。(\figref{aquarium}) このゲームは、初めに xml ファイルをすべての +プレイヤーが共有した状態で開始される。 + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.61]{./images/aquarium.pdf} + \end{center} + \caption{水族館ゲーム} + \label{fig:aquarium} +\end{figure} + +\subsection{SceneGraph オブジェクトの生成} \label{sec:cerium_renderingengine} + +Cerium は生成された xml ファイルから、そのパラメータを持つ SceneGraph オブジェクト +を生成する (Original SceneGraph)。ここで作られたオブジェクトはユーザには見せず、 +ユーザが該当する SceneGraph を生成したい場合は Original を参照し、そのコピー +(Copy SceneGraph) を渡す。 + +Original SceneGraph の情報は Cerium が配列として持っており、xml ファイルを +読み込んで生成された SceneGraph を SceneGraph ID の位置に格納する。 +SceneGraph ID は SceneGraph に割り当てられるグローバル ID である。配列に +格納する時点で登録された順に ID が割り当てられる。改良後では、同時に、 Scenegraph の +名前を key, ID を value として hash に登録しているので、ユーザは ID と +名前の両方から Scenegraph を生成することができる。 + + +\section{RenderingEngine} +RenderingEngineは TaskManager から提供される Task から構成され、主に以下の3つの Task から成る。(\figref{rendering_flow}) + +\begin{description} +\item[CreatePolygonTask: ] SceneGraph での処理結果を元に、モデリングデータの座標変換を行う +\item[CreateSpanTask: ] 座標変換されたポリゴンを、水平な線(Span)に分割する +\item[DrawSpanTask: ] 分割された Span を実際に画面へと描画する。 +\end{description} + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.5]{./images/rendering3.pdf} + \end{center} + \caption{Rendering flow} + \label{fig:rendering_flow} +\end{figure} + +これら Task の入出力のデータとして、PolygonPack, SpanPack がある。それぞれポリゴンの情報を格納する構造体、Spanの情報を格納する構造体である。Task と合わせてその構造体について説明していく。 + +\subsubsection{PolygonPack} + +PolygonPack は、SceneGraph から抽出されたポリゴンの集合である。CreatePolygonTask で扱う構造体である。 +以下に構造を示す。 + +\begin{verbatim} +// ポリゴンを構成する情報 +typedef struct TrianglePack { + // テクスチャ情報 + TriTexInfo tex_info; + + // ポリゴンを構成する頂点の情報 + VertexPack ver1, ver2, ver3; + + // 法線ベクトルの情報 + NormalPack normal1, normal2, normal3; + +} TrianglePack, *TrianglePackPtr; + +typedef struct PolygonPack { + + TrianglePack tri[MAX_SIZE_TRIANGLE]; + + struct POLYGON_info { + int size; + int light_pos[3]; // 光源の位置 + int light_rgb[3]; // 光源の色 + }info; + PolygonPack* next; +} PolygonPack, *PolygonPackPtr; +\end{verbatim} + +\begin{description} +\item[TriTexInfo] は、テクスチャイメージのアドレス、幅、高さ、 +縮小率が格納されている + +\item[VertexPack] は、ポリゴンの頂点座標と対応するテクスチャの座標が +格納されている + +\item[NormalPack] は、ポリゴンの法線ベクトルの情報が格納されている + +\newpage + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.70]{./images/polygonpack.pdf} + \end{center} + \caption{PolygonPack(TrianglePack)} + \label{fig:polyonpack} +\end{figure} + +\end{description} + +PolygonPack は光源やテクスチャ、頂点の情報から構成される。 +テクスチャの縮小率に関しては \ref{sec:cerium_scale} で詳しく説明する。 + +\subsubsection{SpanPack} + +SpanPack は、ポリゴンから抽出された Span の集合である。CreateSpan で PolygonPack を元に SpanPack が生成される。以下に構造を示す。 -\section{はじめに} -はじめに +\begin{verbatim} +class Span { +public: + // テクスチャ情報 + uint32 *tex_addr; + int tex_width, tex_height; + + // span の開始 x 座標、y 座標、長さ + int x, y, length_x; + + // span の z 座標(開始、終了) + float start_z, end_z; + + // span に対応するテクスチャの座標 + float tex_x1, tex_x2, tex_y1, tex_y2; + + // span の法線ベクトル + float normal_x, normal_y, normal_z; +}; + +class SpanPack { +public: /* fields */ + struct SpanInfo { + int start; + int size; + int y_top; + int light_pos[3]; + int light_rgb[3]; + } info; + Span span[MAX_SIZE_SPAN]; + SpanPack *next; +}; +\end{verbatim} + +Span は、その座標と対応するテクスチャの座標を持つ(\figref{cerium_span}) + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.80]{./images/spanpack.pdf} + \end{center} + \caption{Span の構造} + \label{fig:cerium_span} +\end{figure} + +Rendering には SpanPack を用いる。 +ここからは、SceneGraph から Rendering までの流れを それぞれの Task を用いて説明する。 + +\subsection{CreatePolygonTask} \label{createpolygonfromscenegraph} + +SceneGraph の move や collision を行い、各オブジェクトの変換行列 +を生成する。その後、SceneGraph が持つポリゴンの座標と法線ベクトルに +変換行列をかけ、得られた座標を PolygonPack に格納していく。 +これまでは関数で書かれていたが、SPE に処理を割り振ることも視野に入れ、 +Task で書いている。新しい Rendering のデータ構造で述べた法線ベクトルの +計算も追加している。以下がそのコードである。 + +\newpage + +\begin{verbatim} + +SceneGraphPtr sg_top = sg_draw_tree; + +// ポリゴンの1辺 +xyz1[0] = sg->coord_xyz[(i+0)*3]; +xyz1[1] = sg->coord_xyz[(i+0)*3+1]; +xyz1[2] = sg->coord_xyz[(i+0)*3+2]*-1.0f; +xyz1[3] = 1.0f; + +/* xyz2, xyz3 は省略 */ + +// ポリゴンの1辺の法線ベクトル +normal1[0] = sg->normal[(i+0)*3]; +normal1[1] = sg->normal[(i+0)*3+1]; +normal1[2] = sg->normal[(i+0)*3+2]*-1.0f; + +/* normal2, normal3 は省略 */ + +// sg->matrix = 回転行列*透視変換行列 +ApplyMatrix(xyz1, sg->matrix); +ApplyMatrix(normal1, sg->real_matrix); + +// PolygonPack の TrianglePack に計算した値とテクスチャの座標を格納する +PolygonPackPtr pp = new PolygonPack; +TrianglePack *triangle = &pp->tri[pp->info.size++]; + +triangle->ver1.x = xyz1[0]; +triangle->ver1.y = xyz1[1]; +triangle->ver1.z = xyz1[2]; +triangle->ver1.tex_x = sg->coord_tex[(i+0)*3]; +triangle->ver1.tex_y = sg->coord_tex[(i+0)*3+1]; +triangle->normal1.x = normal1[0]; +triangle->normal1.y = normal1[1]; +triangle->normal1.z = normal1[2]; + +/* ver2, ver3, normal2. normal3 は省略 */ + +// テクスチャのアドレス、幅、高さ、縮小率を格納する +triangle->tex_info.addr = sg->texture_info.pixels; +triangle->tex_info.width = sg->texture_info.t_w; +triangle->tex_info.height = sg->texture_info.t_h; +triangle->tex_info.scale_max = sg->texture_info.scale_max; +\end{verbatim} + +これらの処理を全ての Scenegraph に行い、PolygonPack を生成していく。 + +\subsection{CreateSpanTask} \label{createspan} + +生成された PolygonPack に格納されているポリゴンから、Span を抽出していく。 +Span は x 軸に平行な線分を表しているため、初めにポリゴンを水平に分割して +二つの三角形 (Triangle1, Triangle2) を作り、それぞれに対してSpan を求める +\cite{akira} (\figref{sep-polygon})。 + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.90]{./images/sep-polygon.pdf} + \end{center} + \caption{ポリゴンの分割と Span 生成} + \label{fig:sep-polygon} +\end{figure} + +得られた Span を SpanPack に格納する場合、その SpanPack が持つ全ての Span の y 座標 +が一定範囲内に入るようにする。 + +Rendering する場合、画面を複数の領域に分割し、それぞれを一つの Task で担当する。Cerium +では Rendering 時に Z Buffer を用いているため、同じ Task に違う領域の Span があると +正常に描画できない。そこで、一つの SpanPack には決まった y 座標を持った Span だけを +入れることにより、Rendering 時には独立して行うことができる。 +y の範囲は 8 としている(\figref{spanpack-rendering})。 + +\newpage + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.80]{./images/spanpack-rendering.pdf} + \end{center} + \caption{SpanPack の割り当て(height = 1080)} + \label{fig:spanpack-rendering} +\end{figure} + +\subsection{Rendering するための準備} + +画面に Rendering するためには、SpanPack の中の Span を辿り、対応する RGB 値をテクスチャイメージから取り出して + frame buffer に書きこむ必要がある。しかし、SPE のメモリ領域は 256KB しかないため、Span が参照している +テクスチャイメージ全てを SPE に送ることはできない。 + +そこで我々は、テクスチャイメージに対して分割、Tile管理、縮小という操作を行うことでこの問題 +を解決した。 + +\subsection{Texture の分割} \label{separate_texture} + +SPE のメモリ領域は 256KB しかないため、テクスチャイメージを全て転送すると動かなくなる可能性がある。 +そこで、そこで、テクスチャをブロックに分割し、ブロックごとに転送することにした。そのブロックを Tile +と呼び、分割単位は 8 x 8 とする(\figref{cerium_tile})。Tile は \figref{cerium_tile} +の順番で配列に変換する。 + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.80]{./images/cerium_tile.pdf} + \end{center} + \caption{Texture の分割と Tile} + \label{fig:cerium_tile} +\end{figure} + +Span が持つテクスチャのアドレスはこの配列を指しており、描画する Span 中の 1 pixel の座標から、 +目的の Tile を計算する。その Tile をメインメモリから DMA で持ってきて RGB 値を取り出す。 + +\subsection{SPE 上での Tile 管理} + +描画 Task が変わるたびに、新しい Tile を転送していては、DMA 転送のコストがかかりすぎる。そこで、 +すでに SPE 上に転送してある Tile を保存しておく。そして、次に描画する Span が保存してある Tile +を参照する場合、新たに DMA 転送を行わずに保存してある Tile を使用する。新たに Tile を参照し且つ領域に +空きが無い場合、 FIFO で Tile の入れ替えを行う。Tile の検索は、テクスチャのアドレスを key とし、 +Tile を value としてハッシュを用いる。 +\begin{comment} +SPE 上で保存する Tile の数を変化させることによって、Rendering の実行速度がどのように変化するか +実験した(\figref{cerium_hash_test})。 + +\begin{table}[htb] + \begin{center} + \caption{SPE 上での Tile 管理数による実行速度比較} \label{tab:cerium_hash_test} + \hbox to\hsize{\hfil + \begin{tabular}{c|l} \hline \hline + Tile 保存数 & 実行速度 (FPS) & \\ \hline + \hline + 1 & &\\ \hline + 128 & &\\ \hline + \end{tabular}\hfil} + \end{center} +\end{table} + +\figref{cerium_hash_test} より、SPE 上で保存する Tile の数を増やすことによりテクスチャ +のヒット率が上昇し、DMA 転送回数が減ることで実行速度が向上するがわかる。 + +\end{comment} + +\subsection{Texture の縮小} \label{sec:cerium_scale} + +遠くにあるオブジェクトは小さく描画される。この場合、使用されるテクスチャは原寸大である +必要がない。そこで、オリジナルのテクスチャの他に縮小したテクスチャを用意し、描画される +オブジェクトの大きさによって、使用するテクスチャを変更する。 + +テクスチャは Tile に分割しなければならないため、縦横ともに 8 の倍数を保つようにする。 +これまでは、テクスチャの縦横どちらかのサイズが最小 (8ドット) になったとき、縮小画像生成を終了 +していたが、テクスチャのサイズが縦横で違う場合、長い方に合わせて空のデータを埋め込み 8 の倍数 +の正方形にするように改良した。この改良によってテクスチャの最大縮小率を正確に求めることが出来るよう +になったこの制約を守りながら 2 分の 1 ずつ縮小させたときの最大縮小率を求める。縮小したテクスチャ +毎に Tile で分割し、すべての縮小率で求めた Tile を繋げて Tile Array とする(\figref{tapestry})。 + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.80]{./images/tapestry.pdf} + \end{center} + \caption{Tapestry の生成} + \label{fig:tapestry} +\end{figure} + +縮小したテクスチャを Tapestry と呼ぶ。 SceneGraph や PolygonPack の時点では +テクスチャイメージとして Tile Array の先頭アドレスを持っている。CreateSpan の中で +使用する Span の長さに適した scale を求め、その scale にあった Tapestry を span 生成 +ためのテクスチャとする。 + +\ref{separate_texture} でも話したとおり、テクスチャを全て SPE 内に送ることはできない。 +Tile 単位で分割し、更にハッシュを用いて SPE 内にキャッシュすることによって無駄な転送 +コストを減少させた。さらに Scale によって 描画に用いる Tapestry を変更することで、 +1テクスチャの Tile の数を減少させることができる。必要 Tile のヒット率が上昇し、結果 +転送コストの削減に繋がる。 + +この Texture hash の効果を示す。(\tabref{ball_bound})例題として、ball bound を使用した。 + +\begin{table}[!htb] + \begin{center} + \caption{キャッシュの効果(ball bound)} \label{tab:ball_bound} + \hbox to\hsize{\hfil + \begin{tabular}{|c|c|c|c|c|} \hline + キャッシュ & FPS & DMA転送待ち時間 & mail待ちの割合 & SPE稼働率\\ \hline + なし & 24.6FPS & 5.5\% & 72.4\% & 22.1\% \\ \hline + あり & 27.2FPS & 1.8\% & 76.2\% & 22.0\% \\ \hline + \end{tabular}\hfil} + \end{center} +\end{table} + + +\subsection{DrawSpanTask} \label{drawspan} + +現在、PlayStation 3 の GPU にアクセスする API は公開されていないため、Cerium では +Frame Buffer に直接描画する。Frame Buffer のアドレスは mmap() で取得できるため、 Task +出力として Frame Buffer を指定するか、Task 内で DMA 転送を行えば描画することができる。 +Mac OSX 上で動かす場合は SDL を用いて描画を行う。 + +Rendering は DrawSpan という Task で行う。受け取った SpanPack から Span を取り出す。 +Span の端から 1 pixel ずつ見ていき、その pixel の z 座標と Z Buffer を見比べ、描画 +するものと判断されると、対応する RGB 値を書きこむ。 + +また、DrawSpan は分割された画面領域の一部を担当するので、Span がその領域を +越えている場合は描画しない。現在、一つの DrawSpan が描画する領域は 256x8 としてい +る(\figref{drawspan})。 + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.80]{./images/drawspan.pdf} + \end{center} + \caption{DrawSpan の担当領域} + \label{fig:drawspan} +\end{figure} + +\subsection{RenderingTask のパイプライン化} \label{drawspan} +主に 3つの Task から構成されいる RenderingEngine だが、それぞれの Task はバリア同期を行なっている。Cerium においてバリア同期を行う場合に、2つの待ち時間がある。 +\begin{itemize} +\item SPEが他のSPEの処理完了を待つ時間 +\item バリア同期が完了し、PPE 側で次の Task が作られる時間 +\end{itemize} + +この二つの時間の間SPEの処理が止まり、処理性能の低下につながる。この待ち時間を回避するためには、Taskの粒度を下げる、他の SPE の処理完了を待っている SPE に、別の Task を割り当てる、等の方法がある。別の Task を割り当てるには Task の実行をパイプライン化する方法がある。そこで、特に3つの Task の中でも処理の重い DrawSpanTask と、CreatePolygonTask, CreateSpanTask の Task でパイプライン化を行っている。(\figref{rend-dep}) 速度比較の対象として、SuperDnady と呼ばれる、学生実験で制作されたシューティングゲームを用いた。FPSは一秒あたりの RednderingEngine 全体の処理回数(Frame per Scecond)であり、busy ration はSPEの稼働率である。(\tabref{pipeline_superdandy}) + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.90]{./images/rend-dep.pdf} + \end{center} + \caption{DrawSpan の担当領域} + \label{fig:rend-dep} +\end{figure} + +\begin{table}[!htb] + \begin{center} + \caption{パイプライン化の効果(ball bound)} \label{tab:pipeline_ballbound} + \hbox to\hsize{\hfil + \begin{tabular}{|c|c|c|c|c|} \hline + PipeLine & FPS & DMA転送待ち時間 & mail待ちの割合 & SPE稼働率\\ \hline + なし & 27.2FPS & 1.8\% & 76.2\% & 22.0\% \\ \hline + あり & 30.2FPS & 1.8\% & 74.3\% & 23.7\% \\ \hline + \end{tabular}\hfil} + \end{center} +\end{table} + +パイプライン化した結果(\tabref{pipeline_ballbound})、SPEの稼働率が向上し、FPSも向上した。 +処理性能を維持するには、SPEはなるべく稼働させ続けなければならない。 +その為には処理をTaskに分割し、並列実行するだけでなく、バリア同期などで、 +SPEの待ち時間が発生することへ対処しないといけない。 +その対処の一つとしてそれにパイプライン化は有効である。 diff -r 6d80c2c895e4 -r 5dbcea03717e paper/chapter3.tex --- a/paper/chapter3.tex Sat Jan 14 00:16:39 2012 +0900 +++ b/paper/chapter3.tex Tue Feb 07 17:38:59 2012 +0900 @@ -1,5 +1,27 @@ -\chapter{結論} +\chapter{TaskManagerを使った例題} +本章では、TaskManager を使った例題を紹介する +\section{WordCount} +例題としTaskManagerを使ったWordCountを実装した。Taskの構成は以下のである。 +\begin{enumerate} +\item WordCountTask +\item PrintTask +\end{enumerate} +WordCountTaskは、input された data を word count し、単語数と行数を output に指定された data 領域に書きこむTaskである。 +分割されたデータが送られてくるため、分割された前後のテキストがどうなっているかはわからない。そのため担当範囲であるデータの先頭と末尾のパラメータを単語数と行数の他に付け加える。後にそのデータを他のword count 結果と照らし合わせ、分割されたテキストを正しく整合する。 +PrintTask は WordCountTask によって書き出された単語数と行数を集計し、出力するTaskである。WordCountTask を wait する設定で、すべてのWordCountTaskが終了したあとに、動作する。 +word count 対象として入力されたファイルは、mmapを用いてメモリに展開する。その後データを16kbyteの大きさに分割しながら、WordCountTaskに割り当てていく。(\figref{wc-graf}) -\section{はじめに} -はじめに +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.70]{./images/wc_graf1.pdf} + \end{center} + \caption{wordcount flow} + \label{fig:wc-graf} +\end{figure} + +\section{Sort} + +\section{Prime} + + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/chapter4.tex --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/chapter4.tex Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,245 @@ +\chapter{Ceriumの改良} +本章では、Cerium に行った改良について説明する。 +Cerium のレンダリングの例題として ball\_bound を使用し、それを元に改良の効果を示していく。まず、改良前の 計測結果を示す。 + +\begin{table}[!htb] + \begin{center} + \caption{Cerium 改良前 (ball bound)} \label{tab:rendering_flat} + \hbox to\hsize{\hfil + \begin{tabular}{|c|c|c|c|} \hline + FPS & DMA転送待ち時間 & mail待ちの割合 & SPE稼働率\\ \hline + 30.2FPS & 1.8\% & 74.3\% & 23.7\% \\ \hline + \end{tabular}\hfil} + \end{center} +\end{table} + +Mail の待ち時間が 約70\%あり、処理時間の大部分を占めている。この Mail の待ち時間を削減するために Task をグルーピングする TaskArray, ソフトウェアMailQueue の実装を行った。また RenderinEngine の Task 内には、明示的な DMAロードが記述されており、アーキテクチャ依存となっている。そこでアーキテクチャ依存の記述を避けるために、MemorySegment を実装した。 + + +\section{TaskArray} +本研究では新しい Task として Task Array を実装した。 Cerium では Task と TaskList 毎に Mail を通知し、SPE の Mail の待ち時間が発生する問題があった。PPE 側で実行される Task もあるなかで、SPE側の Task を一つ一つ Task 毎に依存関係を処理しており、SPE への TaskList 要求や、次の Mail 書き込み待ちなど、Mail 通知の対応が遅れることが考えられる。Mail 通知の対応が遅れた分 SPE はアイドル状態となってしまい、稼働率が下がってしまう。この問題を解決するために、我々は Task Array を提案、実装した。 Task Array を使用することで、複数の Task をまとめる Task のグルーピングが行える。複数の Task を ひとつの Task Array として登録すると、依存関係の処理が Task Array ひとつ分で収まる。依存関係の処理には Mail 通知を行なっていたので 依存関係の処理が減少する分、 Mail 通知の回数も少なくなる。これによって、Mail 待ちによる SPE のアイドル状態の時間を減少させることができると考える。例えば TaskArray のサイズが4、TaskList のサイズが4、処理するべき Task の数が16の場合だとする。この時に TaskArray を使用すると、4つ必要だった TaskList が1つで済み、さらに16Task分の依存関係の解決が4つのTaskArray分で済む。(\figref{taskarray}) これによって Task 毎の Mail通知と TaskList 毎のMail通知の回数が合わせて 四分の一となる。このようにTaskArrayを用い Mail 自体の回数を減らし、待ち時間を削減できると考える。 + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.4]{./images/taskarray.pdf} + \end{center} + \caption{task array flow} + \label{fig:taskarray} +\end{figure} + +以下に Task Array を用いた記述例を示す。このプログラムは Task Array に複数の同一 Task を +登録して、まとめて実行するというプログラムである。 + +\begin{verbatim} +void +hello_init(TaskManager *manager) +{ + + /* task id/task num/param/inData/outData の数を指定する*/ HTask *twice_main = manager->create_task_array(Hello,task_num,data_count, + data_count,data_count); + Task *t = 0; + + for(int i = 0;inext_task_array(Hello, t); + } + twice_main->spawn_task_array(t->next()); + twice_main->set_cpu(SPE_ANY); + twice_main->spawn(); +} + +static int +run(SchedTask *s,void *rbuf, void *wbuf) +{ + s->printf("Hello World\n"); + return 0; +} + +// 実行結果 +% ./hello -task 6 +Hello World +Hello World +Hello World +Hello World +Hello World +Hello World + +\end{verbatim} + +プログラムに用いられてる新しい API について説明する。\\ +\begin{description} +\item[create\_task\_array: ] 同一の Task を複数持つことのできる Task Array を生成する。この際に、登録する Task のID, Task の数、設定する param, input data, output data の数を指定する。 +\item[next\_task\_array: ] Task Array に Task を実行順序を定める。実行順序は next\_task\_array +を行った順になる。 +\item[spawn\_task\_array: ] Task Array の中のすべての Task が書きこまれたかどうかをチェックする。TaskArray では指定された Task の数と、実際に登録された Task の数が同一か計算し、異なってた場合にはエラー文を返す。これは DMA ロードの際のサイズを合わせる為、正確に数を合わせなければならない。 +\end{description} + +この TaskArray をRenderingEngine の DrawSpanTask に適応させた。レンダリングの例題は ball bound を用いた。その効果を示す。wor(\tabref{taskarray_ballbound})。 + +\begin{table}[!htb] + \begin{center} + \caption{Task Arrayの効果(ball bound)} \label{tab:taskarray_ballbound} + \hbox to\hsize{\hfil + \begin{tabular}{|c|c|c|c|c|} \hline + TaskArray & FPS & DMA転送待ち時間 & mail待ちの割合 & SPE稼働率\\ \hline + 未使用 & 30FPS & 1.8\% & 76.2\% & 22.0\% \\ \hline + 使用 & 32.2FPS & 2.5\% & 66.7\% & 30.8\% \\ \hline + \end{tabular}\hfil} + \end{center} +\end{table} + +mail の待ち時間が 約10\% 削減され、FPSの向上があり、TaskArray による効果が見られた。 + +\section{MailQueue} +Task の完了通知や、アイドル状態の SPE に Task のリストの情報を通知するために Mail を使用している。Cell の設計では、その通知に使われる SPE からの書き出しMailのQueueのサイズは1である。ハードウェアの設計として、Mailを書き出す場合、前回のMailがPPE側から読み込まれていない場合に、PPE側の読み出しでMailboxが空き状態になるまで、SPEはアイドル状態となる。するとPPE側のMail読み出し処理が追いつかない場合には、SPE側に余計な待ち時間が入ってしまう。そこで、ソフトウェアMailQueue を実装した。ハードウェアのMailboxへの書き込みができない場合には、ソフトウェアMailQueueへ書き出し、Mail の書き出し待ちをなくす。代わりに割り当てられたTaskListをすべて処理したあとに、MailQueueに残っているMailをすべて書き出す処理を行う。 + +MailQueueの大きさはメモリ容量の限り自動で拡張される。以下にball bound の例題での MailQueue の有無における測定結果を示す(\tabref{mailqueue})。 + +\begin{table}[!htb] + \begin{center} + \caption{MailQueue の効果(ball bound)} \label{tab:mailqueue} + \hbox to\hsize{\hfil + \begin{tabular}{|c|c|c|c|c|} \hline + MailQueue & FPS & DMA転送待ち時間 & mailの待ち時間 & SPE稼働率\\ \hline + なし & 32.2FPS & 2.5\% & 66.7\% & 30.8\% \\ \hline + あり & 41.7FPS & 3.3\% & 56.8\% & 40.0\% \\ \hline + \end{tabular}\hfil} + \end{center} +\end{table} + +Mail の待ち時間の割合が減少し、8FPSの向上がみられた。ソフトウェア MailQueue によって Mail の書き出しタイミングを変更することで、Mail の待ち時間を削減することができた。PPE 側では、SPEからの Mail の確認は一度の ループ文で行なっている。Mail を確認しおえ、そのループ文を抜けてしまうと、次に Mail を確認するまでに PPE 側の Task 処理が挟まれる。よって、SPE 側の Mail 通知は一度に多く行った方が、PPE側の Mail 確認がスムーズに行われ、結果 SPE の稼働率向上に繋がると言える。ソフトウェアMailQueue では Mail をキューイングし一度に書き出すので、この点でも効果がある。 + +\section{MemorySegment} +CreateSpanTask 内では明示的に DMA転送命令を行なっている。これは処理するデータ構造上の理由である。しかし、DMA転送は Cell のアーキテクチャに依存した機能である。また Task に登録された input data と output data は自動的に TaskManager によってパイプライン化されるが、明示的にDMA転送を行う場合には、手動でのパイプライン処理を行う必要がある。そこで、Task 内でのデータの入出力の機能を 抽象化する MemorySegment を実装した。MemorySegment によって DAM転送は隠蔽され、アーキテクチャ依存の記述を避けることができる。またメモリ操作も抽象化される。 + + +CreateSpanTask 内の明示的なDMA転送の例を示す。 + +\begin{verbatim} +create_span() { + + tmp_spack = spack; + spack = send_spack; + send_spack = tmp_spack; + + smanager->dma_wait(SPAN_PACK_STORE); + smanager->dma_store(send_spack, (memaddr)spackList[prev_index], + sizeof(SpanPack), SPAN_PACK_STORE); + + smanager->dma_load(spack, (memaddr)spackList[index], + sizeof(SpanPack), SPAN_PACK_LOAD); + + prev_index = index; + smanager->dma_wait(SPAN_PACK_LOAD); + + span_calc(spack); + +} + +\end{verbatim} + +CreateSpanTask では SpanPack というデータ構造を扱う。MainMemory から SpanPack をDMAロードし、ロードした SpanPack に span\_calc() で計算した Span を格納し また MainMemory へと書きだす。変数 tmp\_spack, spack, send\_spack はそれぞれ SpanPack へのポインタであり、それを入れ替えながらDMA転送行うことで、メモリを節約を行なっている。それぞれのAPIの説明を行う。 + +\begin{description} +\item[dma\_wait: ] 指定されたdmaタグの dma転送の完了を待つ。 +\item[dma\_store: ] 指定された LS のアドレスから、指定された サイズ分 の領域を MainMemory に書き出す。その際にdma\_wait で用いる dma タグも指定する。例の場合では SPAN\_PACK\_STORE である。 +\item[dma\_load: ] 指定された MainMmory のアドレスから 指定された サイズ分のデータを LS へDMAロードを行う。その際に dma\_wait で用いる dma タグも指定する。 例の場合では SPAN\_PACK\_LOAD である。 +\end{description} +dma タグは、enum によって整数が定義されている。次に上記のコードを MemorySegment API に変更した例を示す。 + +\begin{verbatim} +create_span() { + + smanager->wait_segment(span_put_ms); + + span_put_ms = span_get_ms; + smanager->put_segment(span_put_ms); + + span_get_ms = smanager->get_segment((memaddr)spackList[index], span_ml); + smanager->wait_segment(span_get_ms); + + prev_index = index; + spack = (SpanPackPtr)span_get_ms->data; + + span_calc(spack); + +} +\end{verbatim} + +変数 span\_get\_ms, span\_put\_ms はそれぞれ MemorySegment のデータ構造を指すポインタである。この MemorySegment というデータ構造で Task 内部での 必要なデータのやり取りを行う。MemorySegment のAPIの説明を行う + +\begin{description} +\item[wait\_segment: ] 指定された MemorySegment の処理完了を待つ。それは書き出し、読み込みどちらも当てはまる。dma\_wait に相当する。 +\item[put\_segment: ] 指定された MemorySegment を書きだす。書き出し先のアドレスは、MemorySegment の生成時に登録されている。 +\item[get\_segment: ] 指定されたアドレス への書き出しを目的とした、MemorySegment を取得する。MemorySegment は予め MemorySegmentList によって管理されており、その List から使用可能な Segment を得ることができる。 +\end{description} + +SPE の LS は 256KB となっていて、一般的なCPUのメモリ容量と比べると小さい。LS 内部での頻繁な メモリのアロケーションなどは LS を圧迫することになる。そこで、一度確保したメモリを使いまわすことが必要である。MemorySegment は必要な構造体をはじめに List として登録する。List は LRU で管理し、指定されたメモリ容量を超えた場合には 最もアクセスされた時間が古いデータから順に開放され、新たなデータを List に加える。以下にそのコードを示す + +\begin{verbatim} + + ml = smanager->createMemList(sizeof(SpanPack), SPANPACK_SEGMENT_NUM); + smanager->global_set(GLOBAL_SPANPACK_LIST, (void *)ml); + +\end{verbatim} + +コード上にあるAPIの説明を行う。 + +\begin{description} +\item[createMemList: ] 指定されたサイズの、指定され数だけ メモリを確保し、そのメモリを List を生成する。 +\item[global\_set: ] どの Task からでも 指定された アドレスを呼び出すことができる。Task 共通のメモリ空間を扱う時に用いる。 +\end{description} +このように MemorySegment はメモリの List を持ち、それを抽象化した API によって LS のメモリを使い回しながら、Task 内でのデータ転送を可能にする。また 明示的なDMA転送API を隠蔽することができるので、他の分散メモリ環境などでの汎用性が期待できる。DrawSpanTask の他に、Texture cache でも使用している。 + +\subsection{改良のまとめと比較} + +本研究で行った改良を加えた計測結果をまとめる(\tabref{result}) + +\begin{table}[!htb] + \begin{center} + \caption{本研究の改良効果(ball bound)} \label{tab:result} + \hbox to\hsize{\hfil + \begin{tabular}{|c|c|c|c|c|} \hline + & FPS & DMA転送待ち時間 & mail待ちの割合 & SPE稼働率\\ \hline + 改良前 & 30.2FPS & 1.8\% & 74.3\% & 23.7\% \\ \hline + 改良後 & 41.7FPS & 3.3\% & 56.8\% & 40.0\% \\ \hline + \end{tabular}\hfil} + \end{center} +\end{table} +Mail の待ち時間、DMA転送の待ち時間がともに削減され、稼働率とFPSの向上が見られた。 + +本研究で行った改良の加え、Cerium 開発後からの改良である、Task のパイプライン化、Texture cache の使用の効果をまとめる(\tabref{imp_result}) + +\begin{table}[!htb] + \begin{center} + \caption{Ceriumの改良の効果(ball bound)} \label{tab:imp_result} + \hbox to\hsize{\hfil + \begin{tabular}{|c|c|c|c|c|} \hline + & FPS & DMA転送待ち時間 & mail待ちの割合 & SPE稼働率\\ \hline + 改良前 & 24.6FPS & 5.5\% & 72.4\% & 22.1\% \\ \hline + 改良後 & 41.7FPS & 3.3\% & 56.8\% & 40.0\% \\ \hline + \end{tabular}\hfil} + \end{center} +\end{table} + +Cerium 開発後からの改良の結果、FPS が17上昇し、稼働率が18\%向上した。 + +\subsubsection{OpenGLとの比較} + +OpenGL (Open Graphics Library) とは、Silicon Graphics 社が開発した、3D グラフィックス +処理のためのプログラミングインターフェースである。 +上記で紹介した SuperDandy を Task を用いない OpneGL 上で動作するバージョンを用意して、Cerium +と性能を比較してみた。OpenGL は PPE だけで動作している。Cerium は今までの改良をすべて加えたもの。 + +\begin{table}[!htb] + \begin{center} + \caption{シューティングゲーム「dandy」の性能比較(OpenGL, Cerium))} \label{tab:dandy-compare} + \hbox to \hsize{\hfil + \begin{tabular}{|c|l|l|c|} \hline + & OpenGL & Cerium & 性能差\\ \hline + dandy & 17.5 FPS & 49.5 FPS & 2.9 倍\\ \hline + \end{tabular}\hfil} + \end{center} +\end{table} + +コアを1つ用いている OpenGL 版に比べて、Cerium では 2.9 倍の性能向上が見られた。 +SPEを活用し、改良によって待ち時間の削減ができ、性能の向上ができた。 diff -r 6d80c2c895e4 -r 5dbcea03717e paper/chapter5.tex --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/chapter5.tex Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,13 @@ +\chapter{デバック} +並列プログラムの特徴として、デバッグが難しいことが挙げられる。実行が非決定的 (同じ状態で実行しても結果が異なる) な場合があり、バグの状態を再現することが難しい。また、個々の Core 上のデータを調べる必要があり、デバッガが複数の Core を取り扱えることが必須である。Cell の場合、動作している複数 の SPE の一つに対してgdb で breakpoint を掛ければ、PPE や他の SPE も同時にストップするが、それら全ての CPU を手動で管理するのは時間がかかる。また、PPE と SPE ではメモリ空間が違うため、SPE から直接 PPE のデータを見ることができない。 +Cerium での開発工程は、 + +\begin{enumerate} +\item C によるシーケンシャルな実装 +\item 並列実行を考慮したデータ構造を持つ実装 +\item コードを分割し、シーケンシャルに実行する実装 +\item 分割したコードを並列実行する実装 +\end{enumerate} + +となっている。逐次的な実行で正常な動作を確認した後、並列に実行した場合に正常な動作をしない場合がある。特にCell特有の問題としてデータ構造が DMA 転送に合っていないこと。つまり、DMA転送される際に、16アライメントに設定されていないか、データのサイズが16の倍数になっていない場合に注意しなければならない。またCeriumではコードがそれぞれ PPE 用と SPE 用が別個に存在するので、互いのコードが等価であるかもチェックしなければならない。一つのコードに統一しても良いが、別個で対応したい問題がでた時に対応してる。 +バグの例として、本来 SPE で動くべき Task が PPE で動作するなど、Task のスケジューリングでのバグ、Task の設定の際のバグなどがある。 diff -r 6d80c2c895e4 -r 5dbcea03717e paper/conclusion.tex --- a/paper/conclusion.tex Sat Jan 14 00:16:39 2012 +0900 +++ b/paper/conclusion.tex Tue Feb 07 17:38:59 2012 +0900 @@ -1,6 +1,27 @@ \chapter{結論} \label{chapter:conclusion} - \section{まとめ} -まとめ +本研究では並列プログラミングフレームワーク Cerium の改良を行った。Cerium は並列プログラミングをサポートする TaskManager、ソフトウェアレンダリングを行う RenderinEngine, ゲームのシーンを記述していく、SceneGraph から構成されている。学生実験で行うCell上でのゲーム作成を考慮にいれた並列プログラミングフレームワークである。Ceirum 開発後に学生実験での使用や、例題を実装していく上で、仕様通りの稼働率がでないことや、アーキテクチャ依存の記述が避けづらいことなど、フレームワークとしての信頼性が十分でないことが明らかになった。 +特に Cell上での実行の場合には、SPE との通信の待ち時間が約70\%と、処理性能に関わっている。そこで SPE と PPE の通信部分である Mail について、TaskArrayの実装と使用、ソフトウェアMailQueueの実装をし改良を行った。その結果 FPS の向上、Mail 待ち時間の減少に効果が見られた。 +また、Task 内でのアーキテクチャ依存の記述を MemorySegment によって、避けることに成功した。また MemorySegment を用いることでメモリ管理を抽象化することができる。その他の先行研究の改良として、Task のパイプライン化、Texutre のキャッシュなどがある。これらの改良によっても、FPSの向上や、DMA転送の待ち時間が改善された。Cerium の改良を重ね、結果として約17FPSの向上に成功した。また Mail の待ち時間は約18\%削減できた。 + \section{今後の課題} -今後の課題 +\subsection{プログラムの Task化} +各コアの稼働率の向上のためには、本研究で行った改良の他に、プログラムの Task 化を進める必要がある。Mail の通信の待ち時間は内訳は + +\begin{description} +\item PPE の対応が遅れる +\item SPE が他の SPE を待つ +\end{description} + +の二つの要素がある。PPE の対応が遅れる場合には PPE側に処理するべきプログラムがあり、Mail の対応が遅れる原因がある。 +そのため 制御用の PPE は処理するべきプログラムは排除し、Mail 通知の対応や、Task の割り振りを専門に PPE が行うことによって、SPE の稼働率向上を果たせると考える。また バリア同期を行うと 割り振られた処理によっては 他の SPE よりも早く処理が終了し、他の SPE を待つ時間が生じる場合がある。この二つの要素は、PPE 側のプログラムの Task化 を行い、さらにその Task はなるべく粒度を細かく設定することで解決できると考える。プログラムを Task 化しなるべく PPE ではなく SPEに処理を任せる。また粒度を細かくすることは、各 SPE への均等な Task の分散のために必要であり、並列化部分の特定にも繋がる。 + +\subsubsection{SPE の LS の利用方法} +\subsubsection{Task のインターフェイス} +\subsubsection{自動的な依存関係の解決} + + + + +\subsection{DataSegment} +\subsection{CodeSegment} diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/Cell-main.jpg Binary file paper/images/Cell-main.jpg has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/Mailbox.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/Mailbox.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/Mailbox.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 514 342 +%%CreationDate: Tue Jan 10 13:32:01 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/Mailbox.graffle Binary file paper/images/Mailbox.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/Mailbox.pdf Binary file paper/images/Mailbox.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/PPE.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/PPE.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/PPE.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 453 454 +%%CreationDate: Tue Jan 10 13:32:01 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/PPE.graffle Binary file paper/images/PPE.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/PPE.pdf Binary file paper/images/PPE.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/SIMD.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/SIMD.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/SIMD.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 402 266 +%%CreationDate: Tue Jan 10 13:32:01 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/SIMD.graffle Binary file paper/images/SIMD.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/SIMD.pdf Binary file paper/images/SIMD.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/SPE.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/SPE.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/SPE.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 380 340 +%%CreationDate: Tue Jan 10 13:32:01 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/SPE.graffle Binary file paper/images/SPE.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/SPE.pdf Binary file paper/images/SPE.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/amdahl.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/amdahl.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/amdahl.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 360 252 +%%CreationDate: Tue Jan 10 13:32:01 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/amdahl.pdf Binary file paper/images/amdahl.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/aquarium.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/aquarium.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/aquarium.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 349 270 +%%CreationDate: Tue Jan 10 13:32:01 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/aquarium.graffle.zip Binary file paper/images/aquarium.graffle.zip has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/aquarium.pdf Binary file paper/images/aquarium.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/ball_bound.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/ball_bound.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/ball_bound.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 639 480 +%%CreationDate: Tue Jan 10 13:32:01 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/ball_bound.pdf Binary file paper/images/ball_bound.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/cell-main.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/cell-main.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/cell-main.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 423 300 +%%CreationDate: Tue Jan 10 13:32:01 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/cell-main.graffle Binary file paper/images/cell-main.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/cell-main.pdf Binary file paper/images/cell-main.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/cerium-tile.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/cerium-tile.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/cerium-tile.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 476 382 +%%CreationDate: Tue Jan 10 13:32:01 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/cerium-tile.graffle Binary file paper/images/cerium-tile.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/cerium-tile.pdf Binary file paper/images/cerium-tile.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/cerium_rendering_tile.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/cerium_rendering_tile.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/cerium_rendering_tile.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 510 385 +%%CreationDate: Tue Jan 10 13:32:01 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/cerium_rendering_tile.pdf Binary file paper/images/cerium_rendering_tile.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/cerium_tile.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/cerium_tile.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/cerium_tile.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 476 382 +%%CreationDate: Tue Jan 10 13:32:01 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/cerium_tile.graffle Binary file paper/images/cerium_tile.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/cerium_tile.pdf Binary file paper/images/cerium_tile.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/drawspan.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/drawspan.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/drawspan.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 555 301 +%%CreationDate: Tue Jan 10 13:32:01 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/drawspan.graffle Binary file paper/images/drawspan.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/drawspan.pdf Binary file paper/images/drawspan.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/exec-rendering.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/exec-rendering.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/exec-rendering.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 343 441 +%%CreationDate: Tue Jan 10 13:32:01 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/exec-rendering.graffle Binary file paper/images/exec-rendering.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/exec-rendering.pdf Binary file paper/images/exec-rendering.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/inst-span.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/inst-span.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/inst-span.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 468 279 +%%CreationDate: Tue Jan 10 13:32:01 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/inst-span.graffle Binary file paper/images/inst-span.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/inst-span.pdf Binary file paper/images/inst-span.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/mailtime.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/mailtime.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/mailtime.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 380 309 +%%CreationDate: Tue Jan 10 13:32:01 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/mailtime.graffle Binary file paper/images/mailtime.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/mailtime.pdf Binary file paper/images/mailtime.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/new-draw-dependency.graffle Binary file paper/images/new-draw-dependency.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/new-exec-rendering.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/new-exec-rendering.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/new-exec-rendering.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 334 505 +%%CreationDate: Tue Jan 10 13:32:01 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/new-exec-rendering.graffle Binary file paper/images/new-exec-rendering.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/new-exec-rendering.pdf Binary file paper/images/new-exec-rendering.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/old-draw-dependency.graffle Binary file paper/images/old-draw-dependency.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/old-exec-rendering.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/old-exec-rendering.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/old-exec-rendering.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 339 491 +%%CreationDate: Tue Jan 10 13:32:01 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/old-exec-rendering.graffle Binary file paper/images/old-exec-rendering.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/old-exec-rendering.pdf Binary file paper/images/old-exec-rendering.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/planets.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/planets.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/planets.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 638 481 +%%CreationDate: Tue Jan 10 13:32:02 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/planets.pdf Binary file paper/images/planets.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/polygonpack.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/polygonpack.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/polygonpack.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 499 226 +%%CreationDate: Tue Jan 10 13:32:02 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/polygonpack.graffle Binary file paper/images/polygonpack.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/polygonpack.pdf Binary file paper/images/polygonpack.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/rend-dep.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/rend-dep.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/rend-dep.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 519 351 +%%CreationDate: Sun Mar 13 06:53:03 2011 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/rend-dep.pdf Binary file paper/images/rend-dep.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/rendering3.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/rendering3.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/rendering3.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 686 382 +%%CreationDate: Sun Mar 13 00:54:43 2011 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/rendering3.pdf Binary file paper/images/rendering3.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/scenegraph.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/scenegraph.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/scenegraph.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 425 274 +%%CreationDate: Tue Jan 10 13:32:02 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/scenegraph.graffle Binary file paper/images/scenegraph.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/scenegraph.pdf Binary file paper/images/scenegraph.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/scheduler.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/scheduler.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/scheduler.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 505 345 +%%CreationDate: Tue Jan 10 13:32:02 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/scheduler.graffle Binary file paper/images/scheduler.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/scheduler.pdf Binary file paper/images/scheduler.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/sep-polygon.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/sep-polygon.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/sep-polygon.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 345 261 +%%CreationDate: Tue Jan 10 13:32:02 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/sep-polygon.graffle Binary file paper/images/sep-polygon.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/sep-polygon.pdf Binary file paper/images/sep-polygon.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/spanpack-rendering.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/spanpack-rendering.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/spanpack-rendering.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 541 340 +%%CreationDate: Tue Jan 10 13:32:02 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/spanpack-rendering.graffle Binary file paper/images/spanpack-rendering.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/spanpack-rendering.pdf Binary file paper/images/spanpack-rendering.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/spanpack.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/spanpack.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/spanpack.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 534 198 +%%CreationDate: Tue Jan 10 13:32:02 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/spanpack.graffle Binary file paper/images/spanpack.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/spanpack.pdf Binary file paper/images/spanpack.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/spurs_pipeline.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/spurs_pipeline.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/spurs_pipeline.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 533 187 +%%CreationDate: Tue Jan 10 13:32:02 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/spurs_pipeline.graffle Binary file paper/images/spurs_pipeline.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/spurs_pipeline.pdf Binary file paper/images/spurs_pipeline.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/spurs_task.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/spurs_task.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/spurs_task.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 547 236 +%%CreationDate: Tue Jan 10 13:32:02 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/spurs_task.graffle Binary file paper/images/spurs_task.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/spurs_task.pdf Binary file paper/images/spurs_task.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/stb-pipeline.graffle Binary file paper/images/stb-pipeline.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/stb-pipeline1.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/stb-pipeline1.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/stb-pipeline1.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 582 235 +%%CreationDate: Tue Jan 10 13:32:02 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/stb-pipeline1.graffle Binary file paper/images/stb-pipeline1.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/stb-pipeline1.pdf Binary file paper/images/stb-pipeline1.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/stb-pipeline2.graffle Binary file paper/images/stb-pipeline2.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/stb-state.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/stb-state.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/stb-state.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 412 426 +%%CreationDate: Tue Jan 10 13:32:02 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/stb-state.graffle Binary file paper/images/stb-state.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/stb-state.pdf Binary file paper/images/stb-state.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/t_dandy.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/t_dandy.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/t_dandy.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 741 480 +%%CreationDate: Tue Jan 10 13:32:02 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/t_dandy.pdf Binary file paper/images/t_dandy.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/tapestry.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/tapestry.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/tapestry.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 497 266 +%%CreationDate: Tue Jan 10 13:32:02 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/tapestry.graffle Binary file paper/images/tapestry.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/tapestry.pdf Binary file paper/images/tapestry.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/task-dependency.graffle Binary file paper/images/task-dependency.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/task-dependency1.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/task-dependency1.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/task-dependency1.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 429 158 +%%CreationDate: Tue Jan 10 13:32:02 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/task-dependency1.graffle Binary file paper/images/task-dependency1.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/task-dependency1.pdf Binary file paper/images/task-dependency1.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/task-dependency2.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/task-dependency2.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/task-dependency2.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 427 158 +%%CreationDate: Tue Jan 10 13:32:02 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/task-dependency2.graffle Binary file paper/images/task-dependency2.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/task-dependency2.pdf Binary file paper/images/task-dependency2.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/task-dependency3.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/task-dependency3.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/task-dependency3.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 423 158 +%%CreationDate: Tue Jan 10 13:32:02 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/task-dependency3.graffle Binary file paper/images/task-dependency3.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/task-dependency3.pdf Binary file paper/images/task-dependency3.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/task-dependency4.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/task-dependency4.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/task-dependency4.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 421 158 +%%CreationDate: Tue Jan 10 13:32:02 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/task-dependency4.graffle Binary file paper/images/task-dependency4.graffle has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/task-dependency4.pdf Binary file paper/images/task-dependency4.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/taskarray.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/taskarray.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./taskarray.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 936 293 +%%CreationDate: Mon Feb 6 03:10:41 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/taskarray.graffle --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/taskarray.graffle Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,2026 @@ + + + + + ActiveLayerIndex + 0 + ApplicationVersion + + com.omnigroup.OmniGraffle + 138.17.0.133677 + + AutoAdjust + + BackgroundGraphic + + Bounds + {{0, 0}, {1677.6, 782.8}} + Class + SolidGraphic + ID + 2 + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + + CanvasOrigin + {0, 0} + ColumnAlign + 1 + ColumnSpacing + 36 + CreationDate + 2012-02-06 02:23:22 +0900 + Creator + 金城 裕 + DisplayScale + 1 0/72 in = 1 0/72 in + GraphDocumentVersion + 6 + GraphicsList + + + Bounds + {{1070, 101}, {54, 36}} + Class + ShapedGraphic + ID + 91 + Shape + Rectangle + Style + + stroke + + CornerRadius + 9 + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs38 \cf0 Task} + + + + Bounds + {{1016, 101}, {54, 36}} + Class + ShapedGraphic + ID + 90 + Shape + Rectangle + Style + + stroke + + CornerRadius + 9 + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs38 \cf0 Task} + + + + Bounds + {{962, 101}, {54, 36}} + Class + ShapedGraphic + ID + 89 + Shape + Rectangle + Style + + stroke + + CornerRadius + 9 + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs38 \cf0 Task} + + + + Bounds + {{908, 101}, {54, 36}} + Class + ShapedGraphic + ID + 88 + Shape + Rectangle + Style + + stroke + + CornerRadius + 9 + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs36 \cf0 Task} + + + + Bounds + {{908, 65}, {216, 43}} + Class + ShapedGraphic + ID + 87 + Shape + Rectangle + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs46 \cf0 TaskList} + + + + Bounds + {{840, 101}, {54, 36}} + Class + ShapedGraphic + ID + 86 + Shape + Rectangle + Style + + stroke + + CornerRadius + 9 + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs38 \cf0 Task} + + + + Bounds + {{786, 101}, {54, 36}} + Class + ShapedGraphic + ID + 85 + Shape + Rectangle + Style + + stroke + + CornerRadius + 9 + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs38 \cf0 Task} + + + + Bounds + {{732, 101}, {54, 36}} + Class + ShapedGraphic + ID + 84 + Shape + Rectangle + Style + + stroke + + CornerRadius + 9 + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs38 \cf0 Task} + + + + Bounds + {{678, 101}, {54, 36}} + Class + ShapedGraphic + ID + 83 + Shape + Rectangle + Style + + stroke + + CornerRadius + 9 + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs36 \cf0 Task} + + + + Bounds + {{678, 65}, {216, 43}} + Class + ShapedGraphic + ID + 82 + Shape + Rectangle + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs46 \cf0 TaskList} + + + + Bounds + {{602, 101}, {54, 36}} + Class + ShapedGraphic + ID + 81 + Shape + Rectangle + Style + + stroke + + CornerRadius + 9 + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs38 \cf0 Task} + + + + Bounds + {{548, 101}, {54, 36}} + Class + ShapedGraphic + ID + 80 + Shape + Rectangle + Style + + stroke + + CornerRadius + 9 + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs38 \cf0 Task} + + + + Bounds + {{494, 101}, {54, 36}} + Class + ShapedGraphic + ID + 79 + Shape + Rectangle + Style + + stroke + + CornerRadius + 9 + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs38 \cf0 Task} + + + + Bounds + {{440, 101}, {54, 36}} + Class + ShapedGraphic + ID + 78 + Shape + Rectangle + Style + + stroke + + CornerRadius + 9 + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs36 \cf0 Task} + + + + Bounds + {{440, 65}, {216, 43}} + Class + ShapedGraphic + ID + 77 + Shape + Rectangle + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs46 \cf0 TaskList} + + + + Bounds + {{727, 251}, {54, 43}} + Class + ShapedGraphic + ID + 76 + Shape + Rectangle + Style + + stroke + + CornerRadius + 9 + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs36 \cf0 Task\ +Array} + + + + Bounds + {{673, 251}, {54, 43}} + Class + ShapedGraphic + ID + 75 + Shape + Rectangle + Style + + stroke + + CornerRadius + 9 + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs36 \cf0 Task\ +Array} + + + + Bounds + {{619, 251}, {54, 43}} + Class + ShapedGraphic + ID + 74 + Shape + Rectangle + Style + + stroke + + CornerRadius + 9 + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs36 \cf0 Task\ +Array} + + + + Class + LineGraphic + ID + 52 + Points + + {1123, 135} + {780, 254} + + Style + + stroke + + HeadArrow + 0 + TailArrow + 0 + + + + + Class + LineGraphic + ID + 51 + Points + + {908, 127} + {732, 252} + + Style + + stroke + + HeadArrow + 0 + TailArrow + 0 + + + + + Class + LineGraphic + ID + 50 + Points + + {893, 131} + {724, 252} + + Style + + stroke + + HeadArrow + 0 + TailArrow + 0 + + + + + Class + LineGraphic + ID + 49 + Points + + {649, 137} + {666, 251} + + Style + + stroke + + HeadArrow + 0 + TailArrow + 0 + + + + + Class + LineGraphic + ID + 48 + Points + + {442, 131} + {620, 253} + + Style + + stroke + + HeadArrow + 0 + TailArrow + 0 + + + + + Class + LineGraphic + ID + 47 + Points + + {423.993, 134.416} + {613, 251} + + Style + + stroke + + HeadArrow + 0 + TailArrow + 0 + + + Tail + + ID + 7 + + + + Class + LineGraphic + ID + 46 + Points + + {678, 136} + {677, 252} + + Style + + stroke + + HeadArrow + 0 + TailArrow + 0 + + + + + Class + LineGraphic + ID + 45 + Points + + {212, 135} + {566, 254} + + Style + + stroke + + HeadArrow + 0 + TailArrow + 0 + + + + + Bounds + {{565, 251}, {54, 43}} + Class + ShapedGraphic + ID + 8 + Shape + Rectangle + Style + + stroke + + CornerRadius + 9 + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs36 \cf0 Task\ +Array} + + + + Bounds + {{372, 101}, {54, 36}} + Class + ShapedGraphic + ID + 7 + Shape + Rectangle + Style + + stroke + + CornerRadius + 9 + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs38 \cf0 Task} + + + + Bounds + {{318, 101}, {54, 36}} + Class + ShapedGraphic + ID + 6 + Shape + Rectangle + Style + + stroke + + CornerRadius + 9 + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs38 \cf0 Task} + + + + Bounds + {{264, 101}, {54, 36}} + Class + ShapedGraphic + ID + 5 + Shape + Rectangle + Style + + stroke + + CornerRadius + 9 + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs38 \cf0 Task} + + + + Bounds + {{210, 101}, {54, 36}} + Class + ShapedGraphic + ID + 4 + Shape + Rectangle + Style + + stroke + + CornerRadius + 9 + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs36 \cf0 Task} + + + + Bounds + {{210, 65}, {216, 43}} + Class + ShapedGraphic + ID + 1 + Shape + Rectangle + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs46 \cf0 TaskList} + + + + Bounds + {{565, 284}, {216, 52}} + Class + ShapedGraphic + ID + 30 + Shape + Rectangle + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs50 \cf0 TaskList} + + + + GridInfo + + GuidesLocked + NO + GuidesVisible + YES + HPages + 3 + ImageCounter + 1 + KeepToScale + + Layers + + + Lock + NO + Name + レイヤー 1 + Print + YES + View + YES + + + LayoutInfo + + Animate + NO + circoMinDist + 18 + circoSeparation + 0.0 + layoutEngine + dot + neatoSeparation + 0.0 + twopiSeparation + 0.0 + + LinksVisible + NO + MagnetsVisible + NO + MasterSheets + + ModificationDate + 2012-02-06 03:10:16 +0900 + Modifier + 金城 裕 + NotesVisible + NO + Orientation + 2 + OriginVisible + NO + PageBreaks + NO + PrintInfo + + NSBottomMargin + + float + 41 + + NSLeftMargin + + float + 18 + + NSPaperSize + + size + {595.2, 841.8} + + NSRightMargin + + float + 18 + + NSTopMargin + + float + 18 + + + PrintOnePage + + QuickLookPreview + + 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 + 2DDEsHeC4Yab1o67WbjPd1yo+2BnElclosIDRpHNuKdUFZEEKdOUyE0k2kF3BCohNj8u + tOM9ENR0Be+HIlvwrlOV6/E0bJFPAnwSrwUPjK1L7Hbk9LBNS94mhBQSlh5/y9k2+Bn1 + Jq3fmMVdzLtuHIMcmyuQf2HueCNpk9sR/zioxots29FzOQLd4ueBBfJbfIMdExbclObJ + XUogX4ojv8pGDPloICV3azohHz9Zx9rb7woWBfLnxhfcfHukliN/T4wqnuOtfiysoKmd + NGQl9+01J3Uf+UzzMBHLFQWMsCjCJewwCBn50gz5Ei3PS4xcHYHS/ijNJuSzMUe+h8iQ + v+UNNUe+i/S7YpkCUN7UZMZKM/LDtpDvDqaQwKc785m24f8z8Wp7TcfmvgT53/4X+84v + BwplbmRzdHJlYW0KZW5kb2JqCjYgMCBvYmoKNDU2NAplbmRvYmoKMyAwIG9iago8PCAv + VHlwZSAvUGFnZSAvUGFyZW50IDQgMCBSIC9SZXNvdXJjZXMgNyAwIFIgL0NvbnRlbnRz + IDUgMCBSIC9NZWRpYUJveCBbMCAwIDE2NzcuNiA3ODIuOF0KL0Nyb3BCb3ggWzAgMCAx + Njc3LjYgNzgyLjhdID4+CmVuZG9iago3IDAgb2JqCjw8IC9Qcm9jU2V0IFsgL1BERiAv + VGV4dCAvSW1hZ2VCIC9JbWFnZUMgL0ltYWdlSSBdIC9Db2xvclNwYWNlIDw8IC9DczEg + OCAwIFIKL0NzMiAxNyAwIFIgPj4gL0ZvbnQgPDwgL0YxLjAgMTggMCBSIC9GMi4wIDE5 + IDAgUiA+PiAvWE9iamVjdCA8PCAvSW0yIDExIDAgUgovSW00IDE1IDAgUiAvSW0xIDkg + MCBSIC9JbTMgMTMgMCBSID4+ID4+CmVuZG9iagoxMSAwIG9iago8PCAvTGVuZ3RoIDEy + IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRoIDQ3NiAvSGVp + Z2h0IDEzMCAvSW50ZXJwb2xhdGUKdHJ1ZSAvQ29sb3JTcGFjZSAyMCAwIFIgL0ludGVu + dCAvUGVyY2VwdHVhbCAvU01hc2sgMjEgMCBSIC9CaXRzUGVyQ29tcG9uZW50CjggL0Zp + bHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB7dAxAQAAAMKg9U9tDQ+IQGHAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgy8DAzVRgABCmVuZHN0 + cmVhbQplbmRvYmoKMTIgMCBvYmoKODMzCmVuZG9iagoxNSAwIG9iago8PCAvTGVuZ3Ro + IDE2IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRoIDE1MiAv + SGVpZ2h0IDEzMCAvSW50ZXJwb2xhdGUKdHJ1ZSAvQ29sb3JTcGFjZSAyMCAwIFIgL0lu + dGVudCAvUGVyY2VwdHVhbCAvU01hc2sgMjMgMCBSIC9CaXRzUGVyQ29tcG9uZW50Cjgg + L0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB7dABDQAAAMKg909tDwcRKAwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDg + YWDnkAABCmVuZHN0cmVhbQplbmRvYmoKMTYgMCBvYmoKMjgxCmVuZG9iago5IDAgb2Jq + Cjw8IC9MZW5ndGggMTAgMCBSIC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAv + V2lkdGggNDc2IC9IZWlnaHQgMTQ4IC9JbnRlcnBvbGF0ZQp0cnVlIC9Db2xvclNwYWNl + IDIwIDAgUiAvSW50ZW50IC9QZXJjZXB0dWFsIC9TTWFzayAyNSAwIFIgL0JpdHNQZXJD + b21wb25lbnQKOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAHt0IEAAAAA + w6D5U1/hAIVQYcCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG + DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA + AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw + YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG + DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA + AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw + YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG + DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA + AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw + YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG + DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA + AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw + YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG + DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA + AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw + YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG + DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA + AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw + YMCAAQMGDBgwYMDAOzA5vQABCmVuZHN0cmVhbQplbmRvYmoKMTAgMCBvYmoKOTQ1CmVu + ZG9iagoxMyAwIG9iago8PCAvTGVuZ3RoIDE0IDAgUiAvVHlwZSAvWE9iamVjdCAvU3Vi + dHlwZSAvSW1hZ2UgL1dpZHRoIDE1MiAvSGVpZ2h0IDExNiAvSW50ZXJwb2xhdGUKdHJ1 + ZSAvQ29sb3JTcGFjZSAyMCAwIFIgL0ludGVudCAvUGVyY2VwdHVhbCAvU01hc2sgMjcg + MCBSIC9CaXRzUGVyQ29tcG9uZW50CjggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3Ry + ZWFtCngB7dABDQAAAMKg90/t7AERKAwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDgAwPO + oAABCmVuZHN0cmVhbQplbmRvYmoKMTQgMCBvYmoKMjU0CmVuZG9iagoyNSAwIG9iago8 + PCAvTGVuZ3RoIDI2IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2UgL1dp + ZHRoIDQ3NiAvSGVpZ2h0IDE0OCAvQ29sb3JTcGFjZQovRGV2aWNlR3JheSAvSW50ZXJw + b2xhdGUgdHJ1ZSAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl + ID4+CnN0cmVhbQp4Ae2a6U9T3RaHZe48QGmhw9tyytTWUivFMqgtgTAWBxStAwQoEIuF + CqGhEYcS1IZGGRTCEAUkogElYAgSo+b+a3ed6r2vL9St99vZN+v3wZismiyex7X2Pqcc + O4ZBAkgACSABJIAEkAASQAJI4M8JJGGoIPDnRuGT8BMl/50UDEcJ/O0oGZT9geLvXuGn + SU1Nw1BAIDUVZLGaf6c3bva71vSMDN738DEcJPBDTkZGOvwHBMG/sfvDbFpaOmjlCwRC + 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 + CmVuZG9iagoyNiAwIG9iagozNjUxCmVuZG9iagoyMyAwIG9iago8PCAvTGVuZ3RoIDI0 + IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRoIDE1MiAvSGVp + Z2h0IDEzMCAvQ29sb3JTcGFjZQovRGV2aWNlR3JheSAvSW50ZXJwb2xhdGUgdHJ1ZSAv + Qml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4 + Ae2c+1dSWRvHTUtFkIuBioiBMCpKKOYlcWFoDqailmFZjC4vaWoiLR2jFqVkjqROUCw1 + LZNUjPIepVbTrP61efYBuqAiF2ud9108vyies/f5+H2++2Fzzt6EhAQjqEBQgf85BY4c + Shzav41oQr9GWADxtZNQ1GcggE6isLCjR48eO6SArsLCMEQ/2TAoQEI84RERka4g+BWu + 1pEREeGoRwecz2gOKKRSOBARCFFECBJEtN+BWqNeogiEyEgEB8KBbj6hIUchpcKBCZBI + 0WQyhUKl0gIMKpVCIZOjAS8K2BAaRuat1ZBYQAVKEYhEQAKemON0OoMRGxsb53dAYwaD + Tj8eQ6NRAY5IJCDVEJmXkjmojkVERhFJZApCAhpmQkICi5WYmMj2M6ApiwWdMOPiYhEc + hUwiRkVGODTzZnQ6sJBW0WRqDJ0RF5/AYrNPcDhcbjIvoEjmcjmcE2w2KyE+jkGPoYJo + oJlDsoNyiXIIKQQqEqICKHYSh8vjp6SkpgkEgnRHZPgUzkbQPC01JYXP43KS2ICGyEhA + Bsk8OJdOrCgiRsVMTOIAU1q6UCjKzMwSQ2T7GahtVmamSChMTwM2TlIiEyODZDrAPCrm + wiKRafRYZuIJLj9FAEjiUzl5+fmnCyTfotDL+NZCUnA6Pz8v55QY4AQpfO6JRGYsnUYm + eQGGYUVEEqMpNHocK4nLT8sQZZ3KzZcUSotksuKSsyhK/QisYUmxTFYkLZTk557KEmWk + 8blJrDg6jRJNRCaDVO6rGGCFgbcAK4bBZHN4qRmZ4tzThUWys7/Lz5VXVCoUVVVV1X4F + NFQoKivKz8l/PysrKjydK87MSOVx2ExGDAILP4bqxX5gR5xY1OOxCezkFIFInCeRFpeW + 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 + HsH3B3KhaSE2Hp2+d/eXr9f2dP4BXD9MwIJc8C7prKv75PFHvWAaDdNVNi89G6tfKI8w + /VpaQbNVeBvylBdfj0HBRzPWlSU0AXP5Pjudx4YJq/tEGqb3aBrN5mVko09D1zQOrlfA + tQNcvl7a8/nAtQNc2MTw/m3NNfSJKDsD4yK4TfCDXCBlUC/PfnI/GtTLXRHPr4N6edbH + /WhQL3dFPL8O6uVZH/ejQb3cFfH8OqiXZ33cj/5/6LXHPNryc+fRcEf6wHl08HOab5+H + cKpXCH643O6Te74PcHifIA/3vkmQa5/7q3i9j+l4nIa3+77f7pPf+lX3yW8deJ8cnnfg + 8rkCfp/D4PG51VGcPufD7XNRnD5Hxutzd5yuU8Drug7croPB7bohfK6zCsHpurSQvdbx + 3f256/juerOOD4yPy3WP+F0nis91tSE4XYccgtd123hd5+4SDG/7AoALn/sowPm43HeC + BMPlPh0sk2i7Fc72NQEXWAyH+8AQGFgMd/vmQhxgsBcMZ/sMv4HhbF9mCF73sWKKwSZp + vO37hbvBaFTCnnK87ZMGMAcZ3vaVOyTDNMPXPnwEBpIBGd6+twA9c3CgIafh6HseEJgT + DXTD1fdiONBANkw47Bs2EKL/4ewCfqA+nd0H/gN1FngEzhHsIahAUIFfrsB/XZUI7Apl + bmRzdHJlYW0KZW5kb2JqCjI0IDAgb2JqCjI5MDYKZW5kb2JqCjI3IDAgb2JqCjw8IC9M + ZW5ndGggMjggMCBSIC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGgg + MTUyIC9IZWlnaHQgMTE2IC9Db2xvclNwYWNlCi9EZXZpY2VHcmF5IC9JbnRlcnBvbGF0 + ZSB0cnVlIC9CaXRzUGVyQ29tcG9uZW50IDggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4K + c3RyZWFtCngB7Zv5V1JbG8dNS0WQQUFFxEC4KooozuLCcLiYilqGQ3l1qaSpibT0KrYo + JfOKw82BpaZlknPORg7V7a7+tfvsA2Q5IljrvO/y+aVW8Ozz6ft898M+5+zt4nIZlwpc + KvA/p8CVC4kL+28jGtdv4eZEfBvEFY3pDKCVyM3t6tWr1y4oYCg3NwzRQTYMCpAQj7uH + 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 + FINDTXg7pwNPg9GshDNgeDvXBGAWMrydA7NIhmmGr3NzCAwkAzK8nTNE7xwsaMhpODqX + icCsaKAbrs6xWtBANkw47EQsQnQ8rEPAH2hM6/DO/4EGcz6c57gc4VKBSwV+uQL/AS8j + kCEKZW5kc3RyZWFtCmVuZG9iagoyOCAwIG9iagoyODUxCmVuZG9iagoyMSAwIG9iago8 + PCAvTGVuZ3RoIDIyIDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2UgL1dp + ZHRoIDQ3NiAvSGVpZ2h0IDEzMCAvQ29sb3JTcGFjZQovRGV2aWNlR3JheSAvSW50ZXJw + b2xhdGUgdHJ1ZSAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl + ID4+CnN0cmVhbQp4Ae2d609T6RbG5U7vLZS2FGrrbgu9UDrbFgsUbAlNkZtcBKcoELBg + LBYrxsZmEC1BaWwQwYFwiSIS0YBD1BA1Rs35187a1XPmDJStnk/vTtbzwZismqw+P571 + vntjso4dQ6ED6AA6gA6gA+gAOoAOoAPowM87kIHihAM/TxQ+Cd8o829loQh14G9GmYDs + JxB/4wrfJjs7B8UBB7KzARaD+Ud4U2S/Yc3Ny8v/Jh6KQAe+w8nLy4UfQAD8A7rfyebk + 5AJWHp8vEAiEQqEIRaQDgAYA8fm8/HyGLztdBm0WTGIAC1iFIrFYIpXKUMQ6IJVKxGIR + EOYD3m90jxjMKbSQWYasSCyRyQoK5fKiIoVCiSLQAYWiqEguLyyQySRiEUMXsguDOT1c + JrVMaBmyUuCqUKqK1eqS0lINikAHSktL1OpilVIBfKUpuhBdBm6aC3MKLRy0AiGQBbBA + VaPV6U5QehSRDlAndDqtBggDXqArFDDHbnq4GcxZm8eD0MoKFSo1cKX0xrJyk9lssVhR + hDlgsZjNpvIyo54CvmqVolAG0eXlMTeqw8GF2ALafIFIIpMr1RodZSgzWypsdjtN0ydR + xDkAWOx2W4XFXGagdBq1Ui6TiCC5OdlppjLEFq5R/BTaEi1lNFltdtpRdcpVUwtyo4hy + gGFS4zpV5aDtNqvJSGlLUnD5cKFKE9wMiG0+XyiWyVUlWn25tZJ2umrc9R5vQ2Njow9F + mAMApcHrqXfXuJx0pbVcry1RyWViIT8fgntwKH+LrQDQKkt0BrONdla7PQ0+/5nm1rb2 + syjiHGhva20+4/c1eNzVTtpmNuiY5IoF6YLLsIWJLAW0WoPZ7nDVeRubWto7us/1ng+g + CHTgfO+57o72lqZGb53LYTcbmLEsFUFwDw1lGMm5+QJxgUKt1ZsrnbUeX3NbV0/g4sDg + 0KVgcARFmAPB4KWhwYGLgZ6utmafp9ZZadZr1YoCJriHhnJGJjz/QGxVGqrc5qj1+ls7 + e/sGhoKXQ1fD49ciKMIcuDYevhq6HBwa6OvtbPV7ax22ckqjguDCc9DBA5cZyXDaKtQ6 + o5V2efxt3YH+4dFQOHLjZvRWDEWcA7eiN29EwqHR4f5Ad5vf46KtRp1awZy4MJT/+Woq + xVZSqNRQpkpnnQ/QDgZD4xPR2OTUnfg0ijgH4nemJmPRifFQcBDg+uqclSZKoyyUpGWb + yxNK5cVag5Wu9jZ3BgZHxiLR2FR85n7iQRJFnAMPEvdn4lOxaGRsZDDQ2eytpq0GbbFc + KuTlHsptdi5PxIzkMpvT3dje2x8cux6djN9LJB8+WniMIs6BhUcPk4l78cno9bFgf297 + o9tpK2OGsogHl6kDMzk7jy8uUJZSJrvrdFNX3/CVSHRyejY5v7i0vLq6hiLMgdXV5aXF + +eTs9GQ0cmW4r6vptMtuokqVBWJ+Xhq2AjEct3oLXdPQ0jMwGga0ibmFpZX1JxvPNlGE + OfBs48n6ytLCXALghkcHeloaamiLHg5csSANW7gmy4uPGyscMJIDQ6GJ2N3ZucXltaeb + Wy+2X6IIc2D7xdbm07XlxbnZu7GJ0FAAhrKjwni8WA4X5UO5hUcgiZw5bqvq/R0XguHo + 7ZnkwvL6xvPtVzu7r1GEObC782r7+cb68kJy5nY0HLzQ4a+vYg5cOXNRPnjeAlspsC23 + uzxnugcuR2LxxPzS2sbWy93Xe2/eoghz4M3e692XWxtrS/OJeCxyeaD7jMdlLwe20rRs + hdIi9Qm4Snmbzw2Gbvwxk1xceQpo996+20cR58C7t3sA9+nKYnLmjxuhwXPNXrhMnVAX + SYXpciuUFZVQ5t9qGlp7h8Zu3r7/8M/1ze2dvbf77z98RBHmwIf3+2/3drY31/98eP/2 + zbGh3taGmt/MVEmR7Ai2ilLKTNc2tp2/FI7eScwvP9l69deb/fcfP6GIc+Dj+/03f73a + erI8n7gTDV8639ZYS5upUsXRbOERCNj+Hhy/FX/waGXjxc7eO0D7+QuKMAc+f/r4/t3e + zouNlUcP4rfGg78zbC36H7JtDwSvxaaTi6vPtnff7H8AtF9RhDnw5fOnD/tvdrefrS4m + p2PXgvAQdBRb+BVfvlCmKE3lNg3bf6GIcuArO9t//K+ajKwceJ0Mr6WsJ92+s4GRCOT2 + 8drmy9dv9z9++vKVqO+FzYADX798+rj/9vXLzbXHkNvISOCsz33SCi+m4IVyThay5fIP + CbLlMj323pEtuz9criJbLtNj7x3ZsvvD5Sqy5TI99t6RLbs/XK4iWy7TY+8d2bL7w+Uq + suUyPfbekS27P1yuIlsu02PvHdmy+8PlKrLlMj323pEtuz9criJbLtNj7x3ZsvvD5Sqy + 5TI99t6RLbs/XK4iWy7TY+8d2bL7w+UqsuUyPfbekS27P1yuIlsu02PvHdmy+8PlKrLl + Mj323pEtuz9criJbLtNj7x3ZsvvD5Sqy5TI99t6RLbs/XK4iWy7TY+8d2bL7w+UqsuUy + PfbekS27P1yuIlsu02PvHdmy+8PlKrLlMj323pEtuz9criJbLtNj7x3ZsvvD5Sqy5TI9 + 9t6RLbs/XK4iWy7TY+8d2bL7w+UqsuUyPfbekS27P1yuIlsu02PvHdmy+8PlKrLlMj32 + 3pEtuz9criJbLtNj7x3ZsvvD5eqvsMUdMpwi/Ss7ZI79gC1hm4+wHfb9QAd2kv/P7ifc + 2UbYgrY07fwfO9tw1yJxSxWPaOhXdy3ijlTCNqEe3c6v7kjF3cbEbTA+uqFf222MO8kJ + 2zvO1s4v7iQXSGDffJmtqt7fcSEYjt6eSS4sr2883361s/saRZgDuzuvtp9vrC8vJGdu + R8PBCx3++ipbGeybl6TZN5+dLxDLi48bKxzuxvbAUGgidnd2bnF57enm1ovtlyjCHNh+ + sbX5dG15cW72bmwiNATrb92OCuPxYrlYkJ+deeAZKDtPIC6EJakWuqahpWdgNBydnE7M + LSytrD/ZeLaJIsyBZxtP1leWFuYS05PR8OhAT0tDDayt1igLxYK8NGz54gJlKWWyu043 + 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 + /Bfk94rnnygCL2zgyJm6bVNx7xChZaVuc64CF7/RffC2bmujfjj8BFg8qxatUjWfILwB + HHaHeh7oKZjTlpbNOVKHLJ+TuunKYlLMUNtDUlLXJddlSxazmVVi6XbYmdMdbhyhOUL3 + xKdKZZP6r/ERsP2wUvn5rFLZfk4a1oGX+m/AvP1FCmVuZHN0cmVhbQplbmRvYmoKMzAg + MCBvYmoKNzM3CmVuZG9iago4IDAgb2JqClsgL0lDQ0Jhc2VkIDI5IDAgUiBdCmVuZG9i + agozMSAwIG9iago8PCAvTGVuZ3RoIDMyIDAgUiAvTiAxIC9BbHRlcm5hdGUgL0Rldmlj + ZUdyYXkgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBhVJPSBRRHP7NNhKE + iEGFeIh3CgmVKaysoNp2dVmVbVuV0qIYZ9+6o7Mz05vZNcWTBF2iPHUPomN07NChm5ei + wKxL1yCpIAg8dej7zezqKIRveTvf+/39ft97RG2dpu87KUFUc0OVK6Wnbk5Ni4MfKUUd + 1E5YphX46WJxjLHruZK/u9fWZ9LYst7HtXb79j21lWVgIeottrcQ+iGRZgAfmZ8oZYCz + wB2Wr9g+ATxYDqwa8COiAw+auTDT0Zx0pbItkVPmoigqr2I7Sa77+bnGvou1iYP+XI9m + 1o69s+qq0UzUtPdEobwPrkQZz19U9mw1FKcN45xIQxop8q7V3ytMxxGRKxBKBlI1ZLmf + ak6ddeB1GLtdupPj+PYQpT7JYKiJtemymR2FfQB2KsvsEPAF6PGyYg/ngXth/1tRw5PA + J2E/ZId51q0f9heuU+B7hD014M4UrsXx2oofXi0BQ/dUI2iMc03E09c5c6SI7zHUGZj3 + RjmmCzF3lqoTN4A7YR9ZqmYKsV37ruol7nsCd9PjO9GbOQtcoBxJcrEV2RTQPAlYFH2L + sEkOPD7OHlXgd6iYwBy5idzNKPce1REbZ6NSgVZ6jVfGT+O58cX4ZWwYz4B+rHbXe3z/ + 6eMVdde2Pjz5jXrcOa69nRtVYVZxZQvd/8cyhI/ZJzmmwdOhWVhr2HbkD5rMTLAMKMR/ + BT6X+pITVdzV7u24RRLMUD4sbCW6S1RuKdTqPYNKrBwr2AB2cJLELFocuFNrujl4d9gi + em35TVey64b++vZ6+9ryHm3KqCkoE82zRGaUsVuj5N142/1mkRGfODq+572KWsn+SUUQ + P4U5WiryFFX0VlDWxG9nDn4btn5cP6Xn9UH9PAk9rZ/Rr+ijEb4MdEnPwnNRH6NJ8LBp + IeISoIqDM9ROVGONA+Ip8fK0W2SR/Q9AGf1mCmVuZHN0cmVhbQplbmRvYmoKMzIgMCBv + YmoKNzA0CmVuZG9iagoxNyAwIG9iagpbIC9JQ0NCYXNlZCAzMSAwIFIgXQplbmRvYmoK + MzMgMCBvYmoKPDwgL0xlbmd0aCAzNCAwIFIgL04gMyAvQWx0ZXJuYXRlIC9EZXZpY2VS + R0IgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB1Vl5OFVt17/3PqPjHPM8 + HrPM8zzP8zxHHPM8y5CZFCoRUilFRVRUSCqVhCKEqKiohFIpGTJ+m56e5/2u93v/+a7v + n+++rnPv31lr3eteZ6+1973WOgCwz1EiI0NhOgDCwmOj7Yz1yC6ubmTcOIAACjADQUBD + 8YmJ1LWxsQD/cSyNINLIGJLc1vUfxf5nBr2vX4wPAJANwvb2jfEJQ3AjALCeT2R0LACo + FYQ+EB8biWB0N4KZohEDETy+jQN+4/lt7L2DMegdGQc7fQAwbADgiRRKdAAAJEGETt7r + E4DoIRkAgGUI9w0KB4DRBcFaPoEUXwDYyxAZibCwiG3cgWBR73/RE/AvmELx/lsnhRLw + N/79W5CVyMYGQTGRoZTEnS//l1NYaBxyv3YGAzITw0Ottn3DgnxmfCkG5siVC/lsRobu + +AyRgTj8wh3tEdo2lgj3trL+C2v5RxvZIRhZC9lExuptY+SeQf6RsTYOf9FTkwL1rRBM + ROjFfjGGf/ScDaaYbfuMBqFfj46zc0SwIILvx+y1N0QwElHQh6RAB+e/ZH76+hn8RYdh + /yAj098yMENQrOn2XkyIz/lDIsy3bUD2gpWAOQgFfiAORCNzOJAEFkAfGPw1SwJ/QEE4 + exFeDAgBHxEchqyIQNZEIJj8l5z+v1GMdtYFIOv+u0Yy8EFk4/7e8/duZGTPPzqDgC+C + /9ApyB7bvG3rYjyDMv/Z84/Etr4da2TqZGZl1v/YhBZGy6EV0XpoTbQWWhWQ0SxoDiCJ + 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 + Hnd8osyirOWE4ImjJ9ZPBp58fkrvVH05V3lu+fJp39ODZ3TOXK3grsivWD0bdPbFOeNz + zZXClaVV2Kq9VR/PO53vuqBy4dJFjov5Fzeqw6snauxqOi4pX7pUy1VbUAfXxdXNXna/ + PHDF4ErLVcmr5+pZ6vMbQENcw6drXtdGrptfb7+hcuNqo1BjeRNjU14z1JzYPH8z8OZE + i2vLs1tmt9pb1Vubbkvdrr7Dd+fUXea7BW2Etuy2rXtJ9xbvR96fexDw4H27Z/vYQ5eH + wx22HX2PzB91dxp1PuzS7brXrdl957Ha41tPVJ7c7FHqae5V7G16qvi0qU+pr7lfub9l + QHWg9ZnGs7ZB7cEHQwZDncOmwz3PrZ4/G3EceTHqPjrxwvfFzMvQl99f7X21NpY+jhnP + e033uvQN15vKt7ve1k8oTdydNJjsfWf/buy9z/vPH2I+rE9lfyR9LJ3mnb40IzdzZ9Zo + duDT7k9TnyM/r83lfKH/Uv5V9GvjN51vvfMu81Pfo79v/Ti0wL5Q/VPhZ/uizeKbpbCl + teW8FfaVml8qv7pWnVen1+LXcetlG7s2WjfNN8e3wra2IinRlJ1cAIXMsL8/AD+qkRrC + FakdBgAg0PyuKXYkkHIFQmR2MgZ2oAGiQAtypjtD9TALfBTFibqNjsKoYWlx1HguKnNC + HvU0aTfNB7osBmXGOeZ61gR2Q04U10OeBDInX72AtGC1MFHEU/TUrmfiaAl5yT1SR6U7 + ZFblpOS9FY4pPlJaUpFQdVfLVW/WmNFi0dbVCdUt0WvTnzVkNNIy9jE5bNpk9sJ82mLK + ctpq1nra5pPtvN2i/aojcMI507gwubK58e0Wdhf3kNoj5SnpJUkR8xby4fVl96P3JwSA + gKXA+aDPwVMhb0NfhY2GP48YjhyMGokej5mMnY1bjIcTaBPJSfL7TJO9U5JSj6U1pD/M + eJLZnzWc/Wr/ZM70gW8Hl3M38zGHaA+zHiEXiB9VKtQrsjjmUuxbElOafvxIWfmJupO3 + Tj0tnzj9q4L5rPw5h8q4qvLznRd+VPPX2F7KrG2sm73Ce9WhPrfh/rXlG+KNHk1pzSU3 + 61t6b71v3bjDelemzeye//2sBxXttx6OdCx0MnRJd1s/Dn+S11Pd++jpx378gNAznUGn + obDhzOdFIxWjl180vbz9qn2sa7z7dc+bp28HJoYmX76bfD/74d1U68fcaccZnpmPs3Wf + Qj+Lf56dq/hi9xX9teGby7et+Yrv2t/Hf8Qv0C/U/NT+ObIYtLi+VLDMt9ywor3S98vj + 19xq4hpu7fi6yHrLhvnGxGbcFn4ra2sL8T8aqbUkgB2SBXZDTJAndBPmggtRTKhatB2S + G81gh3GD+CWCHPVB4iZNMh0N/W3GEGYyy1u2UxwGnLPcGbyAnMI3gcSAv1C28HGRStHa + XY1i7eLDEjNSQJpRRlRWT85RPkrhsGKV0l3lVyoLakR1QQ1VTWutAO00nWO6F/Ra9Z8a + jBkOGrUanzPJM400czY3sJCyZLVCWX2zHrPptm2yq7Ivdsh2jHPyc3ZyMXFVd5PazefO + 7EHtsbVnyvOR1wVKtre3j5Yvp++K36h/U0Bx4N4gt2DNEIFQUuivsI/hoxG9kQ+j2qJb + Y27GtsRd23s2Pj8hITEoyXWfRbJminyqaBpXOlMGIRPOXMtayJ7b/y7nxYFnB7ty2/Ju + 5Nccqjxcd+ROwZOj44Xzx9DFnCWypRbHQ8ryT1w7+aoce1rpTEjFhbPvKgWqgs43Xtio + NqyJunSwtqru/uUXVxbq6RokrplfD71xtLG5afwmpkX2llfr0dudd9bbZJCoOPtgtH2z + g+eRdqdXV3b3pcd9T773cj816ovsPzcwOAgNKQ9HPK8Z+fBC4KXfq+qxsfHvr1ffQhPY + ScI7mvekD8Qpwkf0x43pxZnPs28+DX5+ONf85eLXsm+58wnfzX/AP5oXQn7y/XyxeHhJ + b2kFiQL/X1y/Blfz1nTXVtavbQRtkjdHtyJ2/A8jFQMrEgEmSG16HDyBsJAVVIFk5yHw + LCoRzYZ+iinGxuDC8MlU5YQxojipkGaZLpB+jFGfqYp5kVWdLYK9hKOas5KrgDuGx55X + icxI/sbXz39V4KhgrJC9sIIIs8iC6OiuFrES8VgJZ0lVKWapZekhmRuyJXLx8q4KKoq8 + SkDptfIFFU9VFtUnailIfvJW44imuua01jFtbe0pnUO68rov9dL0BfW7DcINmQxbjSjG + VMbXTTxMSaadZjnmFhYkiz7Lw1YW1njrhzaptkq23+3q7P0ceJBcoczJ0ZnF+YXLaVc/ + N0m3X7s73PM8DDzW9zR7RnlJeH2iXPIO9BH1mfWt8wvzl/b/EdAUmBSkFrQe3BaSGqod + uhF2JzwpQiViObIlal+0Tgwupj+2LM53r3w8On4koS4xI8lln1wyKXk2pSv1QlpOuk+G + QaZQFjZrLnt0/4Oc+gNnDxbl5uZl52ccyjiccSS74MDRgsLCopPHzhZXlVwsrT1+o2z4 + xM9TzOVKp93OpFWcP9t1bqGK67zRhfiLNdWjl0i1hnWpl1uv/KpXb0i5du8GvtGhqap5 + qcXmVv1t+jtJd2fvud8fbrd7OPTIsfN1N+XxXE/sU9B3YID2WdmQ+PC9kd2jay9rxvxe + y77FTHx593kKmhafTfw8+TXiu+hPeJlx1WOjf9v/v3tL22cCVgmA404AOG8CYP8BgHyk + vyF8EekvnQDAhgSAgyqAx0UB7JAEoOOEv88POqTK1AaOIBikg2KkerwN+sE7sAjhIU5I + CtKFHJB6cB9UAFVBLdBT6B20AtPCIrA27AJHw4fhWrgbnkZRocRRNqh41FnUU9QGWgpN + QZcicYfGaGDiMPWYz1hRbAC2GjuLk8BF4JpwG3hjfCF+nEqMKomqh8BDiCE8piZTJ1IP + EWWRWugLyZrUSCNCU0HLRFtAR6Q7SI+h34/UL3mMtIylTGSmK8wqzI9ZdrN8Z81jE2Hr + YPfnIHI0cnpykbjuIhEsyvOat5Rsw0fi6+HPFzATpBF8JlQk7CzCLfJO9OKucDElsQ3x + RxKHJR2lyFJz0s0yB2UD5Mzl5RQ4FGHFb0pjyj0qt1Ub1C6on9Qo0Tyilaedo7NfN1cv + X/+oQbFhudFFJG7vmfabjZl/tlixQlnT2nDaCtnJ22s6GDraOLk4e7mEusa7Ze8ucC/3 + qNtz2/Op11vKDx9qXyE/ff/EgFuBP4OlQqJCb4QtRWhHHogaiOGI9Y27Ho9OcEysSVpN + tku5lLqZvjvjdhZXdsr+Nwc0Dlbn0eUfOLR+JL5guTD9GG1xRanq8bETSaf4ywfPpJ+V + OzddVX7BphpV01Kbd/ni1Q/XpG9kN31s8WidvJt9X/0hfSfqMWuvYf+BwQ8jZi+HXntN + Un94NJMz5zovsPB1+fJayM77gwXpMFgi/Z905O1xFTwCr8A3CA2xQRKI7x2hYCgVOgbV + QG3QMPQJhmA2WBap8/3gDPg0fBd+DW8itbwJKgp1GtWPRiN9pgSkNv+JkcfEYBqR2lsd + m4HtwtHj3HDncT/wuvij+EkqRao8qkmCOqGU8IPahrqByERMIL4hGSM+l6e5SatO20Fn + TfeSPoB+hSGXkYexkcmSaYY5i4WP5QGrLxsVWz27MwfMUc/pwUXkesB9kMeWl4f3G7mD + r5x/r4CdoJwQvdC88JBIs2jpriQxd3FNCR6JTck3Uu3S5xBPp8kly+9TiFdMUIpXTlZJ + Vs1Sy1cv1DijWaPVot2pM667pE8yEDc0NQo3LjFpNR0we2O+YIm1YreWstG3dbGLtt/v + UOZ4xemuc5/LG9cvbqvuGA/aPWyeZC9hiri3lI+Sr7qf6Y6XF4IlQyJCG8LmIxQjk6Lu + RG/F6sZl7e1OoE60TCrY15/CmGqTVpA+lMma5ZZdvv/dAfWDlXno/KhDo0e0C2oKGYqy + js2WOJS2l8mcKD65WR56eqhC4+z5SmJVzPmXF7Wqz12iqs25LHrlXX3ltaAbio1bzS9a + mlqP3UlpC7vv1b67w7PTpzv6SUpvSV/NQOfgzPOmF0VjEW8sJpU/CEwTPqHm1r/9/LGy + +HNlc51hx/+7gA3SSSoCDeApmIFgiAtSQk6QACgNKoOuQ73QRxiGeWEtpLOTDp9HOjmL + KH6UI+oIqhdNi7ZHn0J/xMhhMjADWEFsEnYQJ4XLxX3CW+GvU7FT7af6TvAhDFObULcR + VYnXSbKkJhpHmnXaWjovejb6MYZKxkgmE2YhFjzyLE+yDbE/4ejgvM/Vwl3Jc4A3lhzA + R+GnCAQIxgllCZeJXBPt3jUlDiQ4JRWkrKUDZXJlu+SJCraKJ5QmVMRU49U6NVg1Q7Ue + 6fDoZunNGDgZdhnrmtwz0zfvtDS1emJjYdtnb+3Q62Tm3Omq7/bAXcPjlqeyV7O3gs8d + P03/rkDroCchlqE94cYRHVEa0Q2xAnEl8dQJKYk/9nknv061S+vJsMwcyHba/+p/4avo + upErKldP1P+65nK9qZGqybO5qQV/y7m18vaXu6pt6fcePiC0Wz4s6njeydLl2X3u8fse + 0d7op419mwNmz0oH3w9LPY8dufUCeqn3av9Y52v4jfJb/4miyZtIXbI5xf5RelpvxnzW + 9pPtZ6s5sy+qX4W/kb4tzg99b/iRveCMZBCfFhuWYpYVlr+sXPzlvIpdbVxzXdtcr9ow + 3JjZEtj2f4y//O8GLETUQ9qPb7a2FoSR/mURABuFW1trlVtbG1VIsYH8B3I/9Pf/FTtn + DdJzL9+9je47dKRvX/91/Bd04Y1SCmVuZHN0cmVhbQplbmRvYmoKMzQgMCBvYmoKNTkw + MwplbmRvYmoKMjAgMCBvYmoKWyAvSUNDQmFzZWQgMzMgMCBSIF0KZW5kb2JqCjQgMCBv + YmoKPDwgL1R5cGUgL1BhZ2VzIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdIC9Db3VudCAx + IC9LaWRzIFsgMyAwIFIgXSA+PgplbmRvYmoKMzUgMCBvYmoKPDwgL1R5cGUgL0NhdGFs + b2cgL091dGxpbmVzIDIgMCBSIC9QYWdlcyA0IDAgUiAvVmVyc2lvbiAvMS40ID4+CmVu + ZG9iagoyIDAgb2JqCjw8IC9MYXN0IDM2IDAgUiAvRmlyc3QgMzcgMCBSID4+CmVuZG9i + agozNyAwIG9iago8PCAvUGFyZW50IDM4IDAgUiAvQ291bnQgMCAvRGVzdCBbIDMgMCBS + IC9YWVogMCA3ODIuOCAwIF0gL1RpdGxlICj+/zCtMOMw8zDQMLlcMDAwIFwwMDAxKQo+ + PgplbmRvYmoKMzggMCBvYmoKPDwgPj4KZW5kb2JqCjM2IDAgb2JqCjw8IC9QYXJlbnQg + MzggMCBSIC9Db3VudCAwIC9EZXN0IFsgMyAwIFIgL1hZWiAwIDc4Mi44IDAgXSAvVGl0 + bGUgKP7/MK0w4zDzMNAwuVwwMDAgXDAwMDEpCj4+CmVuZG9iagozOSAwIG9iago8PCAv + TGVuZ3RoIDQwIDAgUiAvTGVuZ3RoMSA2ODA0IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+ + CnN0cmVhbQp4Ab1Ze3RTx5n/Zu5TfiHZliXZlqXra0l+vwBjYcUWRjI2YMdgApaDE8vY + xnZw4oLjhnShTgpNEISU5ZnHSZNtSnmUcjGUyBBYJ4eEstsmJN2kmzS7bTaP9uypD90s + 6SYBW/vdK+NgnyaHP3Jy58zM95j55pvffDNXdzSw/v5OiIchYKCxJdjfBdpj+StWz6/p + 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 + TwUokopSbeYUs8tUme0UXNmpJQk2l74SXIWW4pJh6WDrjYgfd6shP+7WXx3HOHe73UVq + gLvdavir0a8i8x0t2peSAuo0OlKdUoJNAh1ejRImH/cPl4uUNRFlaclmidhnZUogZSbE + i64YiTgduhhSwEp4H45FhiFdIpYULNQdkaf34J7QCqKy2oO7A7dHUopJjf25c1zOIuJ0 + qWGvbglBRlrO5I3JphQbwTbGZB43hYtcER2+Qx0HbnNteHzbgoHfj3xyz0J6hHNWPtHV + 489u+O7L1T3v/OeViwJ5gTS2FK9adac/K8WalZlb99CBF3e2dN9WuqjBW5NrSbIW5fv3 + PH75nWfp5xifpsgVquNa8GZr+S/jC2NGE0iYVHkdbIrbxPAJMYZU3AN4S5QDxgTjLMbG + UOZ6isWSel1auymK7nir+0IRHoL66IYoip6CY/rxD7VdgXvCgBOZ2uPOuQZ57uxDp48e + dRpL4jOSbQtdm1t27eJaJt7aPe4vT4oldKdOfGgtfWW3Fl9Y4O1iJ96B/b1H/auiCOaB + D99tDbASVmmNCN7sRd9zPP7XAfUrl6+oa8yr7Vw32DnQsyaIbaJatTH+h4N3UoAWAFZg + 7sCs/p+CZwLsiUw+SMMUTXCs6bza72a9OsLNfM8M/p4Z/IYZvDo+/D88nfxdCmVuZHN0 + cmVhbQplbmRvYmoKNDAgMCBvYmoKNDExNwplbmRvYmoKNDEgMCBvYmoKPDwgL1R5cGUg + L0ZvbnREZXNjcmlwdG9yIC9Bc2NlbnQgNzcwIC9DYXBIZWlnaHQgNjg0IC9EZXNjZW50 + IC0yMzAgL0ZsYWdzIDMyCi9Gb250QkJveCBbLTk1MSAtNDgxIDE0NDUgMTEyMl0gL0Zv + bnROYW1lIC9NVlJUSVArSGVsdmV0aWNhIC9JdGFsaWNBbmdsZSAwCi9TdGVtViAwIC9N + YXhXaWR0aCAxNTAwIC9YSGVpZ2h0IDUxMyAvRm9udEZpbGUyIDM5IDAgUiA+PgplbmRv + YmoKNDIgMCBvYmoKWyA1NTYgMCAwIDAgMCAwIDAgMCA2MTEgMCAwIDAgMCAwIDAgMCAw + IDAgMCAwIDAgNTU2IDAgMCAwIDAgMCAwIDAgMjIyIDAgNTAwCjAgMCAwIDAgMCAwIDAg + NTAwIDI3OCBdCmVuZG9iagoxOCAwIG9iago8PCAvVHlwZSAvRm9udCAvU3VidHlwZSAv + VHJ1ZVR5cGUgL0Jhc2VGb250IC9NVlJUSVArSGVsdmV0aWNhIC9Gb250RGVzY3JpcHRv + cgo0MSAwIFIgL1dpZHRocyA0MiAwIFIgL0ZpcnN0Q2hhciA3NiAvTGFzdENoYXIgMTE2 + IC9FbmNvZGluZyAvTWFjUm9tYW5FbmNvZGluZwo+PgplbmRvYmoKNDMgMCBvYmoKPDwg + L0xlbmd0aCA0NCAwIFIgL0xlbmd0aDEgNzIyNCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+ + PgpzdHJlYW0KeAG9WXt0VEWa/7777s6D7k463Z2k033pdHfeIQECTWLShO6QAImBIKaR + aBKSkCBRhBjFGdioMEBAfPCK4lHZYZHHIpfAageERQ+jMusozsNZHXcdV2Tm7DHrrouz + Kia9X3VCJBz18IfHqq5b36uqvvurr+reW9216t5WiIMe4KF2cdPKNoimlB1U7Vva2bRy + hDf9nurepd1dzhFezADgV7StXNY5witkr7cvW7FmtH1CF4D8RntrU8uIHr6huqidBCM8 + TqE6vb2z6/4R3nSCaueKu5eO6hMaiTd1Nt0/Oj58wPR3NXW2Uk0phcnTV969msZhKaWE + LlNWrmodtcd68u9tQJIqcDfo4E6QgQMD5Qby7K96OwikZXpKLTkx2++YUPIFGJUof0f1 + o9H6NfXld79s/cYb87jyFQl0V+1ZLWUOZwLEIukHYx4f00Tb0UUJQ112GKqolFGZSiU7 + e6YVenA/PEblOSo8dOAWWENlM5UnqQhj1EHiBnBLv6D4T+IaSMY5/hjBsTDR5rDqYxy/ + DaN04hnHe9aPT6GNZu8jtPXHgW6mHp/DZ6EFHPgP4MYHoBIy8KnjmSscjaQ6CCup9FDh + o1fEg/1phY4zmANuAamNB9IEfNHxl4JcxycFYQ77Ha96wwJVr6QR55/gOGt/xvHP9mWO + M1QOj6gOZZLFi46D9hWO7WlhfKrf8YQ9jNTm8ZHqXjs1fdHRmbnL0VIQ1c/bFeYO9zt8 + pF/kj3EUTVcdU+0XHfnesILE59rnObIKfuNIp4Zk5qRO3X6jI9W+3TGDVGn2oHcGlVN4 + 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 + 49EL7z3HfUVPCvNwFf9XOjWygg1+7b+r17zJ+ryVZ2tluqnSVG9aJt/H3ydvTeyD3WKf + eXfSbssBOJBkqIS55tmW82YhIL4mchvF/bAfnxcPWMT0DNFqtiQhSObYmAl2Jd4m22xJ + KewhAXjUYrYejX00yZac8nt1GYtGelRUX7QO+Xz0G3leWEe2MZqtQlu+lVZRCYtPOpT2 + m8xmSErqNFksVhGx0wRgpQeIYe25aKVQjQ00i/cge0JMlnhO5qLATU2jkC6aVorTcDLy + vPq65+Hm8qd7nvZkpuVnGQrzDWJp/HDXm+hAIX/Z8OPDn74w3HZCUvbFSapV2ZEu1HzT + xz/EYj2aIq10Tvldif2dlA7TIECngLfAIlgSNUI6fR15F5Ho/yioXrRgYVVtdmXriu7W + ro6lTWQzomXG9D8bnRsC9QCwkEoLFfaf13oqOyKjiWgYo5HedcbzrN21ejbCtfyd1/Gr + ruNXX8evYfz/A8iMSxsKZW5kc3RyZWFtCmVuZG9iago0NCAwIG9iago0NDQyCmVuZG9i + ago0NSAwIG9iago8PCAvVHlwZSAvRm9udERlc2NyaXB0b3IgL0FzY2VudCA3NzAgL0Nh + cEhlaWdodCA2ODQgL0Rlc2NlbnQgLTIzMCAvRmxhZ3MgMzIKL0ZvbnRCQm94IFstOTUx + IC00ODEgMTQ0NSAxMTIyXSAvRm9udE5hbWUgL01WUlRJUCtIZWx2ZXRpY2EgL0l0YWxp + Y0FuZ2xlIDAKL1N0ZW1WIDAgL01heFdpZHRoIDE1MDAgL1hIZWlnaHQgNTEzIC9Gb250 + RmlsZTIgNDMgMCBSID4+CmVuZG9iago0NiAwIG9iagpbIDY2NyAwIDAgMCAwIDAgMCAw + IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA2MTEgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg + NTU2CjAgMCAwIDAgMCAwIDAgMCAwIDUwMCAwIDAgMCAwIDAgMCAzMzMgNTAwIDAgMCAw + IDAgMCA1MDAgXQplbmRvYmoKMTkgMCBvYmoKPDwgL1R5cGUgL0ZvbnQgL1N1YnR5cGUg + L1RydWVUeXBlIC9CYXNlRm9udCAvTVZSVElQK0hlbHZldGljYSAvRm9udERlc2NyaXB0 + b3IKNDUgMCBSIC9XaWR0aHMgNDYgMCBSIC9GaXJzdENoYXIgNjUgL0xhc3RDaGFyIDEy + MSAvRW5jb2RpbmcgL01hY1JvbWFuRW5jb2RpbmcKPj4KZW5kb2JqCjQ3IDAgb2JqCihN + YWMgT1MgWCAxMC42LjggUXVhcnR6IFBERkNvbnRleHQpCmVuZG9iago0OCAwIG9iagoo + RDoyMDEyMDIwNTE4MTAyM1owMCcwMCcpCmVuZG9iagoxIDAgb2JqCjw8IC9Qcm9kdWNl + ciA0NyAwIFIgL0NyZWF0aW9uRGF0ZSA0OCAwIFIgL01vZERhdGUgNDggMCBSID4+CmVu + ZG9iagp4cmVmCjAgNDkKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDQwMDY3IDAwMDAw + IG4gCjAwMDAwMjk4NDAgMDAwMDAgbiAKMDAwMDAwNDY4MCAwMDAwMCBuIAowMDAwMDI5 + Njc3IDAwMDAwIG4gCjAwMDAwMDAwMjIgMDAwMDAgbiAKMDAwMDAwNDY2MCAwMDAwMCBu + IAowMDAwMDA0ODE3IDAwMDAwIG4gCjAwMDAwMjI3MTIgMDAwMDAgbiAKMDAwMDAwNjYy + MyAwMDAwMCBuIAowMDAwMDA3Nzg4IDAwMDAwIG4gCjAwMDAwMDUwMjcgMDAwMDAgbiAK + MDAwMDAwNjA4MSAwMDAwMCBuIAowMDAwMDA3ODA4IDAwMDAwIG4gCjAwMDAwMDgyODMg + MDAwMDAgbiAKMDAwMDAwNjEwMSAwMDAwMCBuIAowMDAwMDA2NjAzIDAwMDAwIG4gCjAw + MDAwMjM1NzYgMDAwMDAgbiAKMDAwMDAzNDY5NyAwMDAwMCBuIAowMDAwMDM5Nzk4IDAw + MDAwIG4gCjAwMDAwMjk2NDAgMDAwMDAgbiAKMDAwMDAxODM1MCAwMDAwMCBuIAowMDAw + MDIxODMxIDAwMDAwIG4gCjAwMDAwMTIxNjcgMDAwMDAgbiAKMDAwMDAxNTI2NSAwMDAw + MCBuIAowMDAwMDA4MzAzIDAwMDAwIG4gCjAwMDAwMTIxNDYgMDAwMDAgbiAKMDAwMDAx + NTI4NiAwMDAwMCBuIAowMDAwMDE4MzI5IDAwMDAwIG4gCjAwMDAwMjE4NTIgMDAwMDAg + biAKMDAwMDAyMjY5MiAwMDAwMCBuIAowMDAwMDIyNzQ4IDAwMDAwIG4gCjAwMDAwMjM1 + NTYgMDAwMDAgbiAKMDAwMDAyMzYxMyAwMDAwMCBuIAowMDAwMDI5NjE5IDAwMDAwIG4g + CjAwMDAwMjk3NjAgMDAwMDAgbiAKMDAwMDAzMDAxOSAwMDAwMCBuIAowMDAwMDI5ODg4 + IDAwMDAwIG4gCjAwMDAwMjk5OTcgMDAwMDAgbiAKMDAwMDAzMDEyOCAwMDAwMCBuIAow + MDAwMDM0MzM1IDAwMDAwIG4gCjAwMDAwMzQzNTYgMDAwMDAgbiAKMDAwMDAzNDU4MSAw + MDAwMCBuIAowMDAwMDM0ODcyIDAwMDAwIG4gCjAwMDAwMzk0MDQgMDAwMDAgbiAKMDAw + MDAzOTQyNSAwMDAwMCBuIAowMDAwMDM5NjUwIDAwMDAwIG4gCjAwMDAwMzk5NzMgMDAw + MDAgbiAKMDAwMDA0MDAyNSAwMDAwMCBuIAp0cmFpbGVyCjw8IC9TaXplIDQ5IC9Sb290 + IDM1IDAgUiAvSW5mbyAxIDAgUiAvSUQgWyA8ZThjMWJiZTExYWE4MWZiNjYxZjBhZmRk + N2EwMGNkMDA+CjxlOGMxYmJlMTFhYTgxZmI2NjFmMGFmZGQ3YTAwY2QwMD4gXSA+Pgpz + dGFydHhyZWYKNDAxNDIKJSVFT0YKMSAwIG9iago8PC9BdXRob3IgPGZlZmY5MWQxNTdj + ZTAwMjA4OGQ1PiAvQ3JlYXRpb25EYXRlIChEOjIwMTIwMjA1MTcyMzAwWikvQ3JlYXRv + ciAoT21uaUdyYWZmbGUgNS4yLjMpL01vZERhdGUgKEQ6MjAxMjAyMDUxODEwMDBaKS9Q + cm9kdWNlciA0NyAwIFIgL1RpdGxlICh0YXNrYXJyYXkuZ3JhZmZsZSk+PgplbmRvYmoK + eHJlZgoxIDEKMDAwMDA0MTI4MCAwMDAwMCBuIAp0cmFpbGVyCjw8L0lEIFs8ZThjMWJi + ZTExYWE4MWZiNjYxZjBhZmRkN2EwMGNkMDA+IDxlOGMxYmJlMTFhYTgxZmI2NjFmMGFm + ZGQ3YTAwY2QwMD5dIC9JbmZvIDEgMCBSIC9QcmV2IDQwMTQyIC9Sb290IDM1IDAgUiAv + U2l6ZSA0OT4+CnN0YXJ0eHJlZgo0MTQ2MwolJUVPRgo= + + QuickLookThumbnail + + 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 + AAAYAAABZnB0UFQAAAAWAAABfnpoQ04AAAAMAAABlGVzRVMAAAASAAABoGphSlAAAAAO + AAABsnJ1UlUAAAAkAAABwHN2U0UAAAAQAAAB5HpoVFcAAAAOAAAB9GRlREUAAAAQAAAC + AmZpRkkAAAAQAAACEml0SVQAAAAUAAACImtvS1IAAAAMAAACNgBLAGwAZQB1AHIAZQBu + AC0ATABDAEQATABDAEQALQBmAGEAcgB2AGUAcwBrAOYAcgBtAEsAbwBsAG8AcgAgAEwA + QwBEAEMAbwBsAG8AcgAgAEwAQwBEAEYAYQByAGcAZQAtAEwAQwBEAEwAQwBEACAAYwBv + AHUAbABlAHUAcgBMAEMARAAgAEMAbwBsAG8AcgBpAGQAbwBMAEMARAAgAGEAIABDAG8A + cgBlAHNfaYJyACAATABDAEQATABDAEQAIABjAG8AbABvAHIwqzDpMPwAIABMAEMARAQm + BDIENQRCBD0EPgQ5ACAEFgQaAC0ENAQ4BEEEPwQ7BDUEOQBGAOQAcgBnAC0ATABDAERf + aYJybbJmdphveTpWaABGAGEAcgBiAC0ATABDAEQAVgDkAHIAaQAtAEwAQwBEAEwAQwBE + ACAAYwBvAGwAbwByAGnO7LfsACAATABDAEQAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxl + LCBJbmMuLCAyMDEyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA81IAAQAAAAEW + z1hZWiAAAAAAAABj7AAAOSIAAAfLWFlaIAAAAAAAAG15AACrOgAAH8hYWVogAAAAAAAA + JXIAABulAACrmmN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANgA7AEAA + RQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCjAKgArQCyALcAvADB + AMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQETARkBHwElASsBMgE4AT4BRQFMAVIB + WQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB+gIDAgwCFAId + AiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAMLAxYD + IQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARV + BGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF + 1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeG + B5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJ + jwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5C1ELaQuAC5gLsAvI + C+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3eDfgOEw4uDkkO + ZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExEx + EU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkU + ahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfS + F/cYGxhAGGUYihivGNUY+hkgGUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4ob + shvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHeweFh5AHmoelB6+HukfEx8+H2kflB+/ + H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLdIwojOCNmI5QjwiPwJB8k + TSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhxKKIo1CkG + KTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYu + TC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4 + M/E0KzRlNJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85 + vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/i + QCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANER0SKRM5FEkVVRZpF3kYiRmdG + q0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpMcky6TQJNSk2T + TdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSPVNtV + KFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzW + XSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOll + PWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25 + bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2 + +HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+wn8jf4R/5YBH + gKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhpiM6JM4mZif6K + ZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSK + lPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2f + i5/6oGmg2KFHobaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqP + qwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2 + ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9j74KvoS+/796v/XAcMDswWfB48Jf + wtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bMNcy1zTXNtc42zrbP + N8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp22vvbgNwF + 3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp + 0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK + +Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf//cGFyYQAAAAAAAwAAAAJmZgAA8qcA + AA1ZAAAT0AAACg52Y2d0AAAAAAAAAAAAAwEAAAIAAAAFABkAPABxALgBDQFXAa8CFgKQ + AxsDuwRxBToGDwcLCBwJSwqKC+cNWw7kEIMSNxPsFa8XeBlFGwMcwx54IBshryMvJKcm + DCdfKJsp0SsELDMtXi6QL8Qw+jIuM2I0kzXFNvY4LDlcOok7tjzoPhY/QUBsQZVCvkPp + RRNGPkdjSI1JtUrYS+dM5U3nTulP51DqUfBS9VP6VQBWB1cOWBRZGFohWyZcK10uXi5f + LWAtYSpiJWMfZBllEWYKZwBn9mjwaetq5WvfbNpt127Vb9Rw0nHWctxz4XTpdfV3AngP + eSB6M3tJfGJ9en6Tf7CAw4HKgs+D1ITaheGG54fviPeJ/osFjA+NF44gjyuQNpFCkkyT + WJRklXOWgJeOmJyZq5q5m82c4J35nxWgM6FUonWjnKTGpfKnIqhRqYKqtKvprR+uVK+J + sMCx97MrtF21f7aVt6+4zLnjuv28F70wvkq/ZsCDwZ/CucPWxPPGEscvyE/JbsqKy6fM + xc3mzwjQJdFA0lbTbdSC1ZLWn9es2LXZu9rC28fcyN3L3s3f0ODT4dni4ePp5OLluuaJ + 51XoHujm6avqbOsr6+nsn+1S7gTusO9Y7//wn/E/8dzyd/MR86j0P/TW9Wn1/PaP9yH3 + sPg/+M75Xfns+nn7B/uX/Cf8uP1L/eD+df8I/4P//wAAAAQAEgAsAFIAhgDIARQBXwG3 + AhwCkQMUA6oEUgUNBegG1AfSCPYKMguIDP4OfBAOEbsTaxUgFt8YmxpEG+kdgR8AIH0h + 4CMvJGYlhCaXJ6Ioqim0KsIr1CzoLgAvEzAoMUIyVTNxNI01oza9N9o48zoMOyQ8OT1P + Pmc/f0CTQaVCukPNRNtF0ka6R6FIiklwSldLREwuTRdOA07vT9tQyFG1UqNTlFSEVXVW + ZVdWWEhZO1ouWyFcFV0LXf9e5V/FYKVhhGJiYz5kG2T4ZddmtWeUaHZpWmo9ayNsDWz5 + beZu12/McMNxvnK6c7d0uHWxdqB3i3h4eWl6WXtMfD19M34ofxyAFIEKggKC+4PzhOyF + 4obYh9GIx4m+irOLqIyijauOvI/KkNyR8JMElBuVMZZMl2uYi5mxmtqcBp02nmufpaDi + oiOjaaS0pf2nRahxqYiqo6vArNit868QsCyxS7Jss5C0trXctwW4MblgupC7xrz8vjC/ + ZsCgwdfC/sQexT/GYMeEyKnJzsrxzB3NRs5wz6HQ0tIB0zfUb9Wo1uTYI9ll2qfb29zx + 3frfAeAG4QriDuMN5AzlCuYE5v3n9ejr6d7q0uvD7Lbtpu6Y74nwePFL8gLytvNr9CH0 + 2PWN9kL2+Pew+Gb5HPnS+or7Qfv4/LH9af4g/tf/b///AAAAAgAKABcALABIAGsAlwDK + AQYBTgGfAfoCawLpA3kEGATNBZQGcwdtCHwJnArbDCsNkQ73EGgR2xNDFKMV9Rc7GG8Z + lRqnG6Icjx1zHlMfNiATIO8hzyKuI5AkdCVTJjQnFSfzKNcpuCqVK3QsVy05LhUu9y/T + MLMxlTJ3M1k0ODUfNgA23TelOF85FjnKOn07LTvfPI49Oz3nPpM/Pz/lQIxBM0HZQn9D + JEPIRG5FFEW6RmFHCUeySF1JDUnGSoZLTEwNTM5NjU5MTwhPw1B+UTZR8VKrU2VUHlTb + VZhWVVcWV9hYnVllWi1a+VvEXIpdRF38XrZfcWAsYOphqWJoYyhj6WSrZW1mL2byZ7Vo + emk6afxqvmt+bD9s/W28bnpvOG/3cLhxe3JAcwdzz3SYdWR2M3cEd9Z4q3mBelh7MnwN + fOl9x36lf4aAY4FEgiWDBoPshNeFwYavh6CIkomJioSLgYyBjYGOhI+HkI+RkZKak6CU + o5WmlqqXs5jUmfSbFZw2nVqef5+koMeh86McpEald6aop9epDapFq36suq35rzuwfbG/ + swi0VLWjtva4ULmvuxG8er3pv1zA1MJSw9PFVcbdyGHJ7Mt0zQDOh9AP0ZjTK9S/1lvX + +9mo22XdMd8F4O3i6+UB5yvpeevh7m/xKPQC9xP6Xf3P//8AAG5kaW4AAAAAAAAGNgAA + l1YAAFf+AABT5AAAi1IAACamAAAZmQAAUA0AAFQ5AALcKAACVHoAAZcKAAMBAAACAAAA + EAAoAD8AVQBqAIAAlACoALsAzwDiAPUBCAEbAS4BQQFUAWcBewGPAaMBuAHNAeIB+AIP + AicCPwJYAnICjQKqAsgC5wMJAysDUAN3A6ADzQP9BC4EYQSWBM0FBAU8BXUFrwXrBigG + ZwanBukHLAdvB7UH/QhHCJEI3AkqCXoJywoeCnMKyQsgC3kL0wwxDI4M7Q1PDbQOJw6f + DxQPjxAMEIgRBRGFEgcSihMPE5YUIBStFTgVyRZbFvEXihgnGMQZZhoMGrQbXxwNHL0d + cx4oHt0fliBQIQ0hyyKLI0okDiTRJZImVycdJ+IopiluKjYq/SvFLI0tVS4gLuwvtjCI + MWcySzMyNBo1AjXvNts3yzi7ObA6pTuaPJU9jj6KP4ZAhUGJQotDkESURZxGpkeySL9J + z0rbS+tM+E4DTw9QG1ElUjNTPVRFVVBWWFdgWGxZd1qEW49cnF2rXrtfzWDfYfJjC2Ql + ZUNmeWe5aPRqLmtxbLNt9m8/cIdx0HMadGR1sncEeFV5qHr6fFJ9qX7+gFuBu4MchH2F + 3oc8iKeKEIuHjPyOd4/3kYCTD5SfljmX25l6myKc0p6AoDKh56OcpVCnA6i4qoqspq7k + sS+zhLXmuF264b2EwDvDEcYDyRfMRc+H0uTWStnT3WDhC+TF6IbsWfAj8+73rPtr//8A + AAAWADIATQBnAIAAlwCuAMUA2gDvAQQBGAEsAUEBVQFqAX4BkwGoAb4B1AHqAgECGAIx + AksCZQKBAp0CvQLdAv4DIQNIA3EDnQPPBAQEPQR4BLYE9AUzBXMFtAX2BjsGgQbHBxEH + WgekB/IIQQiQCOEJNQmKCeEKOwqWCvILUAuwDBQMeAzeDUcNtA4zDrcPOw/EEE8Q2RFn + EfgSiRMeE7QUTRToFYMWIRbBF2QYCRivGVcaAhqvG10cDBzBHYgeUR8eH+8gxCGcInYj + UiQyJREl8CbTJ7Yolil6KlwrPSweLP4t3i7CL6EwiDF/MnwzezR3NXg2dzd8OHw5gzqL + O5E8nj2oPrg/xkDcQfZDDUQrRUlGbkeVSLpJ0EreS/NNBk4ZTy5QQ1FYUnJThVSYVa1W + vVfOWN5Z7Vr6XAVdD14YXyBgJmErYi5jNmQ7ZUlmeWe5aPNqLWtvbLBt8G81cHpxvHL/ + dEF1g3bIeAt5TXqPe899E35Qf4+A04IXg1qEnIXihzuIoooEi3GM144/j6iREpKDk+mV + VJbCmDCZlJr+nGyd0588oKSiDKNzpNmmPqehqQmqhqworeKvorFpszW0/7bYuLW6k7x9 + vm3AYMJbxF/GY8hyyn3Mlc6o0MbS6NW12JLbb95M4TfkI+cK6gPs/O/08vj19Pj+/BL/ + /wAAACkAUAByAJIAsADNAOgBAgEcATYBTgFnAX8BmAGyAcwB5gICAh8CPgJdAoACpALL + AvUDIgNVA44DzAQPBFMEmwTmBTIFgQXQBiQGegbSBy4HiQfqCE4IsgkZCYUJ8QpjCtQL + SAu+DDkMsg0xDbUOVQ78D6oQYBEYEdsSohNwFEgVJRYIFvEX4RjTGcoaxBvAHLgdoh6H + H3QgZyFhImEjZyR1JYMmmCexKMgp5SsALBstNC5PL2gwiTHHMww0UTWZNuA4Kjl3OsY8 + Fz1sPsVAHkGDQuhEVkXHR0FIv0pDS8ZNSU7KUExRzlNPVMxWSlfGWUNawVw8XblfN2C2 + YjRjvGU9ZsdoT2nKa01sy25Hb8RxPHKwdCN1lXcLeH158ntifN1+Un/LgU2C0IRWhdqH + O4iiigSLcYzXjj+PqJESkoOT6ZVUlsKYMJmUmv6cbJ3TnzygpKIMo3Ok2aY+p6GpCapy + q9atOK6Zr/mxWLK1tAm1X7a1uAi5V7qiu+29Ob6Av8PBCsJNw5LE1cYWx1/IocnjyyjM + cs20zv7QStGW0uPULtV01rnYAdlC2oXbxt0C3jffZuCS4bfi2+P+5RnmL+dC6EvpUepR + 607sSu057ibvDe/18NPxsPKE81f0IfTq9bD2c/c09+34pvlX+gb6tPtZ+/78o/1F/ej/ + I///AABzZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbG1t + b2QAAAAAAAAGEAAAnFsAAAAAwFTEgAAAAAAAAAAAAAAAAAAAAAA= + + ReadOnly + NO + RowAlign + 1 + RowSpacing + 36 + SheetTitle + キャンバス 1 + SmartAlignmentGuidesActive + YES + SmartDistanceGuidesActive + YES + UniqueID + 1 + UseEntirePage + + VPages + 1 + WindowInfo + + CurrentSheet + 0 + ExpandedCanvases + + Frame + {{64, 4}, {1104, 774}} + ListView + + OutlineWidth + 142 + RightSidebar + + ShowRuler + + Sidebar + + SidebarWidth + 120 + VisibleRegion + {{185, 0}, {955, 605}} + Zoom + 1 + ZoomValues + + + キャンバス 1 + 1 + 1 + + + + saveQuickLookFiles + YES + + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/taskarray.pdf Binary file paper/images/taskarray.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/universe.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/universe.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/universe.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 270 167 +%%CreationDate: Tue Jan 10 13:32:02 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/universe.pdf Binary file paper/images/universe.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/universe2.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/universe2.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/universe2.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 641 479 +%%CreationDate: Tue Jan 10 13:32:02 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/universe2.pdf Binary file paper/images/universe2.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/universe3.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/universe3.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/universe3.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 640 480 +%%CreationDate: Tue Jan 10 13:32:02 2012 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/universe3.pdf Binary file paper/images/universe3.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/wc_graf1.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/wc_graf1.bb Tue Feb 07 17:38:59 2012 +0900 @@ -0,0 +1,5 @@ +%%Title: ./images/wc_graf1.pdf +%%Creator: extractbb 20100328 +%%BoundingBox: 0 0 579 272 +%%CreationDate: Wed Mar 16 18:30:55 2011 + diff -r 6d80c2c895e4 -r 5dbcea03717e paper/images/wc_graf1.pdf Binary file paper/images/wc_graf1.pdf has changed diff -r 6d80c2c895e4 -r 5dbcea03717e paper/introduciton.tex --- a/paper/introduciton.tex Sat Jan 14 00:16:39 2012 +0900 +++ b/paper/introduciton.tex Tue Feb 07 17:38:59 2012 +0900 @@ -2,4 +2,9 @@ \pagenumbering{arabic} \section{研究背景と目的} -研究背景と目的 +本研究では、当研究室で開発した並列プログラミングフレームワーク Cerium の改良を行った。 +マルチコアCPUという複数のコアを持つCPUの登場により、その台数効果を得るために並列プログラミングを行う必要がでてきた。複数のコア上でプログラムを動作させる場合、並列プログラミングが必要になる。 +並列プログラミングで台数効果を出すためには、プログラム全体を対象にした並列度が高くなければならない。そのため、並列化部分の特定を行う必要がある。明示的な並列化部分はループ部分であるが、それがプログラムの大部分でなければ、台数効果はでない。そのためループ部分以外ではプログラマが効率的な並列化を考えなければならない。また並列化の際には各コアへの通信、同期、排他制御等の要素が追加され、これらは逐次プログラミングにおいては考慮する必要がなかった。加えて非同期での処理が含まれるため、再現性のないバグが発生する可能性があり、それに対応するデバッグが必要である。またアーキテクチャを理解し、最適なプログラムを書く必要がある。 +これらのように、並列プログラミングでは、その信頼性を維持するために考慮すべき点が逐次プログラミングより多く、開発には技術と手間が必要で、時間がかかる問題がある。 +Cell上でのゲーム作成を行う学生実験でも講義期間中に作品が一定のレベルに達しない問題が生じた。そこで、当研究室では並列プログラミングフレームワーク Cerium を開発した。Cerium は ゲームのシーンを記述する SceneGraph、ソフトウェアレンダリングを行う RenderingEngine、Task をスケジューリングする TaskManager から構成されている。Task とは Cerium が提供するデータ構造で、処理を Task として記述していくことで、TaskManager が自動的にスケジューリングを行い Task の情報に沿った、各コアへの処理の割り振り、同期を行う。現在 RenderingEngine 部分が Task で記述され並列処理にされている。Cerium の動作環境は Cell/PS3, Linux, MacOSX であり、どの環境でもほぼ同じコードで動作する。 +Cerium を用いることで講義期間中でのゲーム作成が可能になった。しかし 実験での使用や例題の実装を通してフレームワークとしての信頼性が十分でないことが明らかになった。それは 仕様通りの稼働率がでないこと、アーキテクチャ依存の記述が避けにくことである。これらの問題点を解決するためにソフトウェアMailQueueの実装、TaskをグルーピングするTaskArrayの実装、明示的なDMAロードを隠蔽するMemorySegmentのAPIの実装、また細かなチューニングを行った。これらの改良によって、信頼性のある並列プログラミングフレームワークを目指す。 diff -r 6d80c2c895e4 -r 5dbcea03717e paper/master_paper.tex --- a/paper/master_paper.tex Sat Jan 14 00:16:39 2012 +0900 +++ b/paper/master_paper.tex Tue Feb 07 17:38:59 2012 +0900 @@ -6,7 +6,7 @@ \input{dummy.tex} %% font -\jtitle{タイトル!!} +\jtitle{並列プログラミングフレームワーク Cerium の改良} \etitle{} \year{平成23年度} \affiliation{\center% @@ -25,7 +25,7 @@ \end{minipage}} \markleftfoot{% 左下に挿入 \begin{minipage}{.8\textwidth} - タイトル!! +並列プログラミングフレームワーク Cerium の改良 \end{minipage}} \newcommand\figref[1]{図 \ref{fig:#1}} @@ -55,6 +55,8 @@ \input{chapter1.tex} \input{chapter2.tex} \input{chapter3.tex} +\input{chapter4.tex} +\input{chapter5.tex} \input{conclusion.tex} %謝辞