Mercurial > hg > Papers > 2009 > gongo-master
changeset 27:90128e098120
きっと完成
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presen/images/rendering.graffle Sun Feb 15 22:39:02 2009 +0900 @@ -0,0 +1,3727 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>ActiveLayerIndex</key> + <integer>0</integer> + <key>ApplicationVersion</key> + <array> + <string>com.omnigroup.OmniGraffle</string> + <string>129.18</string> + </array> + <key>AutoAdjust</key> + <false/> + <key>CanvasColor</key> + <dict> + <key>w</key> + <string>1</string> + </dict> + <key>CanvasOrigin</key> + <string>{0, 0}</string> + <key>CanvasScale</key> + <real>1</real> + <key>ColumnAlign</key> + <integer>1</integer> + <key>ColumnSpacing</key> + <real>36</real> + <key>CreationDate</key> + <string>2008-07-18 12:29:35 +0900</string> + <key>Creator</key> + <string>nunota takehiro</string> + <key>DisplayScale</key> + <string>1 cm = 1 cm</string> + <key>GraphDocumentVersion</key> + <integer>5</integer> + <key>GraphicsList</key> + <array> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>483</integer> + </dict> + <key>ID</key> + <integer>764</integer> + <key>Points</key> + <array> + <string>{377.258, 369.38}</string> + <string>{356, 330.363}</string> + <string>{386.511, 300.778}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>LineType</key> + <integer>1</integer> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>758</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>Group</string> + <key>Graphics</key> + <array> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>743</integer> + <key>Points</key> + <array> + <string>{339.068, 418.765}</string> + <string>{351.8, 418.765}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>744</integer> + <key>Points</key> + <array> + <string>{347.494, 408.492}</string> + <string>{375.607, 408.492}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>745</integer> + <key>Points</key> + <array> + <string>{360.264, 391.996}</string> + <string>{424.719, 391.996}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>746</integer> + <key>Points</key> + <array> + <string>{357.391, 394.993}</string> + <string>{417.074, 394.993}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>747</integer> + <key>Points</key> + <array> + <string>{402.379, 335.814}</string> + <string>{409.552, 335.814}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>748</integer> + <key>Points</key> + <array> + <string>{399.599, 339.469}</string> + <string>{412.332, 339.469}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>749</integer> + <key>Points</key> + <array> + <string>{353.12, 399.464}</string> + <string>{403.302, 399.464}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>750</integer> + <key>Points</key> + <array> + <string>{345.436, 411.783}</string> + <string>{366.126, 411.783}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>751</integer> + <key>Points</key> + <array> + <string>{372.508, 376.708}</string> + <string>{432.191, 376.708}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>752</integer> + <key>Points</key> + <array> + <string>{366.519, 382.503}</string> + <string>{433.369, 382.503}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>753</integer> + <key>Points</key> + <array> + <string>{375.691, 372.635}</string> + <string>{429.008, 372.635}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>754</integer> + <key>Points</key> + <array> + <string>{390.308, 350.507}</string> + <string>{418.088, 350.507}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>755</integer> + <key>Points</key> + <array> + <string>{387.61, 354.92}</string> + <string>{420.634, 354.92}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>756</integer> + <key>Points</key> + <array> + <string>{383.539, 359.299}</string> + <string>{422.064, 359.299}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>757</integer> + <key>Points</key> + <array> + <string>{350.606, 404.802}</string> + <string>{389.131, 404.802}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>758</integer> + <key>Points</key> + <array> + <string>{377.258, 369.38}</string> + <string>{427.44, 369.38}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>759</integer> + <key>Points</key> + <array> + <string>{362.13, 388.298}</string> + <string>{437.759, 388.298}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>760</integer> + <key>Points</key> + <array> + <string>{380.904, 364.812}</string> + <string>{423.794, 364.812}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{333.759, 330.363}, {103.518, 94.86}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>761</integer> + <key>Shape</key> + <string>Bezier</string> + <key>ShapeData</key> + <dict> + <key>UnitPoints</key> + <array> + <string>{0.213846, -0.5}</string> + <string>{0.213846, -0.5}</string> + <string>{-0.5, 0.5}</string> + <string>{-0.5, 0.5}</string> + <string>{-0.5, 0.5}</string> + <string>{0.5, 0.106164}</string> + <string>{0.5, 0.106164}</string> + <string>{0.5, 0.106164}</string> + <string>{0.213846, -0.5}</string> + </array> + </dict> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>TextPlacement</key> + <integer>0</integer> + <key>Wrap</key> + <string>NO</string> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>762</integer> + <key>Points</key> + <array> + <string>{342.649, 414.611}</string> + <string>{360.554, 414.611}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>763</integer> + <key>Points</key> + <array> + <string>{397.013, 344.924}</string> + <string>{414.918, 344.924}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + </dict> + </array> + <key>ID</key> + <integer>742</integer> + </dict> + <dict> + <key>Bounds</key> + <string>{{220.006, 359.143}, {81, 21}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FitText</key> + <string>YES</string> + <key>Flow</key> + <string>Resize</string> + <key>FontInfo</key> + <dict> + <key>Color</key> + <dict> + <key>w</key> + <string>0</string> + </dict> + <key>Font</key> + <string>Helvetica</string> + <key>Size</key> + <real>14</real> + </dict> + <key>ID</key> + <integer>658</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg932\cocoartf949\cocoasubrtf430 +{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs28 \cf0 DrawSpan}</string> + </dict> + <key>Wrap</key> + <string>NO</string> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>FontInfo</key> + <dict> + <key>Font</key> + <string>Helvetica</string> + <key>Size</key> + <real>14</real> + </dict> + <key>Head</key> + <dict> + <key>ID</key> + <integer>434</integer> + </dict> + <key>ID</key> + <integer>24</integer> + <key>Points</key> + <array> + <string>{318.495, 351.868}</string> + <string>{216.512, 350.14}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>493</integer> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{442.236, 214.132}, {63, 24}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FitText</key> + <string>YES</string> + <key>FontInfo</key> + <dict> + <key>Color</key> + <dict> + <key>w</key> + <string>0</string> + </dict> + <key>Font</key> + <string>Helvetica</string> + <key>Size</key> + <real>16</real> + </dict> + <key>ID</key> + <integer>655</integer> + <key>Line</key> + <dict> + <key>ID</key> + <integer>51</integer> + <key>Position</key> + <real>0.84009146690368652</real> + <key>RotationType</key> + <integer>0</integer> + </dict> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg932\cocoartf949\cocoasubrtf430 +{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs32 \cf0 PP2SP}</string> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{271.22, 41.986}, {65, 24}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FitText</key> + <string>YES</string> + <key>FontInfo</key> + <dict> + <key>Color</key> + <dict> + <key>w</key> + <string>0</string> + </dict> + <key>Font</key> + <string>Helvetica</string> + <key>Size</key> + <real>16</real> + </dict> + <key>ID</key> + <integer>654</integer> + <key>Line</key> + <dict> + <key>ID</key> + <integer>22</integer> + <key>Position</key> + <real>0.46539857983589172</real> + <key>RotationType</key> + <integer>0</integer> + </dict> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg932\cocoartf949\cocoasubrtf430 +{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs32 \cf0 SG2PP}</string> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{444.902, 421.482}, {81, 18}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FitText</key> + <string>YES</string> + <key>Flow</key> + <string>Resize</string> + <key>FontInfo</key> + <dict> + <key>Font</key> + <string>Helvetica</string> + <key>Size</key> + <real>14</real> + </dict> + <key>ID</key> + <integer>477</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg932\cocoartf949\cocoasubrtf430 +{\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\fs30 \cf0 T : Texture}</string> + </dict> + <key>Wrap</key> + <string>NO</string> + </dict> + <dict> + <key>Bounds</key> + <string>{{401.578, 460.081}, {83, 19}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FitText</key> + <string>YES</string> + <key>Flow</key> + <string>Resize</string> + <key>FontInfo</key> + <dict> + <key>Font</key> + <string>Helvetica</string> + <key>Size</key> + <real>15</real> + </dict> + <key>ID</key> + <integer>478</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg932\cocoartf949\cocoasubrtf430 +{\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\fs32 \cf0 SpanPack}</string> + </dict> + <key>Wrap</key> + <string>NO</string> + </dict> + <dict> + <key>Bounds</key> + <string>{{525.916, 417.313}, {18.0284, 18.1687}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>479</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg932\cocoartf949\cocoasubrtf430 +{\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\fs24 \cf0 T}</string> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{500.873, 394.386}, {18.0284, 18.1687}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>480</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg932\cocoartf949\cocoasubrtf430 +{\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\fs24 \cf0 T}</string> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{475.83, 371.459}, {18.0284, 18.1687}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>481</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg932\cocoartf949\cocoasubrtf430 +{\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\fs24 \cf0 T}</string> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{450.788, 344.638}, {18.0284, 18.1687}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>482</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg932\cocoartf949\cocoasubrtf430 +{\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\fs24 \cf0 T}</string> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{380.509, 276.722}, {37.532, 23.3598}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FontInfo</key> + <dict> + <key>Font</key> + <string>Helvetica</string> + <key>Size</key> + <real>14</real> + </dict> + <key>ID</key> + <integer>483</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg932\cocoartf949\cocoasubrtf430 +{\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\fs24 \cf0 SPU}</string> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{388.59, 282.346}, {24.3384, 23.3598}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>484</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{392.646, 287.104}, {24.3384, 23.3598}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>485</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{396.252, 291.647}, {24.3384, 23.3598}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>486</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>491</integer> + </dict> + <key>ID</key> + <integer>487</integer> + <key>Points</key> + <array> + <string>{419.022, 284.459}</string> + <string>{429.604, 282.346}</string> + <string>{450.082, 302.88}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>LineType</key> + <integer>1</integer> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>483</integer> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{525.916, 353.29}, {18.0284, 64.023}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>488</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>1</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{500.873, 330.363}, {18.0284, 64.023}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>489</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>1</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{475.83, 307.436}, {18.0284, 64.023}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>490</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>1</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{450.788, 280.615}, {18.0284, 64.023}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>491</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>1</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{318.995, 260.205}, {240.178, 187.415}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>493</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>CornerRadius</key> + <real>5</real> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>Group</string> + <key>Graphics</key> + <array> + <dict> + <key>Bounds</key> + <string>{{449.275, 22.065}, {37, 16}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FitText</key> + <string>YES</string> + <key>Flow</key> + <string>Resize</string> + <key>FontInfo</key> + <dict> + <key>Font</key> + <string>Helvetica</string> + <key>Size</key> + <real>15</real> + </dict> + <key>ID</key> + <integer>595</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg932\cocoartf949\cocoasubrtf430 +{\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\fs26 \cf0 SPU}</string> + </dict> + <key>Wrap</key> + <string>NO</string> + </dict> + <dict> + <key>Class</key> + <string>Group</string> + <key>Graphics</key> + <array> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>608</integer> + </dict> + <key>ID</key> + <integer>597</integer> + <key>Points</key> + <array> + <string>{405.555, 184.096}</string> + <string>{405.555, 172.517}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>604</integer> + <key>Info</key> + <integer>1</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>602</integer> + </dict> + <key>ID</key> + <integer>598</integer> + <key>Points</key> + <array> + <string>{405.554, 172.518}</string> + <string>{419.142, 172.196}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>607</integer> + <key>Info</key> + <integer>1</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>608</integer> + </dict> + <key>ID</key> + <integer>599</integer> + <key>Points</key> + <array> + <string>{391.967, 181.201}</string> + <string>{405.555, 172.517}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>604</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>611</integer> + <key>Info</key> + <integer>1</integer> + </dict> + <key>ID</key> + <integer>600</integer> + <key>Points</key> + <array> + <string>{391.967, 181.201}</string> + <string>{395.025, 167.693}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>605</integer> + <key>Info</key> + <integer>1</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>601</integer> + <key>Points</key> + <array> + <string>{391.967, 181.201}</string> + <string>{385.174, 161.26}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>605</integer> + <key>Info</key> + <integer>1</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>602</integer> + <key>Points</key> + <array> + <string>{419.142, 172.196}</string> + <string>{418.463, 156.114}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>603</integer> + <key>Points</key> + <array> + <string>{405.555, 183.774}</string> + <string>{419.141, 172.517}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>604</integer> + <key>Points</key> + <array> + <string>{391.967, 181.201}</string> + <string>{405.555, 184.096}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>605</integer> + <key>Points</key> + <array> + <string>{385.174, 175.09}</string> + <string>{391.967, 181.201}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>611</integer> + <key>Info</key> + <integer>1</integer> + </dict> + <key>ID</key> + <integer>606</integer> + <key>Points</key> + <array> + <string>{418.463, 156.114}</string> + <string>{395.025, 167.693}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>610</integer> + <key>Info</key> + <integer>1</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>607</integer> + <key>Points</key> + <array> + <string>{395.025, 167.693}</string> + <string>{405.554, 172.518}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>611</integer> + <key>Info</key> + <integer>1</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>610</integer> + <key>Info</key> + <integer>1</integer> + </dict> + <key>ID</key> + <integer>608</integer> + <key>Points</key> + <array> + <string>{405.555, 172.517}</string> + <string>{418.463, 156.114}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>609</integer> + <key>Points</key> + <array> + <string>{385.174, 161.26}</string> + <string>{385.174, 174.769}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>612</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>610</integer> + <key>Points</key> + <array> + <string>{403.517, 149.681}</string> + <string>{418.463, 156.114}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>612</integer> + <key>Info</key> + <integer>1</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>611</integer> + <key>Points</key> + <array> + <string>{385.174, 161.26}</string> + <string>{395.025, 167.693}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>612</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>612</integer> + <key>Points</key> + <array> + <string>{385.174, 161.26}</string> + <string>{403.517, 149.681}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + </array> + <key>ID</key> + <integer>596</integer> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>613</integer> + <key>Points</key> + <array> + <string>{413.677, 154.054}</string> + <string>{433.069, 149.038}</string> + <string>{466.357, 157.722}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>LineType</key> + <integer>1</integer> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>610</integer> + <key>Position</key> + <real>0.67979449033737183</real> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{471.049, 153.229}, {16.3664, 26.7778}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>HFlip</key> + <string>YES</string> + <key>ID</key> + <integer>614</integer> + <key>Rotation</key> + <real>209.84246826171875</real> + <key>Shape</key> + <string>RightTriangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>FillType</key> + <integer>2</integer> + <key>GradientAngle</key> + <real>95</real> + <key>GradientColor</key> + <dict> + <key>b</key> + <string>0.666667</string> + <key>g</key> + <string>0.666667</string> + <key>r</key> + <string>0.666667</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{456.226, 38.065}, {18.3427, 17.3681}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>615</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{458.604, 42.246}, {18.3427, 17.3681}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>616</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{461.661, 45.784}, {18.3427, 17.3681}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>617</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{464.378, 49.161}, {18.3427, 17.3681}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>618</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>619</integer> + <key>Points</key> + <array> + <string>{435.574, 66.529}</string> + <string>{440.74, 53.974}</string> + <string>{453.721, 48.372}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>LineType</key> + <integer>1</integer> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>Group</string> + <key>Graphics</key> + <array> + <dict> + <key>Bounds</key> + <string>{{450.157, 96.067}, {13.5872, 47.6015}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>621</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>1</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{431.283, 79.02}, {13.5872, 47.6015}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>622</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>1</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{412.41, 61.974}, {13.5872, 47.6015}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>623</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>1</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{393.536, 42.033}, {13.5872, 47.6015}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>624</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>1</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + </array> + <key>ID</key> + <integer>620</integer> + </dict> + </array> + <key>ID</key> + <integer>594</integer> + </dict> + <dict> + <key>Bounds</key> + <string>{{305, 199.126}, {104, 19}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FitText</key> + <string>YES</string> + <key>Flow</key> + <string>Resize</string> + <key>FontInfo</key> + <dict> + <key>Font</key> + <string>Helvetica</string> + <key>Size</key> + <real>15</real> + </dict> + <key>ID</key> + <integer>496</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg932\cocoartf949\cocoasubrtf430 +{\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\fs32 \cf0 PolygonPack}</string> + </dict> + <key>Wrap</key> + <string>NO</string> + </dict> + <dict> + <key>Bounds</key> + <string>{{379.717, 16.851}, {118.733, 169.774}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>526</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>CornerRadius</key> + <real>5</real> + </dict> + </dict> + </dict> + <dict> + <key>Class</key> + <string>Group</string> + <key>Graphics</key> + <array> + <dict> + <key>Bounds</key> + <string>{{90.0058, 449.728}, {84, 19}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FitText</key> + <string>YES</string> + <key>Flow</key> + <string>Resize</string> + <key>FontInfo</key> + <dict> + <key>Font</key> + <string>Helvetica</string> + <key>Size</key> + <real>15</real> + </dict> + <key>ID</key> + <integer>427</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg932\cocoartf949\cocoasubrtf430 +{\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\fs32 \cf0 Rendering}</string> + </dict> + <key>Wrap</key> + <string>NO</string> + </dict> + <dict> + <key>Bounds</key> + <string>{{131.556, 331.125}, {73.0662, 69.4796}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>428</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg932\cocoartf949\cocoasubrtf430 +{\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\fs24 \cf0 Frame\ +Buffer}</string> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>428</integer> + </dict> + <key>ID</key> + <integer>429</integer> + <key>Points</key> + <array> + <string>{90.6577, 287.716}</string> + <string>{140.012, 295.354}</string> + <string>{153.886, 330.196}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>LineType</key> + <integer>1</integer> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>430</integer> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{57.3286, 269.427}, {32.3408, 31.2658}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>430</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg932\cocoartf949\cocoasubrtf430 +{\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\fs18 \cf0 SPU}</string> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{61.5206, 276.954}, {32.3408, 31.2658}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>431</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{66.9106, 283.323}, {32.3408, 31.2658}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>432</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{71.7026, 289.403}, {32.3408, 31.2658}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>433</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{48, 255}, {168.012, 187.415}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>434</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>CornerRadius</key> + <real>5</real> + </dict> + </dict> + </dict> + </array> + <key>ID</key> + <integer>426</integer> + </dict> + <dict> + <key>Class</key> + <string>Group</string> + <key>Graphics</key> + <array> + <dict> + <key>Bounds</key> + <string>{{85.8221, 199.126}, {105, 19}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FitText</key> + <string>YES</string> + <key>Flow</key> + <string>Resize</string> + <key>FontInfo</key> + <dict> + <key>Font</key> + <string>Helvetica</string> + <key>Size</key> + <real>15</real> + </dict> + <key>ID</key> + <integer>626</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg932\cocoartf949\cocoasubrtf430 +{\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\fs32 \cf0 Scene Graph}</string> + </dict> + <key>Wrap</key> + <string>NO</string> + </dict> + <dict> + <key>Class</key> + <string>Group</string> + <key>Graphics</key> + <array> + <dict> + <key>Bounds</key> + <string>{{92.3239, 67.912}, {8.14233, 10.0215}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>628</integer> + <key>Rotation</key> + <real>90</real> + <key>Shape</key> + <string>HorizontalTriangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>1</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>1</string> + </dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>AllowToConnect</key> + <false/> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>629</integer> + <key>Points</key> + <array> + <string>{96.5696, 75.998}</string> + <string>{101.566, 68.749}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>1</string> + </dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>AllowToConnect</key> + <false/> + <key>Class</key> + <string>LineGraphic</string> + <key>ID</key> + <integer>630</integer> + <key>Points</key> + <array> + <string>{91.5446, 68.852}</string> + <string>{96.6355, 75.794}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>1</string> + </dict> + <key>HeadArrow</key> + <string>0</string> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{96.4752, 66.009}, {5.09091, 2.75653}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>631</integer> + <key>Shape</key> + <string>SemiCircle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>1</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>1</string> + </dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{91.3843, 66.009}, {5.09091, 2.75653}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>632</integer> + <key>Shape</key> + <string>SemiCircle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>1</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>1</string> + </dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + </array> + <key>ID</key> + <integer>627</integer> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>641</integer> + </dict> + <key>ID</key> + <integer>633</integer> + <key>Points</key> + <array> + <string>{88.9501, 143.997}</string> + <string>{118.605, 128.341}</string> + <string>{155.135, 144.13}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>LineType</key> + <integer>1</integer> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>650</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>643</integer> + </dict> + <key>ID</key> + <integer>634</integer> + <key>Points</key> + <array> + <string>{106.032, 75.7234}</string> + <string>{140.784, 52.133}</string> + <string>{176.7, 79.4162}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>LineType</key> + <integer>1</integer> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>651</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>646</integer> + </dict> + <key>ID</key> + <integer>635</integer> + <key>Points</key> + <array> + <string>{100.577, 41.5559}</string> + <string>{130.366, 36.802}</string> + <string>{175.285, 42.1223}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>LineType</key> + <integer>1</integer> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>652</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>644</integer> + </dict> + <key>ID</key> + <integer>636</integer> + <key>Points</key> + <array> + <string>{176.054, 89.1448}</string> + <string>{155.305, 100.179}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>643</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>645</integer> + </dict> + <key>ID</key> + <integer>637</integer> + <key>Points</key> + <array> + <string>{191.863, 89.1877}</string> + <string>{212.198, 100.136}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>643</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>642</integer> + </dict> + <key>ID</key> + <integer>638</integer> + <key>Points</key> + <array> + <string>{187.089, 94.2583}</string> + <string>{201.849, 138.337}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>643</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>641</integer> + </dict> + <key>ID</key> + <integer>639</integer> + <key>Points</key> + <array> + <string>{180.889, 94.2773}</string> + <string>{166.377, 138.318}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>643</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>643</integer> + </dict> + <key>ID</key> + <integer>640</integer> + <key>Points</key> + <array> + <string>{183.967, 53.1335}</string> + <string>{183.967, 74.954}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>646</integer> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{155.57, 138.676}, {15.4585, 17.9655}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>641</integer> + <key>Shape</key> + <string>Circle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.4</string> + <key>g</key> + <string>0.4</string> + <key>r</key> + <string>0.4</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{197.241, 138.676}, {15.4585, 17.9655}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>642</integer> + <key>Shape</key> + <string>Circle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.25098</string> + <key>g</key> + <string>0.501961</string> + <key>r</key> + <string>0</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{176.238, 75.954}, {15.4585, 17.9655}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>643</integer> + <key>Shape</key> + <string>Circle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.501961</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0.25098</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{139.662, 95.404}, {15.4585, 17.9655}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>644</integer> + <key>Shape</key> + <string>Circle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>1</string> + <key>r</key> + <string>1</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{212.364, 95.404}, {15.4585, 17.9655}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>645</integer> + <key>Shape</key> + <string>Circle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>1</string> + <key>r</key> + <string>1</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{176.238, 34.168}, {15.4585, 17.9655}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>646</integer> + <key>Shape</key> + <string>Circle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>1</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{37.4042, 81.345}, {51.7715, 7.18377}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>647</integer> + <key>Rotation</key> + <real>105.71257781982422</real> + <key>Shape</key> + <string>RoundRect</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>1</string> + <key>r</key> + <string>1</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{91.9967, 81.345}, {51.7715, 7.18377}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>648</integer> + <key>Rotation</key> + <real>74.287422180175781</real> + <key>Shape</key> + <string>RoundRect</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>1</string> + <key>r</key> + <string>1</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{69.2129, 141.609}, {59.8852, 12.0979}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>649</integer> + <key>Rotation</key> + <real>90</real> + <key>Shape</key> + <string>RoundRect</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0.501961</string> + <key>r</key> + <string>0</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{52.0742, 141.609}, {59.8852, 12.0979}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>650</integer> + <key>Rotation</key> + <real>90</real> + <key>Shape</key> + <string>RoundRect</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.4</string> + <key>g</key> + <string>0.4</string> + <key>r</key> + <string>0.4</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{75.9678, 59.046}, {29.2367, 54.3244}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>651</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.501961</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0.501961</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>CornerRadius</key> + <real>5</real> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{81.5127, 31.601}, {18.1469, 23.0986}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>652</integer> + <key>Shape</key> + <string>Circle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>1</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Width</key> + <real>2</real> + </dict> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{40.6442, 16.851}, {195.356, 169.774}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>653</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>CornerRadius</key> + <real>5</real> + </dict> + </dict> + </dict> + </array> + <key>ID</key> + <integer>625</integer> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>493</integer> + </dict> + <key>ID</key> + <integer>51</integer> + <key>Points</key> + <array> + <string>{439.083, 101.738}</string> + <string>{496.989, 130.934}</string> + <string>{463.544, 259.721}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>LineType</key> + <integer>1</integer> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>526</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>526</integer> + </dict> + <key>ID</key> + <integer>22</integer> + <key>Points</key> + <array> + <string>{236.482, 74.1214}</string> + <string>{308, 54}</string> + <string>{379.247, 79.9468}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>LineType</key> + <integer>1</integer> + <key>TailArrow</key> + <string>0</string> + <key>Width</key> + <real>2</real> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>653</integer> + </dict> + </dict> + </array> + <key>GridInfo</key> + <dict/> + <key>GuidesLocked</key> + <string>NO</string> + <key>GuidesVisible</key> + <string>YES</string> + <key>HPages</key> + <integer>1</integer> + <key>ImageCounter</key> + <integer>19</integer> + <key>IsPalette</key> + <string>NO</string> + <key>KeepToScale</key> + <false/> + <key>Layers</key> + <array> + <dict> + <key>Lock</key> + <string>NO</string> + <key>Name</key> + <string>レイヤー 1</string> + <key>Print</key> + <string>YES</string> + <key>View</key> + <string>YES</string> + </dict> + </array> + <key>LayoutInfo</key> + <dict/> + <key>LinksVisible</key> + <string>NO</string> + <key>MagnetsVisible</key> + <string>NO</string> + <key>MasterSheet</key> + <string>マスター 1</string> + <key>MasterSheets</key> + <array> + <dict> + <key>ActiveLayerIndex</key> + <integer>0</integer> + <key>AutoAdjust</key> + <true/> + <key>CanvasColor</key> + <dict> + <key>w</key> + <string>1</string> + </dict> + <key>CanvasOrigin</key> + <string>{0, 0}</string> + <key>CanvasScale</key> + <real>1</real> + <key>ColumnAlign</key> + <integer>1</integer> + <key>ColumnSpacing</key> + <real>36</real> + <key>DisplayScale</key> + <string>1 cm = 1 cm</string> + <key>GraphicsList</key> + <array/> + <key>GridInfo</key> + <dict/> + <key>HPages</key> + <integer>1</integer> + <key>IsPalette</key> + <string>NO</string> + <key>KeepToScale</key> + <false/> + <key>Layers</key> + <array> + <dict> + <key>Lock</key> + <string>NO</string> + <key>Name</key> + <string>レイヤー 1</string> + <key>Print</key> + <string>YES</string> + <key>View</key> + <string>YES</string> + </dict> + </array> + <key>LayoutInfo</key> + <dict/> + <key>Orientation</key> + <integer>2</integer> + <key>OutlineStyle</key> + <string>Basic</string> + <key>RowAlign</key> + <integer>1</integer> + <key>RowSpacing</key> + <real>36</real> + <key>SheetTitle</key> + <string>マスター 1</string> + <key>UniqueID</key> + <integer>1</integer> + <key>VPages</key> + <integer>1</integer> + </dict> + </array> + <key>ModificationDate</key> + <string>2009-02-15 14:35:04 +0900</string> + <key>Modifier</key> + <string>Wataru MIYAGUNI</string> + <key>NotesVisible</key> + <string>NO</string> + <key>Orientation</key> + <integer>2</integer> + <key>OriginVisible</key> + <string>NO</string> + <key>OutlineStyle</key> + <string>Basic</string> + <key>PageBreaks</key> + <string>YES</string> + <key>PrintInfo</key> + <dict> + <key>NSBottomMargin</key> + <array> + <string>coded</string> + <string>BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFklwCG</string> + </array> + <key>NSLeftMargin</key> + <array> + <string>coded</string> + <string>BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFklwCG</string> + </array> + <key>NSPaperName</key> + <array> + <string>string</string> + <string>iso-a4</string> + </array> + <key>NSPaperSize</key> + <array> + <string>size</string> + <string>{595.2, 841.8}</string> + </array> + <key>NSRightMargin</key> + <array> + <string>coded</string> + <string>BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFklwCG</string> + </array> + <key>NSTopMargin</key> + <array> + <string>coded</string> + <string>BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFklwCG</string> + </array> + </dict> + <key>ReadOnly</key> + <string>NO</string> + <key>RowAlign</key> + <integer>1</integer> + <key>RowSpacing</key> + <real>36</real> + <key>SheetTitle</key> + <string>キャンバス 1</string> + <key>SmartAlignmentGuidesActive</key> + <string>YES</string> + <key>SmartDistanceGuidesActive</key> + <string>YES</string> + <key>UniqueID</key> + <integer>1</integer> + <key>UseEntirePage</key> + <true/> + <key>VPages</key> + <integer>1</integer> + <key>WindowInfo</key> + <dict> + <key>CurrentSheet</key> + <integer>0</integer> + <key>DrawerTab</key> + <string>Outline</string> + <key>DrawerWidth</key> + <real>209</real> + <key>Frame</key> + <string>{{159, -24}, {592, 746}}</string> + <key>VisibleRegion</key> + <string>{{0, 0}, {577, 632}}</string> + <key>Zoom</key> + <real>1</real> + </dict> +</dict> +</plist>
--- a/presen/presen.html Sun Feb 15 11:44:57 2009 +0900 +++ b/presen/presen.html Sun Feb 15 22:39:02 2009 +0900 @@ -373,7 +373,8 @@ </div> <div class="slide" id="id2"> <h1>研究目的</h1> -<p>Many Core Architecture を用いた並列プログラムの開発をサポートするフレームワーク <span class="text-maroon">Fine Grain Task Manager</span> を提案する</p> +<p>Many Core Architecture を用いた並列プログラムの開発をサポートするフレームワーク <span class="text-maroon">Fine Grain Task Manager</span> 、それを組み込んだ、 +PS3 ゲーム開発用フレームワーク <span class="text-maroon">Cerium</span> を提案する</p> <ul> <li><p class="first">動作環境</p> <ul class="simple"> @@ -382,10 +383,10 @@ </li> <li><p class="first">Fine Grain Task の単位</p> <ul class="simple"> -<li>サブルーチンまたは関数</li> +<li>サブルーチン</li> </ul> </li> -<li><p class="first">Task Manager を用いた開発行程</p> +<li><p class="first">Cerium を用いた開発行程</p> <ol class="arabic simple"> <li>逐次型プログラム</li> <li>データやコードを分割したプログラム</li> @@ -397,11 +398,8 @@ </div> <div class="slide" id="con-t"> <h1>研究目的 (Con't)</h1> -<dl class="docutils"> -<dt><strong>Cerium</strong></dt> -<dd>Task Manager を用いた、PS3ゲーム開発用フレームワーク</dd> -</dl> -<p>Cerium は 3 つの機能で構成されている</p> +<p><strong>Cerium</strong></p> +<p>3 つの機能で構成されている</p> <ul class="simple"> <li>独自の <span class="text-maroon">Rendering Engine</span></li> <li>ゲームに登場するオブジェクトやルールなど、ゲームを構成する要素を @@ -418,7 +416,7 @@ <ul class="simple"> <li>Cell アーキテクチャの概要</li> <li>Many Core プログラミングの特徴</li> -<li>Task Manager の実装、例題</li> +<li>Task Manager の実装</li> <li>Cerium</li> <li>比較</li> <li>まとめと今後の課題</li> @@ -437,7 +435,7 @@ </div> <div class="slide" id="cell-broadband-engine"> <h1>Cell Broadband Engine</h1> -<div align="center" class="align-center"><img alt="images/cell_arch.jpg" class="align-center" src="images/cell_arch.jpg" style="width: 280px;" /></div> +<div align="center" class="align-center"><img alt="images/cell_arch.jpg" class="align-center" src="images/cell_arch.jpg" style="width: 480px;" /></div> <ul class="simple"> <li>1個の PPE と 8 個の SPE がリングバスで構成されている<ul> <li>Linux 側から使える SPE は 6 個</li> @@ -449,7 +447,11 @@ <span class="text-maroon">DMA 命令</span> を送ることで行う</li> </ul> </li> -<li>128 ビットレジスタを用いて SIMD (Single Instruction Multiple Data) が可能</li> +<li>SPE は 128 ビットレジスタを 128 個持っている<ul> +<li>SIMD (Single Instruction Multiple Data) が可能 +(32bit のデータ4つを同時に演算)</li> +</ul> +</li> </ul> </div> <div class="slide" id="id4"> @@ -457,11 +459,6 @@ <p><strong>DMA</strong></p> <ul class="simple"> <li>メインメモリと LS 間でデータが転送される</li> -<li>DMA 転送を行うにはいくつか条件がある<ul> -<li>データサイズは 16 バイトの倍数</li> -<li>転送元と転送先のアドレスが 16 バイト境界に揃えられている</li> -</ul> -</li> </ul> <p><strong>Mailbox</strong></p> <ul> @@ -492,7 +489,7 @@ <h1>定常的な並列度の必要性</h1> <dl class="docutils"> <dt><strong>Amdahl 則</strong></dt> -<dd>元のプログラムの並列化率が低ければ、その性能を生かすことは出来ない</dd> +<dd>プログラムの並列化率が低ければ、その性能を生かすことは出来ない</dd> </dl> <div align="center" class="align-center"><img alt="images/amdahl.jpg" class="align-center" src="images/amdahl.jpg" style="width: 360px;" /></div> <div align="center" style="font-size: large;"> @@ -523,39 +520,34 @@ </ul> </li> <li>データの分割<ul> -<li>自明には行えない可能性がある</li> <li>分割できるデータ構造の採用が必要となる</li> </ul> </li> </ul> +<p>二つの分割は自明には行えず、工夫が必要</p> </div> <div class="slide" id="id7"> -<h1>Many Core の同期とデバッグ</h1> +<h1>Many Core の同期</h1> <dl class="docutils"> <dt><strong>同期</strong></dt> <dd>複数の CPU がデータの待ち合わせ、または、整合性を維持するために、他の CPU との待ち合わせを行うこと</dd> </dl> <ul class="simple"> -<li>各 CPU が待ち合わせを行うと、並列度が下がってしまうため、同期自体を減らす必要がある</li> +<li>他の CPU と干渉するデータ入出力の場合、待ち合わせる必要がある<ul> +<li>待ち時間が無駄になる</li> +</ul> +</li> </ul> <div align="center"> ↓ </div><ul class="simple"> +<li>データ待ちの為にストップする状態を減らす</li> <li>各 CPU が独立に (ロック無しで) データにアクセスできる様にデータを分割すれば良い</li> </ul> -<p><strong>デバッグ</strong></p> -<ul class="simple"> -<li>並列プログラムの実行は非決定的<ul> -<li>非決定的 = 同じ状態で実行しても結果が異なる</li> -</ul> -</li> -<li>バグの状態を再現することが難しい</li> -<li>個々の CPU 上のデータを調べる必要がある</li> -</ul> </div> <div class="slide" id="id8"> <h1>並列プログラムの開発行程</h1> -<p>以下の段階において、それぞれ実装とテストを行う</p> +<p>以下の5段階に置いて、実装とテストを行う</p> <ol class="arabic simple"> <li>C によるシーケンシャルな実装</li> </ol> @@ -575,9 +567,18 @@ <li>この段階まではアーキテクチャに依存しない</li> <li>二分法によるデバッグが可能</li> </ul> +</div> +<div class="slide" id="id9"> +<h1>並列プログラムの開発行程 (Con't)</h1> <ol class="arabic simple" start="4"> <li>分割したコードを並列実行する実装</li> +<li>アーキテクチャに特化した実装</li> </ol> +<ul class="simple"> +<li>SIMD</li> +</ul> +<p>4、5段階目でエラーが出た場合、一度 3. まで戻って +アルゴリズム、データ構造、プログラムの分割を確認する</p> </div> <div class="slide" id="task-manager"> <h1>Task Manager の実装</h1> @@ -590,73 +591,358 @@ <li><span class="text-silver">まとめと今後の課題</span></li> </ul> </div> -<div class="slide" id="id9"> +<div class="slide" id="id10"> <h1>Task Manager</h1> -<p>Task と呼ばれる、分割された各プログラムを管理する</p> +<table> + <tr> + <td><p>Task と呼ばれる、分割された各プログラムを管理する</p> <ul class="simple"> <li>Task はサブルーチンもしくは関数</li> <li>Task 同士の依存関係を考慮</li> <li>実行状態になった Task を各 SPE に割り振る</li> </ul> -<div align="center"><p class="small">Task Manager API</p> +<p class="small">Task Manager User API</p> +<table border="1" class="small docutils"> +<colgroup> +<col width="100%" /> +</colgroup> +<tbody valign="top"> +<tr><td><dl class="first last docutils"> +<dt>HTask* TaskManager::create_task(int ID);</dt> +<dd>Task の生成</dd> +</dl> +</td> +</tr> +<tr><td><dl class="first last docutils"> +<dt>void* TaskManager::allocate</dt> +<dd>実行環境のアライメントを考慮した allocator</dd> +</dl> +</td> +</tr> +</tbody> +</table> +</td> +<td><p class="small">Task API</p> <table border="1" class="small docutils"> <colgroup> -<col width="23%" /> -<col width="77%" /> +<col width="100%" /> </colgroup> <tbody valign="top"> -<tr><td>create_task</td> -<td>Task の生成</td> +<tr><td><dl class="first last docutils"> +<dt>task->add_inData(int addr, int size);</dt> +<dd>Task の入力データの設定 (入力元アドレス、データサイズ)</dd> +</dl> +</td> +</tr> +<tr><td><dl class="first last docutils"> +<dt>task->add_outData(int addr, int size);</dt> +<dd>Task の出力データの設定 (出力先アドレス、データサイズ)</dd> +</dl> +</td> </tr> -<tr><td>allocate</td> -<td>実行環境のアライメントを考慮した allocator</td> +<tr><td><dl class="first last docutils"> +<dt>task->add_param(int param);</dt> +<dd>Task のパラメータ (32bit)</dd> +</dl> +</td> +</tr> +<tr><td><dl class="first last docutils"> +<dt>task->wait_for(HTask *wait);</dt> +<dd>Task の依存関係の考慮</dd> +</dl> +</td> +</tr> +<tr><td><dl class="first last docutils"> +<dt>task->set_cpu(CPU_TYPE type);</dt> +<dd>Task を実行する CPU の設定</dd> +</dl> +</td> </tr> </tbody> </table> -<p class="small">Task API</p> + </td> + </tr> +</table></div> +<div class="slide" id="task"> +<h1>Task の生成</h1> +<pre class="literal-block"> +HTask *task = manager->create_task(TASK_ID) +task->add_inData(in, sizeof(int)*16); // 入力データは in から取得 +task->add_outData(out, sizeof(int)*16); // 出力結果は out へ +task->spawn(); +</pre> +<dl class="docutils"> +<dt>Task ID</dt> +<dd>各タスクに割り振られているグローバルID</dd> +</dl> +<ul class="simple"> +<li>PPE と SPE ではアドレス空間が異なるため、 +単純に関数ポインタを持たせても意味が無い</li> +<li>予め SPE 上の領域に置いてある Task (関数) を選択して実行するために +ID を指定する</li> +<li>HTask が持つのは、SPE 上にある Task を実行するための情報</li> +</ul> +<dl class="docutils"> +<dt><strong>spawn()</strong></dt> +<dd><p class="first">Task を TaskManager が持つ ActiveQueue へ渡す</p> +<ul class="last simple"> +<li>TaskManager は ActiveQueue から Task を取り出し、各 SPE へ割り振る</li> +</ul> +</dd> +</dl> +</div> +<div class="slide" id="id11"> +<h1>Task の依存関係の解決</h1> +<p>TaskManager はタスク依存を解決する機能をもつ</p> +<pre class="literal-block"> +/* task2 は task1、task3 の終了を待つ */ +task2->wait_for(task1); +task2->wait_for(task3); + +/* HTask が持つ依存関係の変数 */ +TaskQueuePtr wait_me; // List of task waiting for me +TaskQueuePtr wait_i; // List of task for which I am waiting +</pre> +<div align="center" class="align-center"><img alt="images/tm_task_depend.jpg" class="align-center" src="images/tm_task_depend.jpg" style="width: 450px;" /></div> +</div> +<div class="slide" id="task-cpu"> +<h1>Task を実行させる CPU の選択</h1> +<p>Task をどの CPU で実行させるかを明示的に選択できる</p> +<pre class="literal-block"> +/* SPE1で実行する */ +task1->set_cpu(SPE_1); + +/* SPEのどれかで実行する */ +task2->set_cpu(SPE_ANY); + +/* PPEで実行する */ +task3->set_cpu(PPE); +</pre> +<ul class="simple"> +<li>PPE 内でもタスクの実行が可能</li> +<li>Mac OS X や Linux で実行する場合、SPE_* を指定したタスクは +そのままメインスレッドで実行される</li> +<li>環境依存のプログラム変換はタスク内部だけでよい</li> +</ul> +</div> +<div class="slide" id="cpu"> +<h1>CPU スレッドスケジューラ</h1> +<table> + <tr> + <td><div align="center" class="align-center"><img alt="images/tm_scheduler.jpg" class="align-center" src="images/tm_scheduler.jpg" style="width: 400px;" /></div> +</td> +<td><ul class="simple"> +<li>PPE から TaskList (Task の集合) を受け取る</li> +<li>TaskList から Task を取り出し、パイプラインに沿って、 +ステージを遷移させながら実行していく</li> +<li>TaskList が空になったら、次の TaskList 要求メッセージを PPE に送る</li> +</ul> + </td> + </tr> +</table></div> +<div class="slide" id="id12"> +<h1>メインスレッドと CPU スレッド間の同期</h1> +<table> + <tr> + <td><img src="images/tm_sync.jpg" width="370px"></td> + <td><ul class="simple"> +<li>同期は 32 ビットメッセージの交換 (Mailbox) により行う</li> +<li>スレッド間の待ち合わせは起こらない</li> +</ul> +<p>Task Manager がもつ Thread</p> +<ul class="simple"> +<li>PPE スレッド</li> +<li>SPE スレッド</li> +<li>SPE の起動、終了を見る Frontend スレッド</li> +<li>SPE からの Mail を監視する Mail スレッド</li> +</ul> + </td> + </tr> +</table></div> +<div class="slide" id="bitonic-sort"> +<h1>例題 Bitonic Sort</h1> +<p>Task Manager を用いて、学生が記述</p> +<div align="center" class="align-center"><img alt="images/tm_sort.jpg" class="align-center" src="images/tm_sort.jpg" style="width: 350px;" /></div> +<ul class="simple"> +<li>ソートデータを複数のブロックに分割</li> +<li>隣り合ったブロックでソートするタスクを生成し、実行</li> +<li>次ステップでは1ブロックずらしてソート</li> +<li>上の手順を、分割ブロック数だけ繰り返す</li> +</ul> +</div> +<div class="slide" id="id13"> +<h1>例題 Bitonic Sort 実行結果</h1> +<ul class="simple"> +<li>整数データは 100 万</li> +<li>SPE の数を変化させて実行速度を比較</li> +</ul> +<div align="center" class="align-center"><img alt="images/tm_sort_calc1m.jpg" class="align-center" src="images/tm_sort_calc1m.jpg" style="width: 480px;" /></div> +<ul class="simple"> +<li>SPE 6 個で 5.1 倍</li> +<li>Task Manager 自体のオーバーヘッドは問題ない</li> +</ul> +</div> +<div class="slide" id="cerium"> +<h1>Cerium</h1> +<ul class="simple"> +<li><span class="text-silver">Cell アーキテクチャの概要</span></li> +<li><span class="text-silver">Many Core プログラミングの特徴</span></li> +<li><span class="text-silver">Task Manager の実装</span></li> +<li><span class="text-big">Cerium</span></li> +<li><span class="text-silver">比較</span></li> +<li><span class="text-silver">まとめと今後の課題</span></li> +</ul> +</div> +<div class="slide" id="id14"> +<h1>Cerium</h1> +<p>PS3ゲーム開発用フレームワーク</p> +<div align="center" class="align-center"><img alt="images/cerium.jpg" class="align-center" src="images/cerium.jpg" style="width: 400px;" /></div> +<ul class="simple"> +<li>Rendering Engine<ul> +<li>Cerium 独自</li> +</ul> +</li> +<li>Scene Graph<ul> +<li>ゲームに登場するオブジェクトやルールなど、ゲームを構成する要素にもつ木構造</li> +</ul> +</li> +<li>Task Manager<ul> +<li>Rendering Engine や Scene Graph の処理 (Task) を複数のSPEへ割り振る</li> +</ul> +</li> +</ul> +</div> +<div class="slide" id="scene-graph"> +<h1>Scene Graph</h1> +<div align="center" class="align-center"><img alt="images/cerium_sg_tree.jpg" class="align-center" src="images/cerium_sg_tree.jpg" style="width: 400px;" /></div> +<ul class="simple"> +<li>Blender <a class="footnote-reference" href="#id16" id="id15" name="id15">[1]</a> で生成したオブジェクトを 独自の XML 形式で出力</li> +<li>XML が持つ情報 (頂点座標、テクスチャ座標、イメージなど) から +SceneGraphNode を生成</li> +<li>ポリゴン情報の他に、オブジェクトの操作(move, collision) を持つ</li> +</ul> +<table class="small docutils footnote" frame="void" id="id16" rules="none"> +<colgroup><col class="label" /><col /></colgroup> +<tbody valign="top"> +<tr><td class="label"><a class="fn-backref" href="#id15" name="id16">[1]</a></td><td>オープンソースの3Dモデリングツール</td></tr> +</tbody> +</table> +</div> +<div class="slide" id="rendering"> +<h1>Rendering</h1> +<table> + <tr> + <td><div align="center" class="align-center"><img alt="images/rendering.jpg" class="align-center" src="images/rendering.jpg" style="width: 400px;" /></div> +</td> +<td><dl class="docutils"> +<dt>SG2PP</dt> +<dd>SceneGraph を操作後、ポリゴンに変換し PolygonPack (ポリゴンの集合)を生成する</dd> +<dt>PP2SG</dt> +<dd>ポリゴンの中から、Span (ポリゴン内にあるx軸に水平な線分) を抽出し、 +SpanPack (Span の集合)を生成する</dd> +<dt>DrawSpan</dt> +<dd>Span を使って 1 ラインずつ FrameBuffer に描画していく</dd> +</dl> + </td> + </tr> +</table></div> +<div class="slide" id="rendering-task"> +<h1>Rendering Task のパイプライン</h1> +<div align="center" class="align-center"><img alt="images/rendering_pipeline.jpg" class="align-center" src="images/rendering_pipeline.jpg" style="width: 350px;" /></div> +<p>レンダリングはフレームが進む毎に全画面更新する</p> +<dl class="docutils"> +<dt><strong>フレーム</strong></dt> +<dd>演算や描画の処理 1ループの間隔</dd> +</dl> +<ol class="arabic simple"> +<li>前フレームに抽出した Span を描画する</li> +<li>現フレームのポリゴンから Span を抽出する</li> +<li>次フレームのポリゴンを計算する</li> +</ol> +<p>SG2PP、PP2SP、Draw の 3つのタスクが平行して処理できる</p> +</div> +<div class="slide" id="id17"> +<h1>Cerium を用いたゲーム開発</h1> +<div align="center" class="align-center"><img alt="images/cerium_game.jpg" class="align-center" src="images/cerium_game.jpg" style="width: 450px;" /></div> +<div align="center"> + SuperDandy3D +</div><ul class="simple"> +<li>3D シューティングゲーム</li> +<li>Cerium を用いて学生が作成</li> +<li>ジョイスティックやキーボードでの操作が可能<ul> +<li>SDL を用いて入力値を取得している</li> +</ul> +</li> +</ul> +</div> +<div class="slide" id="id18"> +<h1>ゲームの実行結果(速度検証)</h1> +<div align="center"><p class="small">ポリゴン数</p> <table border="1" class="small docutils"> <colgroup> -<col width="19%" /> -<col width="81%" /> +<col width="56%" /> +<col width="44%" /> </colgroup> <tbody valign="top"> -<tr><td>add_inData</td> -<td>Task の入力データの設定 (入力元アドレス、データサイズ)</td> -</tr> -<tr><td>add_outData</td> -<td>Task の出力データの設定 (出力先アドレス、データサイズ)</td> +<tr><td>自機</td> +<td>250</td> </tr> -<tr><td>add_param</td> -<td>Task のパラメータ (32bits)</td> +<tr><td>敵機</td> +<td>44</td> </tr> -<tr><td>wait_for</td> -<td>Task の依存関係の考慮</td> -</tr> -<tr><td>set_cpu</td> -<td>Task を実行する CPU の設定</td> +<tr><td>背景</td> +<td>6</td> </tr> </tbody> </table> -</div></div> -<div class="slide" id="gallium"> -<h1>比較 - Gallium</h1> -<dl class="docutils"> -<dt><a class="reference" href="http://www.tungstengraphics.com/wiki/index.php/Gallium3D">Gallium</a></dt> -<dd>オープンソースの 3D グラフィックドライバ</dd> -</dl> -<p>フレームバッファエンジン用のレンダリングエンジンである <a class="reference" href="http://www.mesa3d.org/">OSMesa</a> の -Cell ドライバとして用いられている</p> +<p class="small">Mac OS X 以外は Frame Buffer へ直接出力</p> +<p class="small">Mac OS X は SDL 経由で出力している</p> +<table border="1" class="small docutils"> +<colgroup> +<col width="40%" /> +<col width="60%" /> +</colgroup> +<tbody valign="top"> +<tr><td>Architecture</td> +<td>Speed (FPS : Frame Per Second)</td> +</tr> +<tr><td>Mac OS X 10.5</td> +<td>5.7 FPS</td> +</tr> +<tr><td>Linux (Fedora 10)</td> +<td>7.8 FPS</td> +</tr> +<tr><td>PS3 SPE 1 個</td> +<td>8.1 FPS</td> +</tr> +<tr><td>PS3 SPE 6 個</td> +<td><span class="text-maroon">29.3 FPS</span></td> +</tr> +</tbody> +</table> +</div><ul class="simple"> +<li>SPE 6個で 1 個のものより 3.6 倍</li> +<li>現状<ul> +<li>SceneGraph の演算を SPE で行っていない</li> +<li>SPE での処理に SIMD 演算を組み込んでいない</li> +</ul> +</li> +<li>速度向上する余地あり</li> +</ul> +</div> +<div class="slide" id="id19"> +<h1>他システムとの比較</h1> <ul class="simple"> -<li>Triangle (Polygon) を SPE に送り、その中から得られた Span に -テクスチャを貼ってレンダリングする</li> -<li>SPE は6 個使用</li> -<li>SIMD 演算を積極的に使用している。</li> +<li><span class="text-silver">Cell アーキテクチャの概要</span></li> +<li><span class="text-silver">Many Core プログラミングの特徴</span></li> +<li><span class="text-silver">Task Manager の実装</span></li> +<li><span class="text-silver">Cerium</span></li> +<li><span class="text-big">比較</span></li> +<li><span class="text-silver">まとめと今後の課題</span></li> </ul> -<p>先行研究では Rendering Engine に OSMesa を使用していたため、 -Cerium Rendering Engine のレンダリング手法は OSMesa を参考にしている</p> </div> -<div class="slide" id="gallium-con-t"> -<h1>比較 - Gallium (Con't)</h1> +<div class="slide" id="osmesa-gallium"> +<h1>比較 - OSMesa (Gallium)</h1> <ul class="simple"> <li>先行研究 (神里)<ul> <li>現在 PS3Linux からは <span class="text-maroon">GPU にアクセスできない</span></li> @@ -672,7 +958,7 @@ </li> <li>Gallium<ul> <li>OSMesa の Cell Driver</li> -<li>OpenGL + Gallium でのゲーム開発は可能</li> +<li>OpenGL で動作</li> <li>PS3 上のゲーム開発において、レンダリングのみを SPE に実装するのでは足りない<ul> <li>ゲームに登場するオブジェクトの計算 (衝突判定等)</li> <li>Amdahl 則の問題</li> @@ -688,7 +974,7 @@ </li> </ul> </div> -<div class="slide" id="id11"> +<div class="slide" id="gallium-con-t"> <h1>比較 - Gallium (Con't)</h1> <ul class="simple"> <li>実行速度比較<ul> @@ -698,7 +984,8 @@ </li> </ul> <div align="center" class="align-center"><img alt="images/com_gallium.jpg" class="align-center" src="images/com_gallium.jpg" style="width: 350px;" /></div> -<div align="center"><table border="1" class="docutils"> +<div align="center"> + ポリゴン数 : 1984<table border="1" class="small docutils"> <colgroup> <col width="55%" /> <col width="45%" /> @@ -715,59 +1002,42 @@ </tr> </tbody> </table> -</div></div> +</div><ul class="simple"> +<li>Gallium には OpenGL API の機能が全て乗っているわけではない</li> +<li>Cerium とのレンダリングの機能の違い<ul> +<li>光源、アルファブレンディング、etc..</li> +</ul> +</li> +<li>Cerium、Gallium ともにまだ開発段階</li> +</ul> +</div> <div class="slide" id="opengl"> <h1>比較 - OpenGL</h1> <dl class="docutils"> -<dt><a class="reference" href="http://www.opengl.org/">OpenGL</a></dt> +<dt>OpenGL</dt> <dd>オープンソースの3Dグラフィックスプログラムインターフェース</dd> </dl> <ul class="simple"> -<li>ポリゴンの描画</li> +<li>変換行列、光源、カメラなどの API</li> +<li>親子関係の表現も可能</li> </ul> -<div align="center" style="color: maroon; font-size: large;"> - // 線分3つ指定し、三角形を生成<br /> - glVertex3d(x1, y1, z1);<br /> - glVertex3d(x2, y2, z2);<br /> - glVertex3d(x3, y3, z3);<br /> -</div><ul> -<li><p class="first">OpenGL での親子関係の表現</p> -<dl class="docutils"> -<dt>glPushMatrix();</dt> -<dd><p class="first last">//現在処理してるオブジェクトの変換行列をスタックに登録</p> -</dd> -<dt>makePolygon();</dt> -<dd><p class="first last">//このオブジェクトは今まで Push された変換行列の影響を受ける</p> -</dd> -<dt>glPopMatrix();</dt> -<dd><p class="first last">//スタックから変換行列を取り出す</p> -</dd> -</dl> -</li> -</ul> -</div> -<div class="slide" id="opengl-con-t"> -<h1>比較 - OpenGL (Con't)</h1> -<p>レンダリングは Cerium Rendering Engine を用いて、 -ゲームオブジェクトの操作は OpenGL を用いることでゲーム開発は可能</p> +<p>Cerium での OpenGL の使用の問題</p> <ul class="simple"> -<li>OpenGL が持つレンダリングドライバは使用せずに、オブジェクトの操作結果をポリゴンとして出力するためには、各オブジェクトの変換行列が必要<ul> -<li>各オブジェクトのパラメータは変換行列が掛けられる前の状態を保持</li> +<li>SceneGraph の OpenGL の API にあわせるオーバーヘッド</li> +<li>SceneGraph は自身の変換行列を持っている<ul> +<li>SceneGraph 単体でオブジェクトの操作は可能</li> </ul> </li> -<li>変換行列は OpenGL が内部にもつ Matrix Stack に格納されている</li> -<li>Matrix Stack から、 <span class="text-maroon">各オブジェクトに対応する変換行列</span> を取り出す必要がある</li> +<li>SceneGraph だけで問題ない</li> </ul> -<p>最初から自身の変換行列を持っている SceneGraph というデータ構造を用いれば、 -SPE 上でオブジェクトの操作から変換行列による更新まで一括して行える</p> </div> <div class="slide" id="opencl"> <h1>比較 - OpenCL</h1> <dl class="docutils"> -<dt><strong>OpenCL</strong></dt> +<dt><strong>OpenCL</strong> (2008年12月9日 策定)</dt> <dd>マルチコアCPUやGPU、その他のプロセッサによる、ヘテロジニアスコンピューティングのフレームワーク</dd> </dl> -<div align="center" class="align-center"><img alt="images/cp_opencl_plat.jpg" class="align-center" src="images/cp_opencl_plat.jpg" style="width: 300px;" /></div> +<div align="center" class="align-center"><img alt="images/cp_opencl_plat.jpg" class="align-center" src="images/cp_opencl_plat.jpg" style="width: 350px;" /></div> <ul class="simple"> <li>Host から PE へ実行コマンドが送られる</li> <li>Host や OpenCL Device はコマンドの管理を行う kernel を持つ</li> @@ -781,6 +1051,7 @@ <ul class="simple"> <li>あらゆる Many Core Architecture に対応できるような汎用的な実装</li> <li>開発環境にあわせた記述が必要</li> +<li>現在、Cell 用に実装されたものは無い</li> </ul> <p><strong>Task Manager</strong></p> <ul class="simple"> @@ -788,12 +1059,51 @@ <li>DMA によるメモリアクセスなど、決まった記述で開発できる</li> <li>大幅なコードの変更無く Mac OS X や Linux など複数の環境で動作させることが可能</li> </ul> -<p>Task Manager は <span class="text-maroon">OpenCL による実装の一つ</span> と言える</p> +<p>Task Manager は <span class="text-maroon">OpenCLのような物の一つの実装</span> と言える</p> <ul class="simple"> <li>学生が Cell アーキテクチャの理解、及び Cell プログラミングを行う際は Task Manager が適している</li> </ul> </div> +<div class="slide" id="id20"> +<h1>結論</h1> +<ul class="simple"> +<li><span class="text-silver">Cell アーキテクチャの概要</span></li> +<li><span class="text-silver">Many Core プログラミングの特徴</span></li> +<li><span class="text-silver">Task Manager の実装</span></li> +<li><span class="text-silver">Cerium</span></li> +<li><span class="text-silver">比較</span></li> +<li><span class="text-big">まとめと今後の課題</span></li> +</ul> +</div> +<div class="slide" id="id21"> +<h1>まとめ</h1> +<ul class="simple"> +<li>並列プログラミングのフレームワークとして +TaskManager を提案し、それを用いた、PS3ゲーム開発フレームワークである +Cerium を開発した</li> +<li>Cerium を用いれば、 +学生が手を付けやすい環境(MacOSX、Linux)から開発を始め、 +コードの大幅な変更なく PS3 (Cell) での動作を確認できる</li> +</ul> +</div> +<div class="slide" id="id22"> +<h1>今後の課題</h1> +<ul class="simple"> +<li>SceneGraph の SPE 上での実行</li> +<li>SIMD 演算の使用、もしくはそれに適したデータ構造の採用</li> +<li>プログラムコードの SPE 上での On demand Load<ul> +<li>現在は予めコードを全て置いておく必要がある</li> +</ul> +</li> +<li>レンダリングの機能の追加<ul> +<li>Z-sort</li> +<li>アルファブレンディング</li> +<li>光源</li> +</ul> +</li> +</ul> +</div> </div> </body> </html>
--- a/presen/presen.rst Sun Feb 15 11:44:57 2009 +0900 +++ b/presen/presen.rst Sun Feb 15 22:39:02 2009 +0900 @@ -35,10 +35,12 @@ 実験期間の大半を Cell の勉強に費やさねばならず、 開発されるゲームのレベルが例年一定以上にならない + 研究目的 ============ -Many Core Architecture を用いた並列プログラムの開発をサポートするフレームワーク :maroon:`Fine Grain Task Manager` を提案する +Many Core Architecture を用いた並列プログラムの開発をサポートするフレームワーク :maroon:`Fine Grain Task Manager` 、それを組み込んだ、 +PS3 ゲーム開発用フレームワーク :maroon:`Cerium` を提案する - 動作環境 @@ -46,9 +48,9 @@ - Fine Grain Task の単位 - - サブルーチンまたは関数 + - サブルーチン -- Task Manager を用いた開発行程 +- Cerium を用いた開発行程 1. 逐次型プログラム #. データやコードを分割したプログラム @@ -61,9 +63,8 @@ ================== **Cerium** - Task Manager を用いた、PS3ゲーム開発用フレームワーク -Cerium は 3 つの機能で構成されている +3 つの機能で構成されている - 独自の :maroon:`Rendering Engine` - ゲームに登場するオブジェクトやルールなど、ゲームを構成する要素を @@ -81,7 +82,7 @@ - Cell アーキテクチャの概要 - Many Core プログラミングの特徴 -- Task Manager の実装、例題 +- Task Manager の実装 - Cerium - 比較 - まとめと今後の課題 @@ -101,7 +102,7 @@ .. image:: images/cell_arch.jpg :align: center - :width: 280px + :width: 480px - 1個の PPE と 8 個の SPE がリングバスで構成されている @@ -113,7 +114,10 @@ - SPE が持つ MFC (Memory Flow Controller) へ :maroon:`DMA 命令` を送ることで行う -- 128 ビットレジスタを用いて SIMD (Single Instruction Multiple Data) が可能 +- SPE は 128 ビットレジスタを 128 個持っている + + - SIMD (Single Instruction Multiple Data) が可能 + (32bit のデータ4つを同時に演算) Cell の基本機能 ======================= @@ -122,11 +126,6 @@ - メインメモリと LS 間でデータが転送される -- DMA 転送を行うにはいくつか条件がある - - - データサイズは 16 バイトの倍数 - - 転送元と転送先のアドレスが 16 バイト境界に揃えられている - **Mailbox** - SPE の MFC 内にある FIFO キュー @@ -154,7 +153,7 @@ ======================== **Amdahl 則** - 元のプログラムの並列化率が低ければ、その性能を生かすことは出来ない + プログラムの並列化率が低ければ、その性能を生かすことは出来ない .. image:: images/amdahl.jpg :align: center @@ -200,17 +199,20 @@ - データの分割 - - 自明には行えない可能性がある - 分割できるデータ構造の採用が必要となる -Many Core の同期とデバッグ +二つの分割は自明には行えず、工夫が必要 + + +Many Core の同期 ============================ - **同期** 複数の CPU がデータの待ち合わせ、または、整合性を維持するために、他の CPU との待ち合わせを行うこと -- 各 CPU が待ち合わせを行うと、並列度が下がってしまうため、同期自体を減らす必要がある +- 他の CPU と干渉するデータ入出力の場合、待ち合わせる必要がある + + - 待ち時間が無駄になる .. raw:: html @@ -218,23 +220,14 @@ ↓ </div> +- データ待ちの為にストップする状態を減らす - 各 CPU が独立に (ロック無しで) データにアクセスできる様にデータを分割すれば良い -**デバッグ** - -- 並列プログラムの実行は非決定的 - - - 非決定的 = 同じ状態で実行しても結果が異なる - -- バグの状態を再現することが難しい - -- 個々の CPU 上のデータを調べる必要がある - 並列プログラムの開発行程 -========================== +================================ -以下の段階において、それぞれ実装とテストを行う +以下の5段階に置いて、実装とテストを行う 1. C によるシーケンシャルな実装 @@ -249,8 +242,19 @@ - この段階まではアーキテクチャに依存しない - 二分法によるデバッグが可能 + +並列プログラムの開発行程 (Con't) +================================ + 4. 分割したコードを並列実行する実装 +5. アーキテクチャに特化した実装 + +- SIMD + +4、5段階目でエラーが出た場合、一度 3. まで戻って +アルゴリズム、データ構造、プログラムの分割を確認する + Task Manager の実装 ================================ @@ -266,65 +270,407 @@ Task Manager ================ +.. raw:: html + + <table> + <tr> + <td> + Task と呼ばれる、分割された各プログラムを管理する - Task はサブルーチンもしくは関数 - Task 同士の依存関係を考慮 - 実行状態になった Task を各 SPE に割り振る +.. class:: small + + Task Manager User API + + +----------------------------------------------+ + | HTask* TaskManager::create_task(int ID); | + | Task の生成 | + +----------------------------------------------+ + | void* TaskManager::allocate | + | 実行環境のアライメントを考慮した allocator | + +----------------------------------------------+ + +.. raw:: html + + </td> + <td> + +.. class:: small + + Task API + + +--------------------------------------------------------------+ + |task->add_inData(int addr, int size); | + | Task の入力データの設定 (入力元アドレス、データサイズ) | + +--------------------------------------------------------------+ + |task->add_outData(int addr, int size); | + | Task の出力データの設定 (出力先アドレス、データサイズ) | + +--------------------------------------------------------------+ + |task->add_param(int param); | + | Task のパラメータ (32bit) | + +--------------------------------------------------------------+ + |task->wait_for(HTask \*wait); | + | Task の依存関係の考慮 | + +--------------------------------------------------------------+ + |task->set_cpu(CPU_TYPE type); | + | Task を実行する CPU の設定 | + +--------------------------------------------------------------+ + +.. raw:: html + + </td> + </tr> + </table> + + +Task の生成 +================ + +:: + + HTask *task = manager->create_task(TASK_ID) + task->add_inData(in, sizeof(int)*16); // 入力データは in から取得 + task->add_outData(out, sizeof(int)*16); // 出力結果は out へ + task->spawn(); + +Task ID + 各タスクに割り振られているグローバルID + +- PPE と SPE ではアドレス空間が異なるため、 + 単純に関数ポインタを持たせても意味が無い + +- 予め SPE 上の領域に置いてある Task (関数) を選択して実行するために + ID を指定する + +- HTask が持つのは、SPE 上にある Task を実行するための情報 + +**spawn()** + Task を TaskManager が持つ ActiveQueue へ渡す + + - TaskManager は ActiveQueue から Task を取り出し、各 SPE へ割り振る + +Task の依存関係の解決 +========================= + +TaskManager はタスク依存を解決する機能をもつ + +:: + + /* task2 は task1、task3 の終了を待つ */ + task2->wait_for(task1); + task2->wait_for(task3); + + /* HTask が持つ依存関係の変数 */ + TaskQueuePtr wait_me; // List of task waiting for me + TaskQueuePtr wait_i; // List of task for which I am waiting + + +.. image:: images/tm_task_depend.jpg + :align: center + :width: 450px + + +Task を実行させる CPU の選択 +============================= + +Task をどの CPU で実行させるかを明示的に選択できる + +:: + + /* SPE1で実行する */ + task1->set_cpu(SPE_1); + + /* SPEのどれかで実行する */ + task2->set_cpu(SPE_ANY); + + /* PPEで実行する */ + task3->set_cpu(PPE); + +- PPE 内でもタスクの実行が可能 +- Mac OS X や Linux で実行する場合、SPE_\* を指定したタスクは + そのままメインスレッドで実行される +- 環境依存のプログラム変換はタスク内部だけでよい + +CPU スレッドスケジューラ +========================== + +.. raw:: html + + <table> + <tr> + <td> + +.. image:: images/tm_scheduler.jpg + :align: center + :width: 400px + +.. raw:: html + + </td> + <td> + +- PPE から TaskList (Task の集合) を受け取る + +- TaskList から Task を取り出し、パイプラインに沿って、 + ステージを遷移させながら実行していく + +- TaskList が空になったら、次の TaskList 要求メッセージを PPE に送る + +.. raw:: html + + </td> + </tr> + </table> + +メインスレッドと CPU スレッド間の同期 +======================================= + +.. raw:: html + + <table> + <tr> + <td><img src="images/tm_sync.jpg" width="370px"></td> + <td> + + +- 同期は 32 ビットメッセージの交換 (Mailbox) により行う +- スレッド間の待ち合わせは起こらない + +Task Manager がもつ Thread + +- PPE スレッド +- SPE スレッド +- SPE の起動、終了を見る Frontend スレッド +- SPE からの Mail を監視する Mail スレッド + +.. raw:: html + + </td> + </tr> + </table> + + +例題 Bitonic Sort +========================= + +Task Manager を用いて、学生が記述 + +.. image:: images/tm_sort.jpg + :align: center + :width: 350px + +- ソートデータを複数のブロックに分割 +- 隣り合ったブロックでソートするタスクを生成し、実行 +- 次ステップでは1ブロックずらしてソート +- 上の手順を、分割ブロック数だけ繰り返す + +例題 Bitonic Sort 実行結果 +============================ + +- 整数データは 100 万 +- SPE の数を変化させて実行速度を比較 + +.. image:: images/tm_sort_calc1m.jpg + :align: center + :width: 480px + +- SPE 6 個で 5.1 倍 +- Task Manager 自体のオーバーヘッドは問題ない + +Cerium +================================ + +- :silver:`Cell アーキテクチャの概要` +- :silver:`Many Core プログラミングの特徴` +- :silver:`Task Manager の実装` +- :big:`Cerium` +- :silver:`比較` +- :silver:`まとめと今後の課題` + +Cerium +============= +PS3ゲーム開発用フレームワーク + +.. image:: images/cerium.jpg + :align: center + :width: 400px + +- Rendering Engine + + - Cerium 独自 + +- Scene Graph + + - ゲームに登場するオブジェクトやルールなど、ゲームを構成する要素にもつ木構造 + +- Task Manager + + - Rendering Engine や Scene Graph の処理 (Task) を複数のSPEへ割り振る + +Scene Graph +================= + +.. image:: images/cerium_sg_tree.jpg + :align: center + :width: 400px + +- Blender [#]_ で生成したオブジェクトを 独自の XML 形式で出力 +- XML が持つ情報 (頂点座標、テクスチャ座標、イメージなど) から + SceneGraphNode を生成 +- ポリゴン情報の他に、オブジェクトの操作(move, collision) を持つ + + +.. class:: small + +.. [#] オープンソースの3Dモデリングツール + + +Rendering +============= + +.. raw:: html + + <table> + <tr> + <td> + +.. image:: images/rendering.jpg + :align: center + :width: 400px + +.. raw:: html + + </td> + <td> + +SG2PP + SceneGraph を操作後、ポリゴンに変換し PolygonPack (ポリゴンの集合)を生成する + +PP2SG + ポリゴンの中から、Span (ポリゴン内にあるx軸に水平な線分) を抽出し、 + SpanPack (Span の集合)を生成する + +DrawSpan + Span を使って 1 ラインずつ FrameBuffer に描画していく + +.. raw:: html + + </td> + </tr> + </table> + +Rendering Task のパイプライン +============================== + +.. image:: images/rendering_pipeline.jpg + :align: center + :width: 350px + +レンダリングはフレームが進む毎に全画面更新する + +**フレーム** + 演算や描画の処理 1ループの間隔 + +1. 前フレームに抽出した Span を描画する +#. 現フレームのポリゴンから Span を抽出する +#. 次フレームのポリゴンを計算する + +SG2PP、PP2SP、Draw の 3つのタスクが平行して処理できる + + +Cerium を用いたゲーム開発 +=========================== + +.. image:: images/cerium_game.jpg + :align: center + :width: 450px + +.. raw:: html + + <div align="center"> + SuperDandy3D + </div> + +- 3D シューティングゲーム +- Cerium を用いて学生が作成 +- ジョイスティックやキーボードでの操作が可能 + + - SDL を用いて入力値を取得している + + + +ゲームの実行結果(速度検証) +============================= + .. raw:: html <div align="center"> .. class:: small - Task Manager User API +ポリゴン数 + +.. class:: small - ============= ============================================ - create_task Task の生成 - allocate 実行環境のアライメントを考慮した allocator - ============= ============================================ +========== ======== + 自機 250 +---------- -------- + 敵機 44 +---------- -------- + 背景 6 +========== ======== + +.. class:: small + +Mac OS X 以外は Frame Buffer へ直接出力 - Task API +.. class:: small + +Mac OS X は SDL 経由で出力している + +.. class:: small - ============= ================================================== - add_inData Task の入力データの設定 (入力元アドレス、データサイズ) - add_outData Task の出力データの設定 (出力先アドレス、データサイズ) - add_param Task のパラメータ (32bits) - wait_for Task の依存関係の考慮 - set_cpu Task を実行する CPU の設定 - ============= ================================================== +========================= ===================================== + Architecture Speed (FPS : Frame Per Second) +------------------------- ------------------------------------- + Mac OS X 10.5 5.7 FPS +------------------------- ------------------------------------- + Linux (Fedora 10) 7.8 FPS +------------------------- ------------------------------------- + PS3 SPE 1 個 8.1 FPS +------------------------- ------------------------------------- + PS3 SPE 6 個 :maroon:`29.3 FPS` +========================= ===================================== .. raw:: html </div> +- SPE 6個で 1 個のものより 3.6 倍 +- 現状 + - SceneGraph の演算を SPE で行っていない + - SPE での処理に SIMD 演算を組み込んでいない + +- 速度向上する余地あり + +他システムとの比較 +=============================== + +- :silver:`Cell アーキテクチャの概要` +- :silver:`Many Core プログラミングの特徴` +- :silver:`Task Manager の実装` +- :silver:`Cerium` +- :big:`比較` +- :silver:`まとめと今後の課題` -比較 - Gallium -=========================== - -.. _Gallium: http://www.tungstengraphics.com/wiki/index.php/Gallium3D -.. _OSMesa: http://www.mesa3d.org/ - -Gallium_ - オープンソースの 3D グラフィックドライバ - -フレームバッファエンジン用のレンダリングエンジンである OSMesa_ の -Cell ドライバとして用いられている - -- Triangle (Polygon) を SPE に送り、その中から得られた Span に - テクスチャを貼ってレンダリングする -- SPE は6 個使用 -- SIMD 演算を積極的に使用している。 - -先行研究では Rendering Engine に OSMesa を使用していたため、 -Cerium Rendering Engine のレンダリング手法は OSMesa を参考にしている - - -比較 - Gallium (Con't) +比較 - OSMesa (Gallium) ==================================================== - 先行研究 (神里) @@ -342,7 +688,7 @@ - Gallium - OSMesa の Cell Driver - - OpenGL + Gallium でのゲーム開発は可能 + - OpenGL で動作 - PS3 上のゲーム開発において、レンダリングのみを SPE に実装するのでは足りない - ゲームに登場するオブジェクトの計算 (衝突判定等) @@ -355,6 +701,7 @@ - SceneGraph、レンダリングを SPE 上で処理する + 比較 - Gallium (Con't) ========================== @@ -371,6 +718,9 @@ .. raw:: html <div align="center"> + ポリゴン数 : 1984 + +.. class:: small ===================== =============== Gallium (SPE 6 個) 5.4 FPS @@ -383,67 +733,42 @@ .. raw:: html </div> - + +- Gallium には OpenGL API の機能が全て乗っているわけではない +- Cerium とのレンダリングの機能の違い + + - 光源、アルファブレンディング、etc.. + +- Cerium、Gallium ともにまだ開発段階 比較 - OpenGL ========================== -.. _OpenGL: http://www.opengl.org/ - -OpenGL_ - オープンソースの3Dグラフィックスプログラムインターフェース - -- ポリゴンの描画 - -.. raw:: html +OpenGL + オープンソースの3Dグラフィックスプログラムインターフェース - <div align="center" style="color: maroon; font-size: large;"> - // 線分3つ指定し、三角形を生成<br /> - glVertex3d(x1, y1, z1);<br /> - glVertex3d(x2, y2, z2);<br /> - glVertex3d(x3, y3, z3);<br /> - </div> - -- OpenGL での親子関係の表現 - - glPushMatrix(); - //現在処理してるオブジェクトの変換行列をスタックに登録 +- 変換行列、光源、カメラなどの API +- 親子関係の表現も可能 - makePolygon(); - //このオブジェクトは今まで Push された変換行列の影響を受ける - - glPopMatrix(); - //スタックから変換行列を取り出す - - -比較 - OpenGL (Con't) -========================== +Cerium での OpenGL の使用の問題 -レンダリングは Cerium Rendering Engine を用いて、 -ゲームオブジェクトの操作は OpenGL を用いることでゲーム開発は可能 - -- OpenGL が持つレンダリングドライバは使用せずに、オブジェクトの操作結果をポリゴンとして出力するためには、各オブジェクトの変換行列が必要 - - - 各オブジェクトのパラメータは変換行列が掛けられる前の状態を保持 +- SceneGraph の OpenGL の API にあわせるオーバーヘッド +- SceneGraph は自身の変換行列を持っている -- 変換行列は OpenGL が内部にもつ Matrix Stack に格納されている - -- Matrix Stack から、 :maroon:`各オブジェクトに対応する変換行列` を取り出す必要がある + - SceneGraph 単体でオブジェクトの操作は可能 -最初から自身の変換行列を持っている SceneGraph というデータ構造を用いれば、 -SPE 上でオブジェクトの操作から変換行列による更新まで一括して行える - +- SceneGraph だけで問題ない 比較 - OpenCL ===================== -**OpenCL** +**OpenCL** (2008年12月9日 策定) マルチコアCPUやGPU、その他のプロセッサによる、ヘテロジニアスコンピューティングのフレームワーク .. image:: images/cp_opencl_plat.jpg :align: center - :width: 300px + :width: 350px - Host から PE へ実行コマンドが送られる - Host や OpenCL Device はコマンドの管理を行う kernel を持つ @@ -457,6 +782,7 @@ - あらゆる Many Core Architecture に対応できるような汎用的な実装 - 開発環境にあわせた記述が必要 +- 現在、Cell 用に実装されたものは無い **Task Manager** @@ -464,7 +790,49 @@ - DMA によるメモリアクセスなど、決まった記述で開発できる - 大幅なコードの変更無く Mac OS X や Linux など複数の環境で動作させることが可能 -Task Manager は :maroon:`OpenCL による実装の一つ` と言える +Task Manager は :maroon:`OpenCLのような物の一つの実装` と言える - 学生が Cell アーキテクチャの理解、及び Cell プログラミングを行う際は Task Manager が適している + + +結論 +=============================== + +- :silver:`Cell アーキテクチャの概要` +- :silver:`Many Core プログラミングの特徴` +- :silver:`Task Manager の実装` +- :silver:`Cerium` +- :silver:`比較` +- :big:`まとめと今後の課題` + + +まとめ +========================= + +- 並列プログラミングのフレームワークとして + TaskManager を提案し、それを用いた、PS3ゲーム開発フレームワークである + Cerium を開発した + +- Cerium を用いれば、 + 学生が手を付けやすい環境(MacOSX、Linux)から開発を始め、 + コードの大幅な変更なく PS3 (Cell) での動作を確認できる + + +今後の課題 +======================= + +- SceneGraph の SPE 上での実行 + +- SIMD 演算の使用、もしくはそれに適したデータ構造の採用 + +- プログラムコードの SPE 上での On demand Load + + - 現在は予めコードを全て置いておく必要がある + +- レンダリングの機能の追加 + + - Z-sort + - アルファブレンディング + - 光源 +
--- a/presen/ui/default/gongo.css Sun Feb 15 11:44:57 2009 +0900 +++ b/presen/ui/default/gongo.css Sun Feb 15 22:39:02 2009 +0900 @@ -16,4 +16,8 @@ .small {font-size: medium;} +div.gongohighlight span.cp { color: #ffffff; } +div.gongohighlight span.n { color: #0000dd; } +div.gongohighlight span.nl { color: #dd00dd; } + * {font-family: Osaka, 'MS Pゴシック';} \ No newline at end of file